Tutorial: Transmisión en vivo con Media Services mediante .NET 7.0

Logotipo de Media Services v3


Advertencia

Azure Media Services se retirará el 30 de junio de 2024. Para obtener más información, consulte la Guía de retirada de AMS.

En Azure Media Services, los objetos LiveEvent son los responsables de procesar el contenido de streaming en vivo. Un evento en directo proporciona un punto de conexión de entrada (dirección URL de ingesta) que luego el usuario proporciona a un codificador en directo. El evento en directo recibe flujos de entrada del codificador en directo mediante los protocolos RTMP/S o Smooth Streaming y los pone a disposición de los puntos de conexión de streaming a través de uno o varios puntos de conexión de streaming. Los objetos LiveEvent también proporcionan un punto de conexión de vista previa (dirección URL de vista previa) que se puede utilizar para obtener una vista previa y validar el flujo antes de un procesamiento y entrega ulteriores.

En este tutorial se muestra cómo usar .NET 7.0 para crear un evento en directo de paso a través . Los eventos en directo de paso a través son útiles cuando tiene un codificador que es capaz de codificación alineada con varias velocidades de bits, GOP en el entorno local. Puede reducir los costos de la nube. Si desea reducir el ancho de banda y enviar una secuencia de velocidad de bits única a la nube para codificar varias velocidades de bits, puede usar un evento en directo de transcodificación con los valores preestablecidos de codificación 720P o 1080P.

En este tutorial:

  • Descargue un proyecto de ejemplo.
  • Examinar el código que realiza el streaming en vivo.
  • Ver el evento con Azure Media Player en el sitio de demostración de Media Player.
  • Configure Event Grid para supervisar el evento en directo.
  • Limpieza de recursos.

Requisitos previos

Para realizar este tutorial, necesitará los siguientes elementos:

También necesita estos elementos para el software de streaming en vivo:

  • Una cámara o un dispositivo (como un equipo portátil) que se utiliza para difundir un evento.
  • Codificador de software local que codifica la secuencia de la cámara y lo envía al servicio de streaming en vivo de Media Services a través del protocolo de mensajería de Real-Time (RTMP/S). Para más información, consulte Recommended live streaming encoders (Codificadores de streaming en vivo recomendados). La secuencia debe estar en formato RTMP/S o Smooth Streaming. En este ejemplo se supone que usará Open Broadcaster Software (OBS) Studio para difundir RTMP/S al punto de conexión de ingesta. Instale OBS Studio.
  • Como alternativa, puede probar el inicio rápido de OBS para probar todo el proceso con el Azure Portal primero.

Para supervisar el evento en directo mediante Event Grid y Event Hubs, puede: 1. Siga los pasos descritos en Creación y supervisión de eventos de Media Services con Event Grid mediante el Azure Portal o, 1. Siga los pasos que se indican al final de este tutorial en la sección Supervisión de eventos en directo mediante Event Grid y Event Hubs de este artículo.

Sugerencia

Antes de continuar, revise el artículo Streaming en directo con Media Services v3.

Descarga y configuración del ejemplo

Utilice el siguiente comando para clonar en la máquina el repositorio de GitHub que contiene el ejemplo de .NET de streaming en directo:

git clone https://github.com/Azure-Samples/media-services-v3-dotnet.git

El ejemplo de streaming en vivo se encuentra en la carpeta Live/LiveEventWithDVR .

Abra appsettings.json en el proyecto descargado. Reemplace los valores por nombre de cuenta, identificador de suscripción y nombre del grupo de recursos.

Importante

Este ejemplo utiliza un sufijo único para cada recurso. Si cancela la depuración o termina la aplicación sin ejecutarla, acabará con varios eventos en directo en la cuenta. Asegúrese de detener los eventos en directo que estén en ejecución. En caso contrario, se le facturará por ellos.

Empiece a usar las API de Media Services con el SDK de .NET.

Program.cs crea una referencia al recurso de cuenta de Media Services mediante las opciones de appsettings.json:

var mediaServicesResourceId = MediaServicesAccountResource.CreateResourceIdentifier(
    subscriptionId: options.AZURE_SUBSCRIPTION_ID.ToString(),
    resourceGroupName: options.AZURE_RESOURCE_GROUP,
    accountName: options.AZURE_MEDIA_SERVICES_ACCOUNT_NAME);
var credential = new DefaultAzureCredential(includeInteractiveCredentials: true);
var armClient = new ArmClient(credential);
var mediaServicesAccount = armClient.GetMediaServicesAccountResource(mediaServicesResourceId);

Creación de un evento en directo

En esta sección se muestra cómo crear un tipo de paso a través de un evento en directo (LiveEventEncodingType establecido en None). Para más información sobre los tipos disponibles, consulte Tipos de eventos en directo. Si desea reducir el ancho de banda total de ingesta o no tiene un transcodificador de velocidad de bits múltiple local, puede usar un evento de transcodificación en directo para la codificación en vivo de 720p o 1080p de codificación en la nube de velocidad de bits adaptable.

Es posible que quiera especificar lo siguiente al crear el evento en directo:

  • Protocolo de ingesta para el evento en directo. Actualmente, se admiten los protocolos RTMPS y Smooth Streaming. No se puede cambiar la opción de protocolo mientras se ejecuta el evento en directo. Si necesita otros protocolos, cree un evento en directo distinto para cada protocolo de streaming.

  • Restricciones de IP en la ingesta y vista previa. Puede definir las direcciones IP a las que se permite ingerir un vídeo en este evento en directo. Las direcciones IP permitidas se pueden especificar como una de estas opciones:

    • Una sola dirección IP (por ejemplo, 10.0.0.1 o 2001:db8::1)

    • Intervalo IP que usa una dirección IP y una máscara de subred de enrutamiento Inter-Domain sin clases (CIDR) (por ejemplo, 10.0.0.1/22 o 2001:db8::/48)

    • Intervalo IP que usa una dirección IP y una máscara de subred decimal con puntos (por ejemplo, 10.0.0.1 255.255.252.0)

      Si no se especifica ninguna dirección IP y no hay ninguna definición de regla, no se permitirá ninguna dirección IP. Para permitir cualquier dirección IP, cree una regla y establezca 0.0.0.0/0 y ::/0. Las direcciones IP deben estar en uno de los siguientes formatos: direcciones IPv4 o IPv6 con cuatro números o un intervalo de direcciones CIDR. Para obtener más información, consulte Restringir el acceso a la licencia DRM y la entrega de claves AES mediante listas de direcciones IP permitidas.

  • Inicio automático en un evento a medida que lo crea. Cuando el inicio automático se establece en true, el evento en directo se iniciará después de la creación. Es decir, la facturación comienza en cuanto el evento en directo empieza a ejecutarse. Debe llamar explícitamente a Stop en el recurso del evento en directo para evitar que se siga facturando. Para más información, consulte Estados y facturación de LiveEvent.

    También hay modos en espera disponibles para iniciar el evento en directo en un estado de "asignación" de menor costo que hace que sea más rápido pasar a un estado "en ejecución". Resulta útil para situaciones como grupos calientes que necesitan entregar canales rápidamente a los streamers.

  • Un nombre de host estático y un GUID único. Para que una dirección URL de ingesta sea predictiva y fácil de mantener en un codificador activo basado en hardware, establezca la useStaticHostname propiedad en true. Para más información, consulte Direcciones URL de ingesta de eventos en directo.

    var liveEvent = await mediaServicesAccount.GetMediaLiveEvents().CreateOrUpdateAsync(
        WaitUntil.Completed,
        liveEventName,
        new MediaLiveEventData(mediaServicesAccount.Get().Value.Data.Location)
        {
            Description = "Sample Live Event from the .NET SDK sample",
            UseStaticHostname = true,
            // 1) Set up the input settings for the Live event...
            Input = new LiveEventInput(streamingProtocol: LiveEventInputProtocol.Rtmp)
            {
                StreamingProtocol = LiveEventInputProtocol.Rtmp,
                AccessToken = "acf7b6ef-8a37-425f-b8fc-51c2d6a5a86a", // used to make the ingest URL unique
                KeyFrameIntervalDuration = TimeSpan.FromSeconds(2),
                IPAllowedIPs =
                {
                    new IPRange
                    {
                        Name = "AllowAllIpV4Addresses",
                        Address = IPAddress.Parse("0.0.0.0"),
                        SubnetPrefixLength = 0
                    },
                    new IPRange
                    {
                        Name = "AllowAllIpV6Addresses",
                        Address = IPAddress.Parse("0::"),
                        SubnetPrefixLength = 0
                    }
                }
            },
            // 2) Set the live event to use pass-through or cloud encoding modes...
            Encoding = new LiveEventEncoding()
            {
                EncodingType = LiveEventEncodingType.PassthroughBasic
            },
            // 3) Set up the Preview endpoint for monitoring
            Preview = new LiveEventPreview
            {
                IPAllowedIPs =
                {
                    new IPRange()
                    {
                        Name = "AllowAllIpV4Addresses",
                        Address = IPAddress.Parse("0.0.0.0"),
                        SubnetPrefixLength = 0
                    },
                    new IPRange()
                    {
                        Name = "AllowAllIpV6Addresses",
                        Address = IPAddress.Parse("0::"),
                        SubnetPrefixLength = 0
                    }
                }
            },
            // 4) Set up more advanced options on the live event. Low Latency is the most common one. Set
            //    this to Default or Low Latency. When using Low Latency mode, you must configure the Azure
            //    Media Player to use the quick start heuristic profile or you won't notice the change. In
            //    the AMP player client side JS options, set -  heuristicProfile: "Low Latency Heuristic
            //    Profile". To use low latency optimally, you should tune your encoder settings down to 1
            //    second GOP size instead of 2 seconds.
            StreamOptions =
            {
                StreamOptionsFlag.LowLatency
            },
            // 5) Optionally enable live transcriptions if desired. This is only supported on
            //    PassthroughStandard, and the transcoding live event types. It is not supported on Basic
            //    pass-through type.
            // WARNING: This is extra cost, so please check pricing before enabling.
            //Transcriptions =
            //{
            //    new LiveEventTranscription
            //    {
            //        // The value should be in BCP-47 format (e.g: 'en-US'). See https://go.microsoft.com/fwlink/?linkid=2133742
            //        Language = "en-us",
            //        TrackName = "English" // set the name you want to appear in the output manifest
            //    }
            //}
        },
        autoStart: false);
    

Obtención de direcciones URL de introducción

Una vez que se crea el evento en directo, puede obtener las direcciones URL de ingesta que se proporcionarán al codificador en directo. El codificador usa estas direcciones URL para introducir una secuencia en vivo.

// Get the RTMP ingest URL. The endpoints is a collection of RTMP primary and secondary,
// and RTMPS primary and secondary URLs.
Console.WriteLine($"The RTMP ingest URL to enter into OBS Studio is:");
Console.WriteLine(liveEvent.Data.Input.Endpoints.First(x => x.Uri.Scheme == "rtmps").Uri);
Console.WriteLine("Make sure to enter a Stream Key into the OBS Studio settings. It can be");
Console.WriteLine("any value or you can repeat the accessToken used in the ingest URL path.");
Console.WriteLine();

Obtención de la URL de vista previa

Use previewEndpoint para obtener una vista previa y comprobar que la entrada del codificador se está recibiendo.

Importante

Asegúrese de que el vídeo fluye a la dirección URL de vista previa antes de continuar.

// Use the previewEndpoint to preview and verify that the input from the encoder is actually
// being received The preview endpoint URL also support the addition of various format strings
// for HLS (format=m3u8-cmaf) and DASH (format=mpd-time-cmaf) for example. The default manifest
// is Smooth.
string previewEndpoint = liveEvent.Data.Preview.Endpoints.First().Uri.ToString();
Console.WriteLine($"The preview URL is:");
Console.WriteLine(previewEndpoint);
Console.WriteLine();
Console.WriteLine($"Open the live preview in your browser and use the Azure Media Player to monitor the preview playback:");
Console.WriteLine($"https://ampdemo.azureedge.net/?url={HttpUtility.UrlEncode(previewEndpoint)}&heuristicprofile=lowlatency");
Console.WriteLine();
Console.WriteLine("Start the live stream now, sending the input to the ingest URL and verify");
Console.WriteLine("that it is arriving with the preview URL.");
Console.WriteLine("IMPORTANT: Make sure that the video is flowing to the Preview URL before continuing!");
Console.WriteLine("Press enter to continue...");
Console.ReadLine();

Creación y administración de objetos LiveEvent y LiveOutput

Después de que la transmisión en directo desde el codificador local se transmita al evento en directo, puede comenzar el evento en directo mediante la creación de un recurso, una salida en vivo y un localizador de streaming. La secuencia se archiva y está disponible para los espectadores a través del punto de conexión de streaming.

La siguiente sección lo guiará por los pasos para crear el recurso y la salida en directo.

Creación de un recurso

Cree un recurso para la salida en directo que se usará.

// Create an Asset for the Live Output to use. Think of this as the "tape" that will be recorded
// to. The asset entity points to a folder/container in your Azure Storage account
Console.Write($"Creating the output Asset '{assetName}'...".PadRight(60));
var asset = (await mediaServicesAccount.GetMediaAssets().CreateOrUpdateAsync(
    WaitUntil.Completed,
    assetName,
    new MediaAssetData
    {
        Description = "My video description"
    })).Value;
Console.WriteLine("Done");

Creación de una salida en directo

Las salidas en directo se inician cuando se crean y se detienen cuando se eliminan. Al eliminar la salida en vivo, no va a eliminar el recurso de salida ni el contenido del recurso. El recurso con la grabación está disponible para el streaming a petición siempre que exista y haya un localizador de streaming asociado.

// Create the Live Output - think of this as the "tape recorder for the live event". Live
// outputs are optional, but are required if you want to archive the event to storage, use the
// asset for on-demand playback later, or if you want to enable cloud DVR time-shifting. We will
// use the asset created above for the "tape" to record to.
Console.Write($"Creating Live Output...".PadRight(60));
var liveOutput = (await liveEvent.GetMediaLiveOutputs().CreateOrUpdateAsync(
    WaitUntil.Completed,
    liveOutputName,
    new MediaLiveOutputData
    {
        AssetName = asset.Data.Name,
        // The HLS and DASH manifest file name. This is recommended to
        // set if you want a deterministic manifest path up front.
        // archive window can be set from 3 minutes to 25 hours.
        // Content that falls outside of ArchiveWindowLength is
        // continuously discarded from storage and is non-recoverable.
        // For a full event archive, set to the maximum, 25 hours.
        ManifestName = manifestName,
        ArchiveWindowLength = TimeSpan.FromHours(1)
    })).Value;
Console.WriteLine("Done");

Creación de un localizador de streaming

Nota

Cuando se crea la cuenta de Media Services, se agrega un punto de conexión de streaming predeterminado a la cuenta con estado detenido. Para iniciar la transmisión del contenido y aprovechar el empaquetado dinámico y el cifrado dinámico, el punto de conexión de streaming desde el que va a transmitir el contenido tiene que estar en estado de ejecución.

Para publicar un recurso, cree un localizador de streaming. El evento en directo (hasta la longitud de la ventana de DVR) se puede ver hasta la expiración o eliminación del localizador de streaming, lo que ocurra primero. Así es como haces que el vídeo esté disponible para que el público visualice en directo y a petición. La misma dirección URL se puede usar para watch el evento en directo, la ventana DVR o el recurso a petición cuando finaliza el evento en directo y se elimina la salida en directo.

var streamingLocator = (await mediaServicesAccount.GetStreamingLocators().CreateOrUpdateAsync(
    WaitUntil.Completed,
    streamingLocatorName,
    new StreamingLocatorData
    {
        AssetName = asset.Data.Name,
        StreamingPolicyName = "Predefined_ClearStreamingOnly",
        Filters =
        {
            filter.Data.Name
        }
    })).Value;

Visualización del evento

Ejecute el código. Use las direcciones URL de streaming de salida para watch el evento en directo. Copie la dirección URL del localizador de streaming. Puede usar el reproductor multimedia que quiera. Puede usar el sitio de demostración de Media Player para probar la secuencia. Escriba la dirección URL en el campo URL y seleccione Actualizar reproductor.

Supervisión de eventos en directo mediante Event Grid y Event Hubs

El proyecto de ejemplo puede usar Event Grid y Event Hubs para supervisar el evento en directo. Puede configurar y usar Event Grid mediante lo siguiente:

Para habilitar la supervisión:

  1. Use el Azure Portal para crear un espacio de nombres de Event Hubs y un centro de eventos
    1. Busque "Event Hubs" con el cuadro de texto situado en la parte superior del Azure Portal.
    2. Seleccione Centro de eventos en la lista y siga las instrucciones para crear un espacio de nombres de Event Hubs.
    3. Vaya al recurso espacio de nombres de Event Hubs.
    4. Seleccione Event Hubs en la sección Entidades del menú del portal.
    5. Cree una instancia de Event Hubs en el espacio de nombres de Event Hubs.
    6. Vaya al recurso de Event Hubs.
    7. Seleccione Control de acceso y , a continuación, Agregar asignación de roles.
    8. Seleccione el Azure Event Hubs receptor de datos y conceda el acceso a sí mismo.
    9. Seleccione Control de acceso y , a continuación, Agregar asignación de roles.
    10. Seleccione el Azure Event Hubs Remitente de datos y concédale a la identidad administrada creada para la cuenta de Media Services.
  2. Use el Azure Portal para crear una cuenta de Azure Storage.
    1. Después de crear la cuenta de almacenamiento, vaya al recurso Cuenta de almacenamiento.
    2. Seleccione Control de acceso y , a continuación, Agregar asignación de roles.
    3. Seleccione colaborador de datos de Storage Blob y conceda este acceso usted mismo.
  3. Creación de una suscripción de eventos
    1. Vaya a la cuenta de Media Services.
    2. Seleccione Eventos en el menú del portal.
    3. Seleccione + Suscripción de eventos.
    4. Escriba un nombre de suscripción y un nombre de artículo del sistema.
    5. Establezca el tipo de punto de conexión en Event Hub.
    6. Establezca Event Hubs en event Hubs creado anteriormente y establezca la identidad administrada en la identidad a la que se concedió acceso del remitente anteriormente a Event Hubs.
  4. Actualice el archivo appsetttings.json.
    1. Establezca EVENT_HUB_NAMESPACE en el nombre completo del espacio de nombres. Debe ser similar a myeventhub.servicebus.windows.net.
    2. Establezca EVENT_HUB_NAME.
    3. Establezca AZURE_STORAGE_ACCOUNT_NAME.

Vuelva a ejecutar el ejemplo. Con la integración de Event Hubs habilitada, el ejemplo registra eventos cuando el codificador se conecta y se desconecta del evento en directo. También se registran otros eventos.

Después de ejecutar el ejemplo, elimine Event Hubs y la cuenta de almacenamiento si ya no son necesarias.

Limpieza de los recursos en su cuenta de Media Services

Si se realizan eventos de streaming y quiere limpiar los recursos aprovisionados anteriormente, realice el procedimiento siguiente:

  1. Detenga el streaming desde el codificador.
  2. Detenga el evento en directo. Después de que el evento en directo se detenga, dejará de suponer un coste. Cuando necesite volver a iniciarla, se puede usar la misma dirección URL de ingesta para que no tenga que volver a configurar el codificador.
  3. Detenga el punto de conexión de streaming, a menos que desee seguir proporcionando el archivo del evento en directo como una secuencia a petición. Si el evento en directo se encuentra en estado detenido, dejará de suponer un costo.
if (liveOutput != null)
{
    Console.Write("Deleting the Live Output...".PadRight(60));
    await liveOutput.DeleteAsync(WaitUntil.Completed);
    Console.WriteLine("Done");
}

if (liveEvent?.Data.ResourceState == LiveEventResourceState.Running)
{
    Console.Write("Stopping the Live Event...".PadRight(60));
    await liveEvent.StopAsync(WaitUntil.Completed, new LiveEventActionContent() { RemoveOutputsOnStop = true });
    Console.WriteLine("Done");
}

if (liveEvent != null)
{
    Console.Write("Deleting the Live Event...".PadRight(60));
    await liveEvent.DeleteAsync(WaitUntil.Completed);
    Console.WriteLine("Done");
}

if (streamingLocator != null)
{
    Console.Write("Deleting the Streaming Locator...".PadRight(60));
    await streamingLocator.DeleteAsync(WaitUntil.Completed);
    Console.WriteLine("Done");
}

if (asset != null)
{
    Console.Write("Deleting the Asset...".PadRight(60));
    await asset.DeleteAsync(WaitUntil.Completed);
    Console.WriteLine("Done");
}

Limpieza de los recursos que sobran

Si ya no necesita las cuentas de almacenamiento y Media Services que creó para este tutorial, elimine el grupo de recursos que creó anteriormente.

Ejecute el siguiente comando de la CLI:


az group delete --name amsResourceGroup

Obtener ayuda y soporte técnico

Puede ponerse en contacto con Media Services con preguntas o seguir nuestras actualizaciones mediante uno de los métodos siguientes: