Tutorial: Livestreamen mit Media Services mithilfe von .NET 7.0

Media Services-Logo v3


Warnung

Azure Media Services wird am 30. Juni 2024 eingestellt. Weitere Informationen finden Sie im Leitfaden zur Einstellung von AMS.

In Azure Media Services sind Liveereignisse für die Verarbeitung von Livestreaminginhalten zuständig. Bei einem Liveereignis wird ein Eingabeendpunkt (Erfassungs-URL) bereitgestellt, den Sie dann für einen Liveencoder bereitstellen. Das Liveereignis empfängt Eingabestreams vom Liveencoder mithilfe der Protokolle RTMP/S oder Smooth Streaming und stellt sie für das Streaming über einen oder mehrere Streamingendpunkte zur Verfügung. Zudem stellen Liveereignisse einen Vorschauendpunkt (Vorschau-URL) bereit, mit dem Sie eine Vorschau des Streams anzeigen und überprüfen können, bevor Sie diesen weiter verarbeiten und übermitteln.

In diesem Tutorial erfahren Sie, wie Sie .NET 7.0 verwenden, um ein Passthrough-Liveereignis zu erstellen. Passthrough-Liveereignisse sind nützlich, wenn Sie über einen Encoder verfügen, der eine lokale GOP-codierung mit mehreren Bitraten ermöglicht. Dies kann eine Möglichkeit zur Senkung der Cloudkosten sein. Wenn Sie die Bandbreite reduzieren und einen Datenstrom mit einzeler Bitrate zur Codierung mit mehreren Bitraten an die Cloud senden möchten, können Sie ein Liveereignis mit den Codierungsvoreinstellungen 720P oder 1080P verwenden.

In diesem Lernprogramm lernen Sie Folgendes:

  • Laden Sie ein Beispielprojekt herunter.
  • Untersuchen des Codes für das Livestreaming
  • Ansehen des Ereignisses mit Azure Media Player auf der Media Player-Demowebsite
  • Richten Sie Event Grid ein, um das Liveereignis zu überwachen.
  • Bereinigen der Ressourcen

Voraussetzungen

Für dieses Tutorial benötigen Sie Folgendes:

Sie benötigen auch diese Elemente für Livestreaming-Software:

  • Eine Kamera oder ein Gerät (beispielsweise ein Laptop) zum Übertragen eines Ereignisses.
  • Ein lokaler Softwareencoder, der Ihren Kameradatenstrom codiert und über das Real-Time Messaging Protocol (RTMP/S) an den Media Services-Livestreamingdienst sendet. Weitere Informationen finden Sie unter Empfohlene lokale Liveencoder. Der Stream muss im RTMP/S- oder Smooth Streaming-Format vorliegen. In diesem Beispiel wird davon ausgegangen, dass Sie Open Broadcaster Software (OBS) Studio verwenden, um RTMP/S an den Erfassungsendpunkt zu übertragen. Installieren Sie OBS Studio.
  • Alternativ können Sie den OBS-Schnellstart ausprobieren, um zuerst den gesamten Prozess mit dem Azure-Portal zu testen.

Für die Überwachung des Liveereignisses mit Event Grid und Event Hubs können Sie folgendes ausführen: 1. Führen Sie die Schritte unter Erstellen und Überwachen von Media Services-Ereignissen mit Event Grid mithilfe der Azure-Portal oder 1 aus. Führen Sie die Schritte am Ende dieses Tutorials im Abschnitt Überwachen von Liveereignissen mit Event Grid und Event Hubs dieses Artikels aus.

Tipp

Lesen Sie Livestreaming mit Azure Media Services v3, bevor Sie mit diesem Tutorial fortfahren.

Herunterladen und Konfigurieren des Beispiels

Klonen Sie mit dem folgenden Befehl das GitHub-Repository mit dem Beispiel für das Livestreaming mit .NET auf Ihren Computer:

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

Das Livestreamingbeispiel befindet sich im Ordner Live/LiveEventWithDVR .

Öffnen Sie appsettings.json in Ihrem heruntergeladenen Projekt. Ersetzen Sie die Werte durch Den Kontonamen, die Abonnement-ID und den Ressourcengruppennamen.

Wichtig

In diesem Beispiel wird für jede Ressourcen ein eindeutiges Suffix verwendet. Wenn Sie das Debuggen abbrechen oder die App beenden, ohne das Beispiel vollständig zu durchlaufen, werden in Ihrem Konto mehrere Liveereignisse generiert. Stellen Sie sicher, dass Sie die ausgeführten Liveereignisse beenden. Andernfalls fallen für die Ereignisse Kosten an!

Beginnen mit der Verwendung von Media Services-APIs mit dem .NET SDK

Program.cs erstellt mithilfe der Optionen von appsettings.jsoneinen Verweis auf die Media Services-Kontoressource:

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

Erstellen eines Liveereignisses

In diesem Abschnitt wird gezeigt, wie Sie einen Passthrough-Typ eines Liveereignisses erstellen (LiveEventEncodingType auf None festgelegt). Weitere Informationen zu den verfügbaren Typen finden Sie unter Liveereignistypen. Wenn Sie die Gesamtbandbreite der Erfassung reduzieren möchten oder keinen lokalen Multi-Bitrate-Transcoder haben, können Sie ein Livetranscodierungsereignis für die Cloudcodierung mit adaptiver Bitrate mit 720p oder 1080p verwenden.

Beim Erstellen des Liveereignisses können Sie beispielsweise Folgendes angeben:

  • Erfassungsprotokoll für das Liveereignis: Derzeit werden die Protokolle RTMPS und Smooth Streaming unterstützt. Sie können die Protokolloption nicht ändern, während das Liveereignis ausgeführt wird. Sollten Sie verschiedene Protokolle benötigen, erstellen Sie für jedes Streamingprotokoll ein separates Liveereignis.

  • IP-Einschränkungen für Erfassung und Vorschau: Sie können die IP-Adressen definieren, die ein Video für dieses Liveereignis erfassen dürfen. Zulässige IP-Adressen können als eine der folgenden Optionen angegeben werden:

    • Eine einzelne IP-Adresse (z. B. 10.0.0.1 oder 2001:db8::1)

    • Ein IP-Bereich, der eine IP-Adresse und eine CIDR-Subnetzmaske (Classless Inter-Domain Routing) verwendet (z. B. 10.0.0.1/22 oder 2001:db8::/48).

    • Ein IP-Bereich, der eine IP-Adresse und eine gepunktete Dezimalsubnetzmaske verwendet (z. B. 10.0.0.1 255.255.252.0)

      Wenn keine IP-Adressen angegeben sind und es keine Regeldefinition gibt, sind keine IP-Adressen zulässig. Um jede IP-Adresse zuzulassen, erstellen Sie eine Regel, und legen Sie 0.0.0.0/0 und ::/0 fest. Die IP-Adressen müssen in einem der folgenden Formate vorliegen: IPv4- oder IPv6-Adressen mit vier Zahlen oder einem CIDR-Adressbereich. Weitere Informationen finden Sie unter Einschränken des Zugriffs auf DIE DRM-Lizenz und die Übermittlung von AES-Schlüsseln mithilfe von IP-Zulassungslisten.

  • Autostart für ein Ereignis, während Sie es erstellen: Wenn autostart auf true festgelegt ist, beginnt das Liveereignis nach der Erstellung. Dies bedeutet, dass die Abrechnung beginnt, sobald die Ausführung des Liveereignisses startet. Sie müssen für die Liveereignisressource explizit Stop auswählen, damit keine weiteren Gebühren anfallen. Weitere Informationen finden Sie unter Zustandswerte von Liveereignissen und Abrechnung.

    Standbymodi sind verfügbar, um das Liveereignis in einem kostengünstigeren „zugeordneten“ Zustand zu starten, der den Wechsel in einen Ausführungszustand beschleunigt. Es ist nützlich für Situationen wie heiße Pools, die Kanäle schnell an Streamer verteilen müssen.

  • Ein statischer Hostname und eine eindeutige GUID: Damit eine Erfassungs-URL prädiktiv ist und in einem hardwarebasierten Liveencoder einfacher zu verwalten ist, legen Sie die useStaticHostname -Eigenschaft auf true fest. Ausführliche Informationen finden Sie unter Erfassungs-URLs für Liveereignisse.

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

Abrufen von Erfassungs-URLs

Nachdem das Liveereignis erstellt wurde, können Sie Erfassungs-URLs abrufen, um diese für den Liveencoder bereitzustellen. Diese URLs werden vom Encoder zur Eingabe eines Livedatenstroms verwendet.

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

Abrufen der Vorschau-URL

Rufen Sie mit previewEndpoint die Vorschau-URL ab, und überprüfen Sie, ob die Eingabe des Encoders empfangen wird.

Wichtig

Vergewissern Sie sich vor dem Fortfahren, dass das Video an die Vorschau-URL übertragen wird.

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

Erstellen und Verwalten von Liveereignissen und Liveausgaben

Nachdem der Livestream vom lokalen Encoder an das Liveereignis gestreamt wurde, können Sie das Liveereignis beginnen, indem Sie ein Medienobjekt, eine Liveausgabe und einen Streaminglocator erstellen. Der Stream wird archiviert und steht den Betrachtern über den Streamingendpunkt zur Verfügung.

Im nächsten Abschnitt wird die Erstellung des Medienobjekts und der Liveausgabe Schritt für Schritt beschrieben.

Erstellen eines Medienobjekts

Erstellen Sie ein Medienobjekt, das von der Liveausgabe verwendet werden kann.

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

Erstellen einer Liveausgabe

Liveausgaben beginnen, wenn sie erstellt werden, und enden, wenn sie gelöscht werden. Wenn Sie die Liveausgabe löschen, löschen Sie nicht das Ausgabeobjekt oder den Inhalt des Medienobjekts. Das Objekt mit der Aufzeichnung ist für das On-Demand-Streaming verfügbar, solange es vorhanden ist und ein Streaminglocator zugeordnet ist.

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

Erstellen Sie eines Streaminglocators

Hinweis

Beim Erstellen Ihres Media Services-Kontos wird dem Konto ein Standard-Streamingendpunkt im Zustand „Beendet“ hinzugefügt. Um mit dem Streamen Ihrer Inhalte zu beginnen und die dynamische Paketerstellung und dynamische Verschlüsselung zu nutzen, muss sich der Streamingendpunkt, von dem Sie Inhalte streamen möchten, im Zustand „Wird ausgeführt“ befinden.

Sie veröffentlichen ein Asset, indem Sie einen Streaminglocator erstellen. Das Liveereignis (bis zur Länge des DVR-Fensters) kann angezeigt werden, bis der Streaminglocator abläuft oder gelöscht wird, je nachdem, was zuerst eintritt. So stellen Sie das Video für Ihre Zuschauer zur Verfügung, um live und on demand zu sehen. Dieselbe URL kann verwendet werden, um das Liveereignis, das DVR-Fenster oder das On-Demand-Objekt zu watch, wenn das Liveereignis abgeschlossen und die Liveausgabe gelöscht wird.

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

Ansehen des Ereignisses

Führen Sie den Code aus. Verwenden Sie die Ausgabestreaming-URLs, um Ihr Liveereignis zu watch. Kopieren Sie die Streaminglocator-URL. Sie können einen Medienplayer Ihrer Wahl verwenden. Sie können die Media Player-Demowebsite verwenden, um Ihren Stream zu testen. Geben Sie die URL in das URL-Feld ein, und wählen Sie Player aktualisieren aus.

Überwachen von Liveereignissen mit Event Grid und Event Hubs

Das Beispielprojekt kann Event Grid und Event Hubs verwenden, um das Liveereignis zu überwachen. Sie können Event Grid wie folgt einrichten und verwenden:

So aktivieren Sie die Überwachung:

  1. Verwenden des Azure-Portal zum Erstellen eines Event Hubs-Namespaces und eines Event Hubs
    1. Suchen Sie mit dem Textfeld oben im Azure-Portal nach "Event Hubs".
    2. Wählen Sie Event Hub aus der Liste aus, und befolgen Sie dann die Anweisungen zum Erstellen eines Event Hubs-Namespaces.
    3. Navigieren Sie zur Ressource Event Hubs-Namespace.
    4. Wählen Sie im Abschnitt Entitäten des Portalmenüs die Option Event Hubs aus.
    5. Erstellen Sie ein Event Hubs-Objekt im Event Hubs-Namespace.
    6. Navigieren Sie zur Event Hubs-Ressource.
    7. Wählen Sie Zugriffssteuerung und dann Hinzufügen und dann Rollenzuweisung hinzufügen aus.
    8. Wählen Sie den Azure Event Hubs Datenempfänger aus, und gewähren Sie ihnen dann den Zugriff.
    9. Wählen Sie Zugriffssteuerung und dann Hinzufügen und dann Rollenzuweisung hinzufügen aus.
    10. Wählen Sie den Azure Event Hubs Datensender aus, und gewähren Sie sie der verwalteten Identität, die für das Media Services-Konto erstellt wurde.
  2. Verwenden Sie die Azure-Portal, um ein Azure Storage-Konto zu erstellen.
    1. Navigieren Sie nach dem Erstellen des Speicherkontos zur Ressource Speicherkonto.
    2. Wählen Sie Zugriffssteuerung und dann Hinzufügen und dann Rollenzuweisung hinzufügen aus.
    3. Wählen Sie den Mitwirkenden für Speicherblobdaten aus, und gewähren Sie ihnen diesen Zugriff.
  3. Erstellen eines Ereignisabonnements
    1. Navigieren Sie zum Media Services-Konto.
    2. Wählen Sie im Portalmenü Die Option Ereignisse aus.
    3. Klicken Sie auf + Ereignisabonnement.
    4. Geben Sie einen Abonnementnamen und einen Systemartikelnamen ein.
    5. Legen Sie den Endpunkttyp auf fest Event Hub.
    6. Legen Sie die Event Hubs auf die zuvor erstellten Event Hubs fest, und legen Sie die verwaltete Identität auf die Identität fest, die dem Absender zuvor Zugriff auf die Event Hubs gewährt wurde.
  4. Aktualisieren Sie die appsetttings.json-Datei.
    1. Legen Sie EVENT_HUB_NAMESPACE auf den vollständigen Namen des Namespace fest. Es sollte ähnlich sein wie myeventhub.servicebus.windows.net.
    2. Legen Sie EVENT_HUB_NAME fest.
    3. Legen Sie AZURE_STORAGE_ACCOUNT_NAME fest.

Führen Sie das Beispiel erneut aus. Wenn die Event Hubs-Integration aktiviert ist, protokolliert das Beispiel Ereignisse, wenn der Encoder eine Verbindung mit dem Liveereignis herstellt und trennt. Verschiedene andere Ereignisse werden ebenfalls protokolliert.

Nachdem Sie das Beispiel ausgeführt haben, löschen Sie die Event Hubs und das Speicherkonto, wenn sie nicht mehr benötigt werden.

Bereinigen von Ressourcen in Ihrem Media Services-Konto

Verwenden Sie das folgende Verfahren, wenn die Streamingereignisse beendet sind und Sie die zuvor bereitgestellten Ressourcen bereinigen möchten:

  1. Beenden Sie das Streaming vom Encoder.
  2. Beenden Sie das Liveereignis. Nach Beendigung des Liveereignisses fallen dafür keine weiteren Kosten an. Wenn Sie es erneut starten müssen, kann dieselbe Erfassungs-URL verwendet werden, sodass Sie Ihren Encoder nicht neu konfigurieren müssen.
  3. Beenden Sie den Streamingendpunkt, es sei denn, Sie möchten weiterhin das Archiv Ihres Liveereignisses als On-Demand-Stream bereitstellen. Wenn sich das Liveereignis im Zustand „Beendet“ befindet, fallen dafür keine weiteren Kosten an.
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");
}

Bereinigen der restlichen Ressourcen

Wenn Sie die Media Services- und Speicherkonten, die Sie für dieses Tutorial erstellt haben, nicht mehr benötigen, löschen Sie die zuvor erstellte Ressourcengruppe.

Führen Sie den folgenden CLI-Befehl aus:


az group delete --name amsResourceGroup

Anfordern von Hilfe und Support

Sie können Media Services mit Fragen kontaktieren oder unsere Updates mit einer der folgenden Methoden verfolgen: