Självstudie: Strömma live med Media Services med hjälp av .NET 7.0

Media Services-logotyp v3


Varning

Azure Media Services dras tillbaka den 30 juni 2024. Mer information finns i AMS Pensionsguide.

I Azure Media Services ansvarar livehändelser för bearbetning av liveuppspelningsinnehåll. En livehändelse tillhandahåller en indataslutpunkt (inmatnings-URL) som du sedan anger för en livekodare. Livehändelsen tar emot indataströmmar från livekodaren med hjälp av RTMP/S- eller Smooth Streaming-protokollen och gör dem tillgängliga för direktuppspelning via en eller flera slutpunkter för direktuppspelning. Livehändelser tillhandahåller också en förhandsgranskningsslutpunkt (förhandsversions-URL) som du använder för att förhandsgranska och verifiera din dataström innan du bearbetar och levererar vidare.

Den här självstudien visar hur du använder .NET 7.0 för att skapa en direkthändelse . Direktsändningar är användbara när du har en kodare som kan hantera kodning med flera bithastigheter, gop-anpassad kodning lokalt. Det kan vara ett sätt att minska molnkostnaderna. Om du vill minska bandbredden och skicka en dataström med en enda bithastighet till molnet för kodning med flera bithastigheter kan du använda en livehändelse för transkodning med 720P- eller 1080P-kodningsförinställningar.

I de här självstudierna får du:

  • Ladda ned ett exempelprojekt.
  • Granska koden som utför liveuppspelning.
  • Titta på händelsen med Azure Media Player på Media Player-demowebbplatsen.
  • Konfigurera Event Grid för att övervaka livehändelsen.
  • Rensa resurser.

Förutsättningar

Du behöver följande för att slutföra självstudien:

Du behöver också dessa objekt för direktuppspelning av programvara:

  • En kamera eller en enhet (t.ex. en bärbar dator) som används för att sända en händelse.
  • En lokal programvarukodare som kodar din kameraström och skickar den till Media Services live-streamingtjänst via Real-Time Messaging Protocol (RTMP/S). Mer information finns i Rekommenderade lokala livekodare. Strömmen måste vara i RTMP/S- eller Smooth Streaming-format. Det här exemplet förutsätter att du använder Open Broadcaster Software (OBS) Studio för att sända RTMP/S till inmatningsslutpunkten. Installera OBS Studio.
  • Du kan också prova OBS-snabbstarten för att testa hela processen med Azure Portal först.

Om du vill övervaka livehändelsen med Event Grid och Event Hubs kan du: 1. Följ stegen i Skapa och övervaka Media Services-händelser med Event Grid med hjälp av Azure Portal eller 1. Följ stegen i slutet av den här självstudien i avsnittet Övervaka livehändelser med Event Grid och Event Hubs i den här artikeln.

Tips

Granska liveuppspelning med Media Services v3 innan du fortsätter.

Ladda ned och konfigurera exemplet

Klona GitHub-lagringsplatsen som innehåller det liveuppspelade .NET-exemplet på datorn med hjälp av följande kommando:

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

Liveuppspelningsexemplet finns i mappen Live/LiveEventWithDVR .

Öppna appsettings.json i det nedladdade projektet. Ersätt värdena med kontonamn, prenumerations-ID och resursgruppsnamnet.

Viktigt

Det här exemplet använder ett unikt suffix för varje resurs. Om du avbryter felsökningen eller avslutar appen utan att köra den, får du flera livehändelser i ditt konto. Se till att stoppa livehändelser som körs. Annars debiteras du!

Börja använda Media Services-API:er med .NET SDK

Program.cs skapar en referens till Media Services-kontoresursen med hjälp av alternativen från 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);

Skapa en livehändelse

Det här avsnittet visar hur du skapar en direkthändelsetyp (LiveEventEncodingType inställd på Ingen). Information om tillgängliga typer finns i Live-händelsetyper. Om du vill minska den totala inmatningsbandbredden, eller om du inte har en lokal transkodare med flera bithastigheter, kan du använda en live-omkodningshändelse för molnkodning med 720p eller 1 080p anpassningsbar bithastighet.

Du kanske vill ange följande när du skapar livehändelsen:

  • Inmatningsprotokollet för livehändelsen. För närvarande stöds RTMPS- och Smooth Streaming-protokollen. Du kan inte ändra protokollalternativet när livehändelsen körs. Om du behöver olika protokoll skapar du en separat livehändelse för varje direktuppspelningsprotokoll.

  • IP-begränsningar för inmatning och förhandsversion. Du kan definiera de IP-adresser som tillåts mata in en video till den här livehändelsen. Tillåtna IP-adresser kan anges som något av följande alternativ:

    • En enskild IP-adress (till exempel 10.0.0.1 eller 2001:db8::1)

    • Ett IP-intervall som använder en IP-adress och en CIDR-nätmask (Classless Inter-Domain Routing) (till exempel 10.0.0.1/22 eller 2001:db8::/48)

    • Ett IP-intervall som använder en IP-adress och en prickad decimalnätmask (till exempel 10.0.0.1 255.255.252.0)

      Om inga IP-adresser anges och det inte finns någon regeldefinition tillåts ingen IP-adress. Om du vill tillåta ip-adresser skapar du en regel och anger 0.0.0.0/0 och ::/0. IP-adresserna måste ha något av följande format: IPv4- eller IPv6-adresser med fyra nummer eller ett CIDR-adressintervall. Mer information finns i Begränsa åtkomsten till DRM-licens och AES-nyckelleverans med hjälp av IP-tillåtna listor.

  • Starta en händelse automatiskt när du skapar den. När autostarten är inställd på true startar livehändelsen när den har skapats. Det innebär att faktureringen startar så snart livehändelsen börjar köras. Du måste uttryckligen anropa Stop livehändelseresursen för att stoppa ytterligare fakturering. Mer information finns i Livehändelsetillstånd och fakturering.

    Väntelägen är tillgängliga för att starta livehändelsen i ett "allokerat" tillstånd med lägre kostnad som gör att det går snabbare att gå över till ett körningstillstånd. Det är användbart för situationer som heta pooler som snabbt behöver dela ut kanaler till streamers.

  • Ett statiskt värdnamn och ett unikt GUID. För att en inmatnings-URL ska vara förutsägande och enklare att underhålla i en maskinvarubaserad livekodare anger du useStaticHostname egenskapen till true. Detaljerad information finns i Url:er för livehändelsematning.

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

Hämta infognings-URL:er

När livehändelsen har skapats kan du hämta inmatnings-URL:er som du anger för livekodaren. Kodaren använder dessa URL:er för att mata in en direktsänd dataström.

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

Hämta förhandsgransknings-URL:en

Använd previewEndpoint för att förhandsgranska och kontrollera att indata från kodaren tas emot.

Viktigt

Kontrollera att videon flödar till förhandsgransknings-URL:en innan du fortsätter.

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

Skapa och hantera livehändelser och liveutdata

När liveströmmen från den lokala kodaren strömmas till livehändelsen kan du starta livehändelsen genom att skapa en tillgång, liveutdata och en positionerare för direktuppspelning. Strömmen arkiveras och är tillgänglig för tittare via slutpunkten för direktuppspelning.

I nästa avsnitt går vi igenom skapandet av tillgången och live-utdata.

Skapa en tillgång

Skapa en tillgång för liveutdata som ska användas.

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

Skapa liveutdata

Liveutdata startar när de skapas och stoppas när de tas bort. När du tar bort liveutdata tar du inte bort utdatatillgången eller innehållet i tillgången. Tillgången med inspelningen är tillgänglig för direktuppspelning på begäran så länge den finns och det finns en strömningslokaliserare associerad med den.

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

Skapa en positionerare för direktuppspelning

Anteckning

När ditt Media Services-konto skapas läggs en standardslutpunkt för direktuppspelning till i ditt konto i stoppat tillstånd. Om du vill börja strömma ditt innehåll och dra nytta av dynamisk paketering och dynamisk kryptering måste den slutpunkt för direktuppspelning som du vill strömma innehåll från vara i körningstillståndet.

Du publicerar en tillgång genom att skapa en positionerare för direktuppspelning. Livehändelsen (upp till DVR-fönsterlängden) kan visas tills strömningslokaliseraren upphör att gälla eller tas bort, beroende på vilket som inträffar först. Det är så du gör videon tillgänglig för visningspubliken att se live och på begäran. Samma URL kan användas för att watch livehändelsen, DVR-fönstret eller tillgången på begäran när livehändelsen är klar och liveutdata tas bort.

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

Titta på händelsen

Kör koden. Använd utdataströmnings-URL:er för att watch din livehändelse. Kopiera url:en för positioneraren för direktuppspelning. Du kan använda valfri mediespelare. Du kan använda Media Player-demowebbplatsen för att testa strömmen. Ange URL:en i fältet URL och välj Uppdatera spelare.

Övervaka livehändelser med Event Grid och Event Hubs

Exempelprojektet kan använda Event Grid och Event Hubs för att övervaka livehändelsen. Du kan konfigurera och använda Event Grid med hjälp av följande

Så här aktiverar du övervakning:

  1. Använd Azure Portal för att skapa Event Hubs-namnrymd och en händelsehubb
    1. Sök efter "Event Hubs" med textrutan överst i Azure Portal.
    2. Välj Händelsehubb i listan och följ sedan anvisningarna för att skapa ett Event Hubs-namnområde.
    3. Gå till Event Hubs-namnområdesresursen.
    4. Välj Event Hubs i avsnittet Entiteter på portalmenyn.
    5. Skapa en händelsehubb i Event Hubs-namnområdet.
    6. Gå till Event Hubs-resursen.
    7. Välj Åtkomstkontroll och sedan Lägg tillrolltilldelning.
    8. Välj Azure Event Hubs datamottagare och ge sedan åtkomst till dig själv.
    9. Välj Åtkomstkontroll och sedan Lägg tillrolltilldelning.
    10. Välj Azure Event Hubs datasändare och bevilja den sedan till den hanterade identitet som skapats för Media Services-kontot.
  2. Använd Azure Portal för att skapa ett Azure Storage-konto.
    1. När du har skapat lagringskontot navigerar du till lagringskontoresursen.
    2. Välj Åtkomstkontroll och sedan Lägg tillrolltilldelning.
    3. Välj Storage Blob Data-deltagare och ge sedan den här åtkomsten till dig själv.
  3. Skapa en händelseprenumeration
    1. Gå till Media Services-kontot.
    2. Välj Händelser på portalmenyn.
    3. Välj + Händelseprenumeration.
    4. Ange ett prenumerationsnamn och ett systemartikelnamn.
    5. Ange slutpunktstypen till Event Hub.
    6. Ange Event Hubs till de tidigare skapade händelsehubbarna och ange den hanterade identiteten till den identitet som tidigare beviljats avsändaråtkomst till händelsehubbarna
  4. appsetttings.json Uppdatera filen.
    1. Ange EVENT_HUB_NAMESPACE till namnområdets fullständiga namn. Det bör likna myeventhub.servicebus.windows.net.
    2. Ange EVENT_HUB_NAME.
    3. Ange AZURE_STORAGE_ACCOUNT_NAME.

Kör exemplet igen. När Event Hubs-integreringen är aktiverad loggar exemplet händelser när kodaren ansluter och kopplar från livehändelsen. Olika andra händelser loggas också.

När du har kört exemplet tar du bort Event Hubs och lagringskontot om de inte längre behövs.

Rensa resurser på ditt Media Services-konto

Om du är klar med strömmande händelser och vill rensa resurserna som etablerades tidigare använder du följande procedur:

  1. Stoppa direktuppspelning från kodaren.
  2. Stoppa livehändelsen. När livehändelsen har stoppats debiteras inga avgifter. När du behöver starta den igen kan samma inmatnings-URL användas så att du inte behöver konfigurera om kodaren.
  3. Stoppa slutpunkten för direktuppspelning, såvida du inte vill fortsätta att tillhandahålla arkivet för livehändelsen som en ström på begäran. Om livehändelsen är i ett stoppat tillstånd medför det inga avgifter.
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");
}

Rensa återstående resurser

Om du inte längre behöver de Media Services- och lagringskonton som du skapade för den här självstudien tar du bort resursgruppen som du skapade tidigare.

Kör följande CLI-kommando:


az group delete --name amsResourceGroup

Få hjälp och support

Du kan kontakta Media Services med frågor eller följa våra uppdateringar med någon av följande metoder: