Zelfstudie: Live streamen met Media Services met behulp van .NET 7.0

Media Services-logo v3


Waarschuwing

Azure Media Services wordt op 30 juni 2024 buiten gebruik gesteld. Zie de Handleiding voor buitengebruikstelling van AMS voor meer informatie.

In Azure Media Services zijn livegebeurtenissen verantwoordelijk voor het verwerken van live streaming-inhoud. Een livegebeurtenis biedt een invoereindpunt (opname-URL) dat u vervolgens aan een live-encoder opgeeft. De livegebeurtenis ontvangt invoerstromen van de live encoder met behulp van het RTMP/S- of Smooth Streaming-protocol en maakt deze beschikbaar voor streaming via een of meer streaming-eindpunten. Livegebeurtenissen bieden ook een preview-eindpunt (preview-URL) dat u gebruikt om een voorbeeld van uw stream te bekijken en te valideren voordat u verder wordt verwerkt en geleverd.

In deze zelfstudie ziet u hoe u .NET 7.0 gebruikt om een passthrough-livegebeurtenis te maken. Passthrough-livegebeurtenissen zijn handig wanneer u een encoder hebt die on-premises multi-bitrate, gop-uitgelijnde codering kan gebruiken. Het kan een manier zijn om de cloudkosten te verlagen. Als u de bandbreedte wilt verminderen en een enkele bitrate-stream naar de cloud wilt verzenden voor multi-bitrate codering, kunt u een live-transcoderingsgebeurtenis gebruiken met de coderingsinstellingen 720P of 1080P.

In deze zelfstudie leert u het volgende:

  • Download een voorbeeldproject.
  • De code controleren die live streamen uitvoert.
  • Bekijk de gebeurtenis met Azure Media Player op de media player-demosite.
  • Event Grid instellen om de livegebeurtenis te bewaken.
  • Resources opschonen.

Vereisten

U hebt de volgende items nodig om de zelfstudie te voltooien:

U hebt deze items ook nodig voor livestreamingsoftware:

  • Een camera of een apparaat (zoals een laptop) die wordt gebruikt om een gebeurtenis uit te zenden.
  • Een on-premises software-encoder waarmee uw camerastream wordt gecodeerd en verzonden naar de livestreamservice van Media Services via het Real-Time Messaging Protocol (RTMP/S). Zie Aanbevolen on-premises live encoders voor meer informatie. De stream moet de indeling RTMP/S of Smooth Streaming hebben. In dit voorbeeld wordt ervan uitgegaan dat u OBS Studio (Open Broadcaster Software) gebruikt om RTMP/S uit te zenden naar het opname-eindpunt. Installeer OBS Studio.
  • U kunt ook de OBS-snelstartgids proberen om eerst het hele proces te testen met de Azure Portal.

Voor het bewaken van de livegebeurtenis met behulp van Event Grid en Event Hubs kunt u het volgende doen: 1. Volg de stappen in Media Services-gebeurtenissen maken en bewaken met Event Grid met behulp van de Azure Portal of, 1. Volg de stappen aan het einde van deze zelfstudie in de sectie Livegebeurtenissen bewaken met Event Grid en Event Hubs van dit artikel.

Tip

Bekijk live streamen met Media Services v3 voordat u doorgaat.

Het voorbeeld downloaden en configureren

Kloon de GitHub-opslagplaats die het .NET-voorbeeld voor livestreaming naar uw computer bevat met behulp van de volgende opdracht:

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

Het voorbeeld van live streamen bevindt zich in de map Live/LiveEventWithDVR .

Open appsettings.json in het gedownloade project. Vervang de waarden door accountnaam, abonnements-id en de naam van de resourcegroep.

Belangrijk

In dit voorbeeld wordt een uniek achtervoegsel voor elke resource gebruikt. Als u de foutopsporing annuleert of de app beëindigt zonder deze uit te voeren, krijgt u meerdere livegebeurtenissen in uw account. Stop de actieve livegebeurtenissen. Anders worden er kosten in rekening gebracht.

Media Services-API's gebruiken met de .NET SDK

Program.cs maakt een verwijzing naar de Media Services-accountresource met behulp van de opties van 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);

Een livegebeurtenis maken

In deze sectie wordt beschreven hoe u een livegebeurtenis van het type passthrough maakt (LiveEventEncodingType ingesteld op Geen). Zie Typen livegebeurtenissen voor meer informatie over de beschikbare typen. Als u de totale bandbreedte voor opname wilt verminderen of als u geen on-premises multi-bitrate transcoder hebt, kunt u een live transcoderingsgebeurtenis gebruiken voor 720p- of 1080p adaptive bitrate cloudcodering.

U kunt het volgende opgeven wanneer u de livegebeurtenis maakt:

  • Het opnameprotocol voor de livegebeurtenis. Momenteel worden de protocollen RTMPS en Smooth Streaming ondersteund. U kunt de protocoloptie niet wijzigen terwijl de livegebeurtenis wordt uitgevoerd. Als u verschillende protocollen nodig hebt, maakt u een afzonderlijke livegebeurtenis voor elk streamingprotocol.

  • IP-beperkingen voor de opname en preview. U kunt de IP-adressen definiëren die een video voor deze livegebeurtenis mogen opnemen. Toegestane IP-adressen kunnen worden opgegeven als een van de volgende opties:

    • Eén IP-adres (bijvoorbeeld 10.0.0.1 of 2001:db8::1)

    • Een IP-bereik dat gebruikmaakt van een IP-adres en een CIDR-subnetmasker (Classless Inter-Domain Routing) (bijvoorbeeld 10.0.0.1/22 of 2001:db8::/48)

    • Een IP-bereik dat gebruikmaakt van een IP-adres en een subnetmasker met stippeltjes (bijvoorbeeld 10.0.0.1 255.255.252.0)

      Als geen IP-adressen zijn opgegeven en er geen regeldefinitie bestaat, zijn er geen IP-adressen toegestaan. Als u elk IP-adres wilt toestaan, maakt u een regel en stelt u 0.0.0.0/0 en ::/0 in. De IP-adressen moeten een van de volgende indelingen hebben: IPv4- of IPv6-adressen met vier getallen of een CIDR-adresbereik. Zie Toegang tot DRM-licentie en levering van AES-sleutels beperken met behulp van IP-acceptatielijsten voor meer informatie.

  • Automatisch starten op een gebeurtenis tijdens het maken ervan. Wanneer autostart is ingesteld op waar, wordt de livegebeurtenis gestart nadat deze is gemaakt. Dit betekent dat de facturering wordt gestart zodra de livegebeurtenis wordt uitgevoerd. U moet expliciet aanroepen Stop op de livegebeurtenisresource om verdere facturering te stoppen. Zie Statussen van livegebeurtenissen en facturering voor meer informatie.

    Stand-bymodi zijn beschikbaar om de livegebeurtenis te starten in een goedkopere 'toegewezen' status, waardoor u sneller naar een actieve status kunt gaan. Het is handig voor situaties zoals warme zwembaden waarin kanalen snel moeten worden uitgedeeld aan streamers.

  • Een statische hostnaam en een unieke GUID. Als u wilt dat een opname-URL voorspellend is en gemakkelijker te onderhouden is in een op hardware gebaseerde live encoder, stelt u de useStaticHostname eigenschap in op true. Zie URL's voor opname van livegebeurtenissen voor gedetailleerde informatie.

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

URL’s voor opnemen ophalen

Nadat de livegebeurtenis is gemaakt, kunt u url's voor opname ophalen die u aan de live-encoder opgeeft. Het coderingsprogramma gebruikt deze URL's voor het invoeren van een live stream.

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

De voorbeeld-URL ophalen

Gebruik previewEndpoint om een voorbeeld te bekijken en te controleren of de invoer van de encoder wordt ontvangen.

Belangrijk

Zorg ervoor dat de video naar de voorbeeld-URL stroomt voordat u doorgaat.

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

Livegebeurtenissen en live-uitvoer maken en beheren

Nadat de livestream van de on-premises encoder naar de livegebeurtenis is gestreamd, kunt u de livegebeurtenis starten door een asset, live-uitvoer en streaming-locator te maken. De stream wordt gearchiveerd en is beschikbaar voor kijkers via het streaming-eindpunt.

In de volgende sectie wordt het maken van de asset en de live-uitvoer besproken.

Een asset maken

Maak een asset voor de live-uitvoer die moet worden gebruikt.

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

Een live-uitvoer maken

Live-uitvoer wordt gestart wanneer ze worden gemaakt en stoppen wanneer ze worden verwijderd. Wanneer u de live-uitvoer verwijdert, verwijdert u de uitvoerasset of inhoud in de asset niet. De asset met de opname is beschikbaar voor streaming op aanvraag zolang deze bestaat en er een streaming-locator aan is gekoppeld.

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

Een streaming-locator te maken

Notitie

Wanneer uw Media Services-account is gemaakt, wordt er een standaardstreaming-eindpunt toegevoegd aan uw account met de status Gestopt. Als u uw inhoud wilt streamen en wilt profiteren van dynamische pakketten en dynamische versleuteling, moet het streaming-eindpunt van waaruit u inhoud wilt streamen, de status Actief hebben.

U publiceert een asset door een streaming-locator te maken. De livegebeurtenis (tot de lengte van het DVR-venster) kan worden weergegeven totdat de streaming-locator is verlopen of verwijderd, afhankelijk van wat zich het eerst voordoet. Op deze wijze maakt u de video beschikbaar voor uw kijkpubliek om live en op aanvraag te zien. Dezelfde URL kan worden gebruikt om de livegebeurtenis, het DVR-venster of de on-demand asset te watch wanneer de livegebeurtenis is voltooid en de live-uitvoer wordt verwijderd.

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

De gebeurtenis bekijken

Voer de code uit. Gebruik de uitvoerstreaming-URL's om uw livegebeurtenis te watch. Kopieer de URL van de streaming-locator. U kunt een speler van uw keuze gebruiken. U kunt de Media Player-demosite gebruiken om uw stream te testen. Voer de URL in het veld URL in en selecteer Speler bijwerken.

Livegebeurtenissen bewaken met Event Grid en Event Hubs

Het voorbeeldproject kan Event Grid en Event Hubs gebruiken om de livegebeurtenis te bewaken. U kunt Event Grid instellen en gebruiken met behulp van het volgende

Bewaking inschakelen:

  1. Gebruik de Azure Portal om een Event Hubs-naamruimte en een Event Hubs te maken
    1. Zoek naar 'Event Hubs' met behulp van het tekstvak boven aan de Azure Portal.
    2. Selecteer Event Hub in de lijst en volg de instructies om een Event Hubs-naamruimte te maken.
    3. Navigeer naar de Event Hubs-naamruimteresource.
    4. Selecteer Event Hubs in de sectie Entiteiten van het portalmenu.
    5. Maak een Event Hubs in de Event Hubs-naamruimte.
    6. Navigeer naar de Event Hubs-resource.
    7. Selecteer Toegangsbeheer , toevoegen en vervolgens Roltoewijzing toevoegen.
    8. Selecteer de Azure Event Hubs Gegevensontvanger en ververleent uzelf vervolgens toegang.
    9. Selecteer Toegangsbeheer , toevoegen en vervolgens Roltoewijzing toevoegen.
    10. Selecteer de Azure Event Hubs Afzender van gegevens en verkneer deze vervolgens aan de beheerde identiteit die is gemaakt voor het Media Services-account.
  2. Gebruik de Azure Portal om een Azure Storage-account te maken.
    1. Nadat u het opslagaccount hebt gemaakt, gaat u naar de resource Opslagaccount.
    2. Selecteer Toegangsbeheer , toevoegen en vervolgens Roltoewijzing toevoegen.
    3. Selecteer de Inzender voor opslagblobgegevens en ververleent uzelf deze toegang.
  3. Een gebeurtenisabonnement maken
    1. Navigeer naar het Media Services-account.
    2. Selecteer Gebeurtenissen in het menu van de portal.
    3. Selecteer + Gebeurtenisabonnement.
    4. Voer een abonnementsnaam en een naam van een systeemartikel in.
    5. Stel het eindpunttype in op Event Hub.
    6. Stel de Event Hubs in op de eerder gemaakte Event Hubs en stel de beheerde identiteit in op de identiteit die eerder afzendertoegang tot de Event Hubs heeft gekregen
  4. Werk het bestand bij appsetttings.json .
    1. Stel EVENT_HUB_NAMESPACE in op de volledige naam van de naamruimte. Deze moet vergelijkbaar zijn met myeventhub.servicebus.windows.net.
    2. Stel EVENT_HUB_NAME in.
    3. Stel AZURE_STORAGE_ACCOUNT_NAME in.

Voer het voorbeeld opnieuw uit. Als Event Hubs-integratie is ingeschakeld, registreert het voorbeeld gebeurtenissen wanneer de encoder verbinding maakt en de verbinding met de livegebeurtenis verbreekt. Verschillende andere gebeurtenissen worden ook geregistreerd.

Nadat u het voorbeeld hebt uitgevoerd, verwijdert u de Event Hubs en het opslagaccount als deze niet meer nodig zijn.

Resources in uw Media Services-account opschonen

Als u klaar bent met het streamen van gebeurtenissen en de eerder ingerichte resources wilt opschonen, gebruikt u de volgende procedure:

  1. Stop met streamen vanaf de encoder.
  2. Stop de livegebeurtenis. Nadat de livegebeurtenis is gestopt, worden er geen kosten in rekening gebracht. Wanneer u deze opnieuw moet starten, kan dezelfde opname-URL worden gebruikt, zodat u uw encoder niet opnieuw hoeft te configureren.
  3. Stop het streaming-eindpunt, tenzij u het archief van uw livegebeurtenis wilt blijven leveren als een stream op aanvraag. Als de livegebeurtenis is gestopt, worden er geen kosten in rekening gebracht.
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");
}

Resterende resources opschonen

Als u de Media Services- en opslagaccounts die u voor deze zelfstudie hebt gemaakt, niet meer nodig hebt, verwijdert u de resourcegroep die u eerder hebt gemaakt.

Voer de volgende CLI-opdracht uit:


az group delete --name amsResourceGroup

Help en ondersteuning

U kunt contact opnemen met Media Services als u vragen hebt of onze updates op een van de volgende manieren volgen: