Kurz: živé streamování pomocí Media ServicesTutorial: Stream live with Media Services

Poznámka

I když tento kurz používá příklady sady .NET SDK , jsou obecné kroky stejné pro REST API, CLInebo jiné podporované sady SDK.Even though the tutorial uses .NET SDK examples, the general steps are the same for REST API, CLI, or other supported SDKs.

V Azure Media Services za zpracování obsahu živého streamování odpovídají živé události .In Azure Media Services, Live Events are responsible for processing live streaming content. Živá událost poskytuje vstupní koncový bod (adresa URL pro příjem), který pak poskytnete pro živý kodér.A Live Event provides an input endpoint (ingest URL) that you then provide to a live encoder. Živá událost přijímá živé vstupní datové proudy z kodéru Live a zpřístupňuje je pro streamování prostřednictvím jednoho nebo více koncových bodů streamování.The Live Event receives live input streams from the live encoder and makes it available for streaming through one or more Streaming Endpoints. Živé události také poskytují koncový bod verze Preview (adresa URL náhledu), který používáte k zobrazení náhledu a ověření datového proudu před dalším zpracováním a doručením.Live Events also provide a preview endpoint (preview URL) that you use to preview and validate your stream before further processing and delivery. Tento kurz ukazuje, jak použít .NET Core k vytvoření průchozího typu události v reálném čase.This tutorial shows how to use .NET Core to create a pass-through type of a live event.

V tomto kurzu získáte informace o následujících postupech:The tutorial shows you how to:

Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet před tím, než začnete.If you don't have an Azure subscription, create a free account before you begin.

PředpokladyPrerequisites

K dokončení kurzu potřebujete následující položky:The following items are required to complete the tutorial:

  • Nainstalujte Visual Studio Code nebo Visual Studio.Install Visual Studio Code or Visual Studio.
  • Vytvořte účet Media Services.Create a Media Services account.
    Nezapomeňte si pamatovat hodnoty, které používáte pro název skupiny prostředků a název účtu Media Services.Make sure to remember the values you use for the resource group name and Media Services account name.
  • Postupujte podle kroků v části přístup k rozhraní API Azure Media Services pomocí Azure CLI a přihlašovací údaje uložte.Follow the steps in Access Azure Media Services API with the Azure CLI and save the credentials. Budete je muset použít pro přístup k rozhraní API.You'll need to use them to access the API.
  • Fotoaparát nebo zařízení (jako laptop), které se používá k vysílání události.A camera or a device (like a laptop) that's used to broadcast an event.
  • On-premises Live Encoder, který převádí signály z kamery na datové proudy odeslané do Media Services služby živého streamování, najdete v tématu Doporučené místní živé kodéry.An on-premises live encoder that converts signals from the camera to streams that are sent to the Media Services live streaming service, see recommended on-premises live encoders. Datový proud musí být ve formátu RTMP nebo Smooth Streaming.The stream has to be in RTMP or Smooth Streaming format.

Tip

Než budete pokračovat, přečtěte si téma Živé streamování s Media Services v3.Make sure to review Live streaming with Media Services v3 before proceeding.

Stažení a konfigurace ukázkyDownload and configure the sample

Pomocí následujícího příkazu naklonujte do svého počítače úložiště GitHub s ukázkou streamování .NET:Clone a GitHub repository that contains the streaming .NET sample to your machine using the following command:

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

Ukázku živého streamování najdete ve složce Live (Živé).The live streaming sample is located in the Live folder.

Ve staženém projektu otevřete appsettings.js .Open appsettings.json in your downloaded project. Nahraďte hodnoty přihlašovacími údaji, které jste získali při přístupu k rozhraním API.Replace the values with the credentials you got from accessing APIs.

Důležité

Tato ukázka používá pro každý prostředek jedinečnou příponu.This sample uses a unique suffix for each resource. Pokud ladění zrušíte nebo ukončíte bez spuštění aplikace přes, skončíte s několika živými událostmi ve vašem účtu.If you cancel the debugging or terminate the app without running it through, you'll end up with multiple Live Events in your account.
Nezapomeňte zastavit běžící živé události.Make sure to stop the running Live Events. V opačném případě se vám bude účtovat!Otherwise, you'll be billed!

Kontrola kódu, který provádí živé streamováníExamine the code that performs live streaming

Tato část prozkoumává funkce definované v souboru Program.cs projektu MediaV3LiveApp.This section examines functions defined in the Program.cs file of the MediaV3LiveApp project.

Ukázka vytvoří jedinečnou příponu pro každý prostředek, aby nedošlo ke kolizi názvů, pokud spustíte ukázku několikrát bez vyčištění.The sample creates a unique suffix for each resource so that you don't have name collisions if you run the sample multiple times without cleaning up.

Důležité

Tato ukázka používá pro každý prostředek jedinečnou příponu.This sample uses a unique suffix for each resource. Pokud ladění zrušíte nebo ukončíte bez spuštění aplikace přes, skončíte s několika živými událostmi ve vašem účtu.If you cancel the debugging or terminate the app without running it through, you'll end up with multiple Live Events in your account.
Nezapomeňte zastavit běžící živé události.Make sure to stop the running Live Events. V opačném případě se vám bude účtovat!Otherwise, you'll be billed!

Začínáme s rozhraním API služby Media Services se sadou .NET SDKStart using Media Services APIs with .NET SDK

Pokud chcete začít používat rozhraní Media Services API se sadou .NET SDK, musíte vytvořit objekt AzureMediaServicesClient.To start using Media Services APIs with .NET, you need to create an AzureMediaServicesClient object. K vytvoření tohoto objektu, musíte zadat přihlašovací údaje, aby se klient mohl připojit k Azure pomocí Azure AD.To create the object, you need to supply credentials needed for the client to connect to Azure using Azure AD. V kódu, který jste naklonovali na začátku článku, vytvoří funkce GetCredentialsAsync objekt ServiceClientCredentials na základě pověření zadaných v místním konfiguračním souboru.In the code you cloned at the beginning of the article, the GetCredentialsAsync function creates the ServiceClientCredentials object based on the credentials supplied in local configuration file.

private static async Task<IAzureMediaServicesClient> CreateMediaServicesClientAsync(ConfigWrapper config)
{
    var credentials = await GetCredentialsAsync(config);

    return new AzureMediaServicesClient(config.ArmEndpoint, credentials)
    {
        SubscriptionId = config.SubscriptionId,
    };
}

Vytvoření živé událostiCreate a live event

V této části se dozvíte, jak vytvořit průchozí typ živé události (LiveEventEncodingType set to None).This section shows how to create a pass-through type of Live Event (LiveEventEncodingType set to None). Další informace o dostupných typech živých událostí naleznete v tématu typy událostí typu Live.For more information about the available types of Live Events, see Live Event types.

Některé věci, které byste mohli chtít zadat při vytváření živé události:Some things that you might want to specify when creating the live event are:

  • Media Services umístění.Media Services location.
  • Protokol streamování pro živou událost (aktuálně se podporují i protokoly RTMP a Smooth Streaming).The streaming protocol for the Live Event (currently, the RTMP and Smooth Streaming protocols are supported).
    Možnost protokolu se nedá změnit, když je spuštěná živá událost nebo její přidružený živý výstup.You can't change the protocol option while the Live Event or its associated Live Outputs are running. Pokud požadujete různé protokoly, vytvořte samostatnou živou událost pro každý protokol streamování.If you require different protocols, create separate Live Event for each streaming protocol.
  • Omezení IP adres u ingestování a náhledu.IP restrictions on the ingest and preview. Můžete definovat IP adresy, které můžou ingestovat video do této živé události.You can define the IP addresses that are allowed to ingest a video to this Live Event. Povolené IP adresy se dají zadat jako jedna IP adresa (třeba 10.0.0.1), rozsah IP adres pomocí IP adresy a masky podsítě CIDR (třeba 10.0.0.1/22) nebo rozsah IP adres a maska podsítě v desítkovém zápisu s tečkou (třeba 10.0.0.1(255.255.252.0)).Allowed IP addresses can be specified as either a single IP address (for example '10.0.0.1'), an IP range using an IP address and a CIDR subnet mask (for example, '10.0.0.1/22'), or an IP range using an IP address and a dotted decimal subnet mask (for example, '10.0.0.1(255.255.252.0)').
    Pokud nejsou zadané žádné IP adresy a není k dispozici žádná definice pravidla, nebude povolena žádná IP adresa.If no IP addresses are specified and there's no rule definition, then no IP address will be allowed. Pokud chcete povolit libovolnou IP adresy, vytvořte pravidlo a nastavte 0.0.0.0/0.To allow any IP address, create a rule and set 0.0.0.0/0.
    IP adresy musí být v jednom z následujících formátů: IpV4 adresa se čtyřmi čísly nebo rozsahem adres CIDR.The IP addresses have to be in one of the following formats: IpV4 address with four numbers or CIDR address range.
  • Při vytváření události můžete zadat automatické spuštění.When creating the event, you can specify to autostart it.
    Pokud je vlastnost autostart nastavena na hodnotu true, spustí se po vytvoření živá událost.When autostart is set to true, the Live Event will be started after creation. To znamená, že se fakturace začne ihned po spuštění živé události.That means the billing starts as soon as the Live Event starts running. Chcete-li zastavit další fakturaci, je nutné explicitně volat stop u prostředku živé události.You must explicitly call Stop on the Live Event resource to halt further billing. Další informace najdete v tématu stavy událostí Live a fakturace.For more information, see Live Event states and billing.
  • Aby se adresa URL pro ingestování mohla odhadnout, nastavte režim "individuální".For an ingest URL to be predictive, set the "vanity" mode. Podrobné informace najdete v tématu adresy URL pro příjem živých událostí.For detailed information, see Live Event ingest URLs.
Console.WriteLine($"Creating a live event named {liveEventName}");
Console.WriteLine();

// Note: When creating a LiveEvent, you can specify allowed IP addresses in one of the following formats:                 
//      IpV4 address with 4 numbers
//      CIDR address range

IPRange allAllowIPRange = new IPRange(
    name: "AllowAll",
    address: "0.0.0.0",
    subnetPrefixLength: 0
);

// Create the LiveEvent input IP access control.
LiveEventInputAccessControl liveEventInputAccess = new LiveEventInputAccessControl
{
    Ip = new IPAccessControl(
            allow: new IPRange[]
            {
                allAllowIPRange
            }
        )

};

// Create the LiveEvent Preview IP access control
LiveEventPreview liveEventPreview = new LiveEventPreview
{
    AccessControl = new LiveEventPreviewAccessControl(
        ip: new IPAccessControl(
            allow: new IPRange[]
            {
                allAllowIPRange
            }
        )
    )
};

// To get the same ingest URL for the same LiveEvent name:
// 1. Set vanityUrl to true so you have ingest like: 
//        rtmps://liveevent-hevc12-eventgridmediaservice-usw22.channel.media.azure.net:2935/live/522f9b27dd2d4b26aeb9ef8ab96c5c77           
// 2. Set accessToken to a desired GUID string (with or without hyphen)

LiveEvent liveEvent = new LiveEvent(
    location: mediaService.Location,
    description: "Sample LiveEvent for testing",
    vanityUrl: false,
    encoding: new LiveEventEncoding(
                // When encodingType is None, the service simply passes through the incoming video and audio layer(s) to the output
                // When the encodingType is set to Standard or Premium1080p, a live encoder is used to transcode the incoming stream
                // into multiple bit rates or layers. See https://go.microsoft.com/fwlink/?linkid=2095101 for more information
                encodingType: LiveEventEncodingType.None,
                presetName: null
            ),
    input: new LiveEventInput(LiveEventInputProtocol.RTMP, liveEventInputAccess),
    preview: liveEventPreview,
    streamOptions: new List<StreamOptionsFlag?>()
    {
        // Set this to Default or Low Latency
        // When using Low Latency mode, you must configure the Azure Media Player to use the 
        // quick start hueristic 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.
        StreamOptionsFlag.LowLatency
    }
);

Console.WriteLine($"Creating the LiveEvent, be patient this can take time...");

// When autostart is set to true, the Live Event will be started after creation. 
// That means, the billing starts as soon as the Live Event starts running. 
// You must explicitly call Stop on the Live Event resource to halt further billing.
// The following operation can sometimes take awhile. Be patient.
liveEvent = await client.LiveEvents.CreateAsync(config.ResourceGroup, config.AccountName, liveEventName, liveEvent, autoStart: true);

Získání ingestovaných adres URLGet ingest URLs

Jakmile se vytvoří živá událost, můžete získat adresy URL pro ingestování, které poskytnete kodéru Live.Once the Live Event is created, you can get ingest URLs that you'll provide to the live encoder. Kodér tyto adresy URL používá ke vkládání živého proudu.The encoder uses these URLs to input a live stream.

string ingestUrl = liveEvent.Input.Endpoints.First().Url;
Console.WriteLine($"The ingest url to configure the on premise encoder with is:");
Console.WriteLine($"\t{ingestUrl}");
Console.WriteLine();

Získání adresy URL náhleduGet the preview URL

Použijte previewEndpoint a vytvořte náhled a ověřte, že se skutečně přijímá vstup z kodéru.Use the previewEndpoint to preview and verify that the input from the encoder is actually being received.

Důležité

Než budete pokračovat, ujistěte se, že video přetéká do adresy URL náhledu.Make sure that the video is flowing to the Preview URL before continuing.

string previewEndpoint = liveEvent.Preview.Endpoints.First().Url;
Console.WriteLine($"The preview url is:");
Console.WriteLine($"\t{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($"\thttps://ampdemo.azureedge.net/?url={previewEndpoint}&heuristicprofile=lowlatency");
Console.WriteLine();

Vytváření a Správa živých událostí a živých výstupůCreate and manage Live Events and Live Outputs

Jakmile datový proud přetéká do živé události, můžete zahájit streamování událostí vytvořením Assetu, živého výstupu a lokátoru streamování.Once you have the stream flowing into the Live Event, you can begin the streaming event by creating an Asset, Live Output, and Streaming Locator. Datový proud se tak archivuje a zpřístupní se divákům prostřednictvím koncového bodu streamování.This will archive the stream and make it available to viewers through the Streaming Endpoint.

Vytvoření prostředkuCreate an Asset

Vytvořte Asset pro živý výstup, který se má použít.Create an Asset for the Live Output to use.

Console.WriteLine($"Creating an asset named {assetName}");
Console.WriteLine();
Asset asset = await client.Assets.CreateOrUpdateAsync(config.ResourceGroup, config.AccountName, assetName, new Asset());

Vytvořit živý výstupCreate a Live Output

Živé výstupy začínají při vytváření a při odstranění se zastaví.Live Outputs start on creation and stop when deleted. Když odstraníte živý výstup, neodstraníte základní Asset a obsah v assetu.When you delete the Live Output, you're not deleting the underlying Asset and content in the asset.

string manifestName = "output";
Console.WriteLine($"Creating a live output named {liveOutputName}");
Console.WriteLine();

LiveOutput liveOutput = new LiveOutput(assetName: asset.Name, manifestName: manifestName, archiveWindowLength: TimeSpan.FromMinutes(10));
liveOutput = await client.LiveOutputs.CreateAsync(config.ResourceGroup, config.AccountName, liveEventName, liveOutputName, liveOutput);

Vytvoření lokátoru streamováníCreate a Streaming Locator

Poznámka

Po vytvoření účtu Media Services se do vašeho účtu přidá výchozí koncový bod streamování ve stavu Zastaveno .When your Media Services account is created, a default streaming endpoint is added to your account in the Stopped state. Pokud chcete spustit streamování vašeho obsahu a využít výhod dynamického balení a dynamického šifrování, musí koncový bod streamování, ze kterého chcete streamovat obsah, být ve stavu spuštěno .To start streaming your content and take advantage of dynamic packaging and dynamic encryption, the streaming endpoint from which you want to stream content has to be in the Running state.

Když publikujete živý výstupní prostředek pomocí lokátoru streamování, bude se dál zobrazovat živá událost (až do délky okna DVR), dokud nevyprší platnost nebo odstranění lokátoru streamování, podle toho, co nastane dřív.When you publish the Live Output asset using a Streaming Locator, the Live Event (up to the DVR window length) will continue to be viewable until the Streaming Locator's expiry or deletion, whichever comes first.

Console.WriteLine($"Creating a streaming locator named {streamingLocatorName}");
Console.WriteLine();

StreamingLocator locator = new StreamingLocator(assetName: asset.Name, streamingPolicyName: PredefinedStreamingPolicy.ClearStreamingOnly);
locator = await client.StreamingLocators.CreateAsync(config.ResourceGroup, config.AccountName, streamingLocatorName, locator);

// Get the default Streaming Endpoint on the account
StreamingEndpoint streamingEndpoint = await client.StreamingEndpoints.GetAsync(config.ResourceGroup, config.AccountName, streamingEndpointName);

// If it's not running, Start it. 
if (streamingEndpoint.ResourceState != StreamingEndpointResourceState.Running)
{
    Console.WriteLine("Streaming Endpoint was Stopped, restarting now..");
    await client.StreamingEndpoints.StartAsync (config.ResourceGroup, config.AccountName, streamingEndpointName);
}

// Get the url to stream the output
ListPathsResponse paths = await client.StreamingLocators.ListPathsAsync(resourceGroupName, accountName, locatorName);

foreach (StreamingPath path in paths.StreamingPaths)
{
    UriBuilder uriBuilder = new UriBuilder();
    uriBuilder.Scheme = "https";
    uriBuilder.Host = streamingEndpoint.HostName;

    uriBuilder.Path = path.Paths[0];
    // Get the URL from the uriBuilder: uriBuilder.ToString()
}

Vyčištění zdrojů v účtu služby Media ServicesCleaning up resources in your Media Services account

Pokud jste dokončili streamování událostí a chcete vyčistit výše zřízené prostředky, postupujte podle následujících pokynů:If you're done streaming events and want to clean up the resources provisioned earlier, follow the following procedure:

  • Zastavte odesílání datového proudu z kodéru.Stop pushing the stream from the encoder.
  • Zastaví živou událost.Stop the Live Event. Jakmile se živá událost zastaví, neúčtují se žádné poplatky.Once the Live Event is stopped, it won't incur any charges. Když bude potřeba kanál znovu spustit, bude mít stejnou ingestovanou adresu URL, takže nebude nutné kodér znovu konfigurovat.When you need to start it again, it will have the same ingest URL so you won't need to reconfigure your encoder.
  • Pokud nechcete pokračovat v poskytování archivu živé události ve formě datového proudu na vyžádání, můžete koncový bod streamování zastavit.You can stop your Streaming Endpoint, unless you want to continue to provide the archive of your live event as an on-demand stream. Pokud je živá událost v zastaveném stavu, neúčtují se žádné poplatky.If the Live Event is in a stopped state, it won't incur any charges.
private static async Task CleanupLiveEventAndOutputAsync(IAzureMediaServicesClient client, string resourceGroup, string accountName, string liveEventName)
{
    try
    {
        LiveEvent liveEvent = await client.LiveEvents.GetAsync(resourceGroup, accountName, liveEventName);

        if (liveEvent != null)
        {
            if (liveEvent.ResourceState == LiveEventResourceState.Running)
            {
                // If the LiveEvent is running, stop it and have it remove any LiveOutputs
                await client.LiveEvents.StopAsync(resourceGroup, accountName, liveEventName, removeOutputsOnStop: true);
            }

            // Delete the LiveEvent
            await client.LiveEvents.DeleteAsync(resourceGroup, accountName, liveEventName);
        }
    }
    catch (ApiErrorException e)
    {
        Console.WriteLine("CleanupLiveEventAndOutputAsync -- Hit ApiErrorException");
        Console.WriteLine($"\tCode: {e.Body.Error.Code}");
        Console.WriteLine($"\tCode: {e.Body.Error.Message}");
        Console.WriteLine();
    }
}
private static async Task CleanupLocatorandAssetAsync(IAzureMediaServicesClient client, string resourceGroup, string accountName, string streamingLocatorName, string assetName)
{
    try
    {
        // Delete the Streaming Locator
        await client.StreamingLocators.DeleteAsync(resourceGroup, accountName, streamingLocatorName);

        // Delete the Archive Asset
        await client.Assets.DeleteAsync(resourceGroup, accountName, assetName);
    }
    catch (ApiErrorException e)
    {
        Console.WriteLine("CleanupLocatorandAssetAsync -- Hit ApiErrorException");
        Console.WriteLine($"\tCode: {e.Body.Error.Code}");
        Console.WriteLine($"\tCode: {e.Body.Error.Message}");
        Console.WriteLine();
    }
}

Sledování událostiWatch the event

Pokud chcete sledovat událost, zkopírujte adresu URL streamování, kterou jste dostali, když jste spustili kód popsaný v tématu Vytvoření lokátoru streamování.To watch the event, copy the streaming URL that you got when you ran code described in Create a Streaming Locator. Můžete použít přehrávač médií podle vašeho výběru.You can use a media player of your choice. Azure Media Player je k dispozici pro otestování streamu na https://ampdemo.azureedge.net .Azure Media Player is available to test your stream at https://ampdemo.azureedge.net.

Živá událost automaticky převádí události na obsah na vyžádání při zastavení.Live Event automatically converts events to on-demand content when stopped. I po zastavení a odstranění události můžou uživatelé streamovat archivovaný obsah jako video na vyžádání, pokud prostředek neodstraníte.Even after you stop and delete the event, users can stream your archived content as a video on demand for as long as you don't delete the asset. Prostředek se nedá odstranit, pokud ho používá událost. nejdříve je nutné odstranit událost.An asset can't be deleted if it's used by an event; the event must be deleted first.

Vyčištění prostředkůClean up resources

Pokud ze skupiny prostředků už žádné prostředky nepotřebujete, včetně účtu služby Media Services a účtu úložiště, které jste vytvořili v tomto kurzu, pak tuto dříve vytvořenou skupinu prostředků odstraňte.If you no longer need any of the resources in your resource group, including the Media Services and storage accounts you created for this tutorial, delete the resource group you created earlier.

Spusťte následující příkaz rozhraní příkazového řádku:Execute the following CLI command:

az group delete --name amsResourceGroup

Důležité

Ponechávání živých událostí při provozu se účtují náklady na fakturaci.Leaving the Live Event running incurs billing costs. Mějte na paměti, že pokud dojde k chybě projektu nebo programu nebo z jakéhokoli důvodu dojde k jeho zavření, může dojít k tomu, že živá událost běží ve stavu fakturace.Be aware, if the project/program crashes or is closed out for any reason, it could leave the Live Event running in a billing state.

Položte otázky, sdělte nám svůj názor, Získejte aktualizace.Ask questions, give feedback, get updates

Podívejte se na článek o komunitě Azure Media Services a podívejte se na různé způsoby, jak můžete klást otázky, sdělit svůj názor a získávat aktualizace Media Services.Check out the Azure Media Services community article to see different ways you can ask questions, give feedback, and get updates about Media Services.

Další krokyNext steps

Streamování souborůStream files