Distribuzione di Live Streaming con Servizi multimediali di AzureDelivering Live Streaming with Azure Media Services

PanoramicaOverview

Servizi multimediali di Microsoft Azure offre API che inviano richieste a servizi multimediali per avviare operazioni, ad esempio creazione, avvio, arresto o eliminazione di un canale.Microsoft Azure Media Services offers APIs that send requests to Media Services to start operations (for example: create, start, stop, or delete a channel). Queste operazioni hanno un'esecuzione prolungata.These operations are long-running.

L'SDK di Servizi multimediali per .NET fornisce le API che inviano la richiesta e attendono il completamento dell'operazione (a livello interno, le API eseguono il polling dell'avanzamento dell'operazione a intervalli definiti).The Media Services .NET SDK provides APIs that send the request and wait for the operation to complete (internally, the APIs are polling for operation progress at some intervals). Ad esempio, quando si chiama channel.Start(), il metodo restituisce dopo l'avvio del canale.For example, when you call channel.Start(), the method returns after the channel is started. È possibile anche usare la versione asincrona: await channel.StartAsync(). Per informazioni sul modello asincrono basato su attività, vedere TAP.You can also use the asynchronous version: await channel.StartAsync() (for information about Task-based Asynchronous Pattern, see TAP). Le API che inviano una richiesta di operazione e quindi eseguono il polling dello stato fino al completamento dell'operazione vengono definite "metodi di polling".APIs that send an operation request and then poll for the status until the operation is complete are called “polling methods”. Tali metodi (in special modo la versione asincrona) sono consigliati per le applicazioni rich client e/o i servizi con stato.These methods (especially the Async version) are recommended for rich client applications and/or stateful services.

In alcuni scenari è possibile che un'applicazione non possa attendere una richiesta HTTP con esecuzione prolungata e sia necessario eseguire il polling manuale dell'avanzamento dell'operazione.There are scenarios where an application cannot wait for a long running http request and wants to poll for the operation progress manually. Un esempio tipico può essere un browser che interagisce con un servizio Web senza stato: quando il browser richiede di creare un canale, il servizio Web avvia un'operazione con esecuzione prolungata e restituisce l'ID operazione al browser.A typical example would be a browser interacting with a stateless web service: when the browser requests to create a channel, the web service initiates a long running operation and returns the operation ID to the browser. Il browser potrebbe quindi chiedere al servizio Web di ottenere lo stato dell'operazione in base all'ID.The browser could then ask the web service to get the operation status based on the ID. L'SDK di Servizi multimediali per .NET fornisce API che sono utili per questo scenario,The Media Services .NET SDK provides APIs that are useful for this scenario. definite "metodi di non polling",These APIs are called “non-polling methods”. che sono caratterizzati dal seguente criterio di denominazione: SendNomeOperazioneOperation, ad esempio SendCreateOperation.The “non-polling methods” have the following naming pattern: SendOperationNameOperation (for example, SendCreateOperation). I metodi SendNomeOperazioneOperation restituiscono l'oggetto IOperation. L'oggetto restituito contiene informazioni che consentono di tenere traccia dell'operazione.SendOperationNameOperation methods return the IOperation object; the returned object contains information that can be used to track the operation. I metodi SendNomeOperazioneOperationAsync restituiscono Task.The SendOperationNameOperationAsync methods return Task.

Attualmente, le classi seguenti supportano i metodi non polling: Channel, StreamingEndpoint e Program.Currently, the following classes support non-polling methods: Channel, StreamingEndpoint, and Program.

Per eseguire il polling dello stato delle operazioni, usare il metodo GetOperation sulla classe OperationBaseCollection.To poll for the operation status, use the GetOperation method on the OperationBaseCollection class. Usare gli intervalli seguenti per controllare lo stato dell'operazione: per le operazioni Channel e StreamingEndpoint, usare 30 secondi; per le operazioni Program, usare 10 secondi.Use the following intervals to check the operation status: for Channel and StreamingEndpoint operations, use 30 seconds; for Program operations, use 10 seconds.

Creare e configurare un progetto di Visual StudioCreate and configure a Visual Studio project

Configurare l'ambiente di sviluppo e popolare il file app.config con le informazioni di connessione, come descritto in Sviluppo di applicazioni di Servizi multimediali con .NET.Set up your development environment and populate the app.config file with connection information, as described in Media Services development with .NET.

EsempioExample

L'esempio seguente definisce una classe denominata ChannelOperations.The following example defines a class called ChannelOperations. Questa definizione di classe può essere un punto di partenza per la definizione di classe del servizio Web.This class definition could be a starting point for your web service class definition. Per esigenze di semplicità, negli esempi seguenti vengono usate le versioni non asincrone dei metodi.For simplicity, the following examples use the non-async versions of methods.

Nell'esempio viene inoltre illustrato il modo in cui il client potrebbe usare questa classe.The example also shows how the client might use this class.

Definizione della classe ChannelOperationsChannelOperations class definition

using Microsoft.WindowsAzure.MediaServices.Client;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Net;

/// <summary> 
/// The ChannelOperations class only implements 
/// the Channel’s creation operation. 
/// </summary> 
public class ChannelOperations
{
    // Read values from the App.config file.
    private static readonly string _AADTenantDomain =
        ConfigurationManager.AppSettings["AADTenantDomain"];
    private static readonly string _RESTAPIEndpoint =
        ConfigurationManager.AppSettings["MediaServiceRESTAPIEndpoint"];

    // Field for service context.
    private static CloudMediaContext _context = null;

    public ChannelOperations()
    {
        var tokenCredentials = new AzureAdTokenCredentials(_AADTenantDomain, AzureEnvironments.AzureCloudEnvironment);
        var tokenProvider = new AzureAdTokenProvider(tokenCredentials);

        _context = new CloudMediaContext(new Uri(_RESTAPIEndpoint), tokenProvider);
    }

    /// <summary>  
    /// Initiates the creation of a new channel.  
    /// </summary>  
    /// <param name="channelName">Name to be given to the new channel</param>  
    /// <returns>  
    /// Operation Id for the long running operation being executed by Media Services. 
    /// Use this operation Id to poll for the channel creation status. 
    /// </returns> 
    public string StartChannelCreation(string channelName)
    {
        var operation = _context.Channels.SendCreateOperation(
            new ChannelCreationOptions
            {
                Name = channelName,
                Input = CreateChannelInput(),
                Preview = CreateChannelPreview(),
                Output = CreateChannelOutput()
            });

        return operation.Id;
    }

    /// <summary> 
    /// Checks if the operation has been completed. 
    /// If the operation succeeded, the created channel Id is returned in the out parameter.
    /// </summary> 
    /// <param name="operationId">The operation Id.</param> 
    /// <param name="channel">
    /// If the operation succeeded, 
    /// the created channel Id is returned in the out parameter.</param>
    /// <returns>Returns false if the operation is still in progress; otherwise, true.</returns> 
    public bool IsCompleted(string operationId, out string channelId)
    {
        IOperation operation = _context.Operations.GetOperation(operationId);
        bool completed = false;

        channelId = null;

        switch (operation.State)
        {
            case OperationState.Failed:
                // Handle the failure. 
                // For example, throw an exception. 
                // Use the following information in the exception: operationId, operation.ErrorMessage.
                break;
            case OperationState.Succeeded:
                completed = true;
                channelId = operation.TargetEntityId;
                break;
            case OperationState.InProgress:
                completed = false;
                break;
        }
        return completed;
    }

    private static ChannelInput CreateChannelInput()
    {
        return new ChannelInput
        {
            StreamingProtocol = StreamingProtocol.RTMP,
            AccessControl = new ChannelAccessControl
            {
                IPAllowList = new List<IPRange>
                    {
                        new IPRange
                        {
                            Name = "TestChannelInput001",
                            Address = IPAddress.Parse("0.0.0.0"),
                            SubnetPrefixLength = 0
                        }
                    }
            }
        };
    }

    private static ChannelPreview CreateChannelPreview()
    {
        return new ChannelPreview
        {
            AccessControl = new ChannelAccessControl
            {
                IPAllowList = new List<IPRange>
                    {
                        new IPRange
                        {
                            Name = "TestChannelPreview001",
                            Address = IPAddress.Parse("0.0.0.0"),
                            SubnetPrefixLength = 0
                        }
                    }
            }
        };
    }

    private static ChannelOutput CreateChannelOutput()
    {
        return new ChannelOutput
        {
            Hls = new ChannelOutputHls { FragmentsPerSegment = 1 }
        };
    }
}

The client codeThe client code

ChannelOperations channelOperations = new ChannelOperations();
string opId = channelOperations.StartChannelCreation("MyChannel001");

string channelId = null;
bool isCompleted = false;

while (isCompleted == false)
{
    System.Threading.Thread.Sleep(TimeSpan.FromSeconds(30));
    isCompleted = channelOperations.IsCompleted(opId, out channelId);
}

// If we got here, we should have the newly created channel id.
Console.WriteLine(channelId);

Percorsi di apprendimento di Servizi multimedialiMedia Services learning paths

Altre informazioni sui percorsi di apprendimento di Servizi multimediali di Azure:Read about the Azure Media Services learning paths:

Fornire commenti e suggerimentiProvide feedback

Usare il forum di suggerimenti degli utenti per fornire commenti e suggerimenti su come migliorare Servizi multimediali di Azure.Use the User Voice forum to provide feedback and make suggestions on how to improve Azure Media Services. È anche possibile passare direttamente a una delle categorie seguenti:You also can go directly to one of the following categories: