Kurz: Živé streamování pomocí Media Services pomocí .NET 7.0

Logo Media Services v3


Upozornění

Služba Azure Media Services bude vyřazena 30. června 2024. Další informace najdete v průvodci vyřazením AMS.

Ve službě Azure Media Services jsou živé události zodpovědné za zpracování živého streamovaného obsahu. Živá událost poskytuje vstupní koncový bod (adresu URL ingestu), který pak poskytnete kodéru pro kódování v reálném čase. Živá událost přijímá vstupní streamy z kodéru pro kódování v reálném čase pomocí protokolů RTMP/S nebo Smooth Streaming a zpřístupňuje je pro streamování prostřednictvím jednoho nebo více koncových bodů streamování. Živé události také poskytují koncový bod preview (adresu URL verze Preview), který použijete k náhledu a ověření streamu před dalším zpracováním a doručením.

V tomto kurzu se dozvíte, jak pomocí rozhraní .NET 7.0 vytvořit průchozí živou událost. Předávací živé události jsou užitečné, pokud máte kodér, který je schopen kódování s více přenosovými rychlostmi a kódováním gop v místním prostředí. Může to být způsob, jak snížit náklady na cloud. Pokud chcete snížit šířku pásma a odeslat datový proud s jednou přenosovou rychlostí do cloudu pro kódování s více přenosovými rychlostmi, můžete použít překódování živé události s předvolbami kódování 720P nebo 1080P.

V tomto kurzu:

  • Stáhněte si ukázkový projekt.
  • Prozkoumejte kód, který provádí živé streamování.
  • Podívejte se na událost s Azure Media Playerem na ukázkovém webu Media Playeru.
  • Nastavte Event Grid pro monitorování živé události.
  • Vyčistěte prostředky.

Požadavky

K dokončení kurzu potřebujete následující položky:

Pro software pro živé streamování potřebujete také tyto položky:

  • Kamera nebo zařízení (třeba přenosný počítač), které slouží k vysílání události.
  • Místní softwarový kodér, který kóduje datový proud kamery a odesílá ho do služby živého streamování Media Services prostřednictvím protokolu RTMP/S (Real-Time Messaging Protocol). Další informace najdete v tématu Doporučené místní kodéry pro kódování v reálném čase. Stream musí být ve formátu RTMP/S nebo Smooth Streaming. Tato ukázka předpokládá, že k vysílání RTMP/S do koncového bodu ingestování použijete Open Broadcaster Software (OBS) Studio. Nainstalujte OBS Studio.
  • Případně můžete vyzkoušet rychlý start OBS a nejprve otestovat celý proces s Azure Portal.

Pokud chcete monitorovat živou událost pomocí služby Event Grid a Event Hubs, můžete: 1. Postupujte podle kroků v tématu Vytvoření a monitorování událostí Media Services pomocí služby Event Grid pomocí Azure Portal nebo 1. Postupujte podle kroků na konci tohoto kurzu v části Monitorování živých událostí pomocí služby Event Grid a Event Hubs v tomto článku.

Tip

Než budete pokračovat, projděte si živé streamování s Media Services v3 .

Stažení a konfigurace ukázky

Pomocí následujícího příkazu naklonujte úložiště GitHub, které obsahuje ukázku .NET s živým streamováním, do svého počítače:

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

Ukázka živého streamování je ve složce Live/LiveEventWithDVR .

Otevřete appsettings.json ve staženém projektu. Nahraďte hodnoty názvem účtu, ID předplatného a názvem skupiny prostředků.

Důležité

Tato ukázka používá jedinečnou příponu pro každý prostředek. Pokud zrušíte ladění nebo ukončíte aplikaci bez spuštění, skončíte ve svém účtu s několika živými událostmi. Nezapomeňte zastavit spuštěné živé události. V opačném případě se vám budou účtovat poplatky!

Zahájení používání rozhraní API služby Media Services se sadou .NET SDK

Program.cs vytvoří odkaz na prostředek účtu Media Services pomocí možností z 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);

Vytvoření živé události

V této části se dozvíte, jak vytvořit průchozí typ živé události (LiveEventEncodingType nastavený na hodnotu None). Informace o dostupných typech najdete v tématu Typy živých událostí. Pokud chcete snížit celkovou šířku pásma ingestování nebo nemáte místní transkodér s více přenosovými rychlostmi, můžete použít událost živého překódování pro cloudové kódování s adaptivní přenosovou rychlostí 720p nebo 1080p.

Při vytváření živé události můžete chtít zadat následující věci:

  • Protokol ingestování živé události. V současné době se podporují protokoly RTMPS a Smooth Streaming. Možnost protokolu není možné změnit, když je spuštěná živá událost. Pokud potřebujete různé protokoly, vytvořte pro každý protokol streamování samostatnou živou událost.

  • Omezení IP adres pro ingestování a verzi Preview. Můžete definovat IP adresy, kterým je povoleno ingestovat video k této živé události. Povolené IP adresy je možné zadat jako jednu z těchto možností:

    • Jedna IP adresa (například 10.0.0.1 nebo 2001:db8::1)

    • Rozsah IP adres, který používá IP adresu a masku podsítě CIDR (Classless Inter-Domain Routing) (například 10.0.0.1/22 nebo 2001:db8::/48)

    • Rozsah IP adres, který používá IP adresu a tečkovanou desetinnou masku podsítě (například 10.0.0.1 255.255.252.0)

      Pokud nejsou zadané žádné IP adresy a neexistuje žádná definice pravidla, nebude povolená žádná IP adresa. Pokud chcete povolit jakoukoli IP adresu, vytvořte pravidlo a nastavte 0.0.0.0/0 a ::/0. IP adresy musí být v jednom z následujících formátů: adresy IPv4 nebo IPv6 se čtyřmi čísly nebo rozsah adres CIDR. Další informace najdete v tématu Omezení přístupu k licencím DRM a doručování klíčů AES pomocí seznamů povolených IP adres.

  • Při vytváření události se automaticky sstartuje. Pokud je automatické spuštění nastavené na hodnotu true, živá událost se spustí po vytvoření. To znamená, že fakturace začne běžet hned po spuštění živé události. Pokud chcete zastavit další fakturaci, musíte explicitně volat Stop prostředek živé události. Další informace najdete v tématu Stavy a fakturace živých událostí.

    Pohotovostní režimy jsou k dispozici pro spuštění živé události v "přiděleném" stavu s nižšími náklady, který umožňuje rychlejší přechod do spuštěného stavu. Je to užitečné v situacích, jako jsou horké bazény, které potřebují rychle rozdávat kanály streamerům.

  • Název statického hostitele a jedinečný identifikátor GUID. Pokud chcete, aby adresa URL ingestování byla prediktivní a snadněji se udržovala v hardwarovém kodéru pro kódování v reálném čase, nastavte useStaticHostname vlastnost na hodnotu true. Podrobné informace najdete v tématu Adresy URL ingestu živých událostí.

    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);
    

Získání ingestovaných adres URL

Po vytvoření živé události můžete získat adresy URL ingestu, které zadáte kodéru pro kódování v reálném čase. Kodér tyto adresy URL používá ke vkládání živého proudu.

// 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();

Získání adresy URL náhledu

Slouží previewEndpoint k zobrazení náhledu a ověření přijetí vstupu z kodéru.

Důležité

Než budete pokračovat, ujistěte se, že video tokuje na adresu URL náhledu.

// 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();

Vytváření a správa živých událostí a živých výstupů

Po streamování živého streamu z místního kodéru do živé události můžete živou událost zahájit vytvořením prostředku, živého výstupu a lokátoru streamování. Stream se archivuje a je k dispozici divákům prostřednictvím koncového bodu streamování.

Další část vás provede vytvořením prostředku a živým výstupem.

Vytvoření prostředku

Vytvořte prostředek pro živý výstup, který se má použít.

// 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");

Vytvoření živého výstupu

Živé výstupy se spustí při vytvoření a zastaví se, když se odstraní. Když odstraníte živý výstup, neodstraníte výstupní prostředek ani obsah v prostředku. Asset se záznamem je k dispozici pro streamování na vyžádání, dokud existuje a je k němu přidružený lokátor streamování.

// 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");

Vytvoření lokátoru streamování

Poznámka

Po vytvoření účtu Media Services se do vašeho účtu přidá výchozí koncový bod streamování v zastaveném stavu. Pokud chcete začít streamovat obsah a využít výhod dynamického balení a dynamického šifrování, musí být koncový bod streamování, ze kterého chcete streamovat obsah, ve spuštěném stavu.

Asset publikujete vytvořením lokátoru streamování. Živou událost (až do délky okna DVR) je možné zobrazit až do vypršení platnosti nebo odstranění lokátoru streamování( podle toho, co nastane dříve). Je to způsob, jak zpřístupníte video cílové skupině, která ho sleduje, aby ho viděli živě a na vyžádání. Stejnou adresu URL můžete použít k watch živé události, okna DVR nebo prostředku na vyžádání, když se živá událost dokončí a živý výstup se odstraní.

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

Sledování události

Spusťte kód. K watch živé události použijte adresy URL pro výstupní streamování. Zkopírujte adresu URL lokátoru streamování. Můžete použít přehrávač médií podle svého výběru. K testování streamu můžete použít ukázkový web Media Playeru . Zadejte adresu URL do pole adresa URL a vyberte Aktualizovat hráče.

Monitorování živých událostí pomocí Event Gridu a Event Hubs

Ukázkový projekt může k monitorování živé události použít Event Grid a Event Hubs. Službu Event Grid můžete nastavit a používat pomocí následujících možností:

Povolení monitorování:

  1. Použití Azure Portal k vytvoření oboru názvů služby Event Hubs a služby Event Hubs
    1. Pomocí textového pole v horní části Azure Portal vyhledejte "Event Hubs".
    2. V seznamu vyberte Centrum událostí a pak podle pokynů vytvořte obor názvů služby Event Hubs.
    3. Přejděte k prostředku Obor názvů služby Event Hubs.
    4. V nabídce portálu v části Entity vyberte Event Hubs.
    5. Vytvořte službu Event Hubs v oboru názvů služby Event Hubs.
    6. Přejděte k prostředku Event Hubs.
    7. Vyberte Řízení přístupu , pak Přidat a pak Přidat přiřazení role.
    8. Vyberte Azure Event Hubs Příjemce dat a udělte přístup sami sobě.
    9. Vyberte Řízení přístupu , pak Přidat a pak Přidat přiřazení role.
    10. Vyberte Azure Event Hubs odesílatele dat a udělte ho spravované identitě vytvořené pro účet Media Services.
  2. K vytvoření účtu Azure Storage použijte Azure Portal.
    1. Po vytvoření účtu úložiště přejděte k prostředku Účtu úložiště.
    2. Vyberte Řízení přístupu , pak Přidat a pak Přidat přiřazení role.
    3. Vyberte Přispěvatel dat v objektech blob služby Storage a udělte tento přístup sami sobě.
  3. Vytvoření odběru událostí
    1. Přejděte na účet Media Services.
    2. V nabídce portálu vyberte Události .
    3. Vyberte + Odběr události.
    4. Zadejte název předplatného a název článku systému.
    5. Nastavte Typ koncového bodu na Event Hub.
    6. Nastavte službu Event Hubs na dříve vytvořenou službu Event Hubs a nastavte spravovanou identitu na identitu, která měla dříve udělený přístup odesílatele ke službě Event Hubs.
  4. Aktualizujte appsetttings.json soubor.
    1. Nastavte EVENT_HUB_NAMESPACE na úplný název oboru názvů. Měl by být podobný jako myeventhub.servicebus.windows.net.
    2. Nastavit EVENT_HUB_NAME.
    3. Nastavit AZURE_STORAGE_ACCOUNT_NAME.

Spusťte ukázku znovu. Když je povolená integrace služby Event Hubs, ukázka protokoluje události, když se kodér připojí k živé události a odpojí se od živé události. Protokolují se také různé další události.

Po spuštění ukázky odstraňte službu Event Hubs a účet úložiště, pokud už je nepotřebujete.

Vyčištění prostředků v účtu služby Media Services

Pokud jste dokončili streamování událostí a chcete vyčistit dříve zřízené prostředky, použijte následující postup:

  1. Zastavte streamování z kodéru.
  2. Zastavte živou událost. Po zastavení živé události se za ni nebudou účtovat žádné poplatky. Když ho potřebujete znovu spustit, můžete použít stejnou adresu URL ingestace, takže nebudete muset kodér znovu konfigurovat.
  3. Pokud nechcete dál poskytovat archiv živých událostí jako stream na vyžádání, zastavte koncový bod streamování. Pokud je živá událost v zastaveném stavu, nebudou se jí účtovat žádné poplatky.
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");
}

Vyčištění zbývajících prostředků

Pokud už nepotřebujete účty Media Services a úložiště, které jste vytvořili pro účely tohoto kurzu, odstraňte skupinu prostředků, kterou jste vytvořili dříve.

Spusťte následující příkaz rozhraní příkazového řádku:


az group delete --name amsResourceGroup

Získání nápovědy a podpory

Službu Media Services můžete kontaktovat s dotazy nebo můžete sledovat naše aktualizace jedním z následujících způsobů: