Samouczek: przesyłanie strumieniowe na żywo z usługą Media Services przy użyciu platformy .NET 7.0

Logo usługi Media Services w wersji 3


Ostrzeżenie

Usługa Azure Media Services zostanie wycofana 30 czerwca 2024 r. Aby uzyskać więcej informacji, zobacz Przewodnik po wycofaniu usługi AMS.

W usłudze Azure Media Services wydarzenia na żywo są odpowiedzialne za przetwarzanie zawartości transmisji strumieniowej na żywo. Wydarzenie na żywo udostępnia punkt końcowy wejściowy (adres URL pozyskiwania), który następnie zostanie wyświetlony koder na żywo. Wydarzenie na żywo odbiera strumienie wejściowe z kodera na żywo przy użyciu protokołów RTMP/S lub Smooth Streaming i udostępnia je do przesyłania strumieniowego za pośrednictwem co najmniej jednego punktu końcowego przesyłania strumieniowego. Wydarzenia na żywo udostępniają również punkt końcowy w wersji zapoznawczej (adres URL wersji zapoznawczej) używany do wyświetlania podglądu i sprawdzania poprawności strumienia przed dalszym przetwarzaniem i dostarczaniem.

W tym samouczku pokazano, jak za pomocą platformy .NET 7.0 utworzyć wydarzenie na żywo z przekazywaniem . Zdarzenia przekazywane na żywo są przydatne, gdy masz koder, który może mieć wiele szybkości transmisji bitów, kodowanie wyrównywane przez usługę GOP lokalnie. Może to być sposób na zmniejszenie kosztów chmury. Jeśli chcesz zmniejszyć przepustowość i wysłać strumień o pojedynczej szybkości transmisji bitów do chmury na potrzeby kodowania o wielu szybkościach transmisji bitów, możesz użyć transkodowania wydarzenia na żywo z ustawieniami wstępnymi kodowania 720P lub 1080P.

W tym samouczku wykonasz następujące czynności:

  • Pobierz przykładowy projekt.
  • Sprawdź kod, który wykonuje transmisję strumieniową na żywo.
  • Obejrzyj wydarzenie za pomocą usługi Azure Media Player w witrynie demonstracyjnej usługi Media Player.
  • Skonfiguruj usługę Event Grid, aby monitorować wydarzenie na żywo.
  • Wyczyść zasoby.

Wymagania wstępne

Do ukończenia samouczka potrzebne są następujące elementy:

Potrzebne są również następujące elementy dla oprogramowania do transmisji strumieniowej na żywo:

  • Aparat lub urządzenie (na przykład laptop) używane do emisji wydarzenia.
  • Lokalny koder oprogramowania, który koduje strumień kamery i wysyła go do usługi Media Services live-streaming za pośrednictwem protokołu Real-Time Messaging Protocol (RTMP/S). Aby uzyskać więcej informacji, zobacz Zalecane lokalne kodery na żywo. Strumień musi być w formacie RTMP/S lub Smooth Streaming. W tym przykładzie założono, że użyjesz programu Open Broadcaster Software (OBS) Studio do emisji RTMP/S do punktu końcowego pozyskiwania. Zainstaluj program OBS Studio.
  • Alternatywnie możesz wypróbować przewodnik Szybki start usługi OBS, aby przetestować cały proces przy użyciu Azure Portal najpierw.

Aby monitorować wydarzenie na żywo przy użyciu usługi Event Grid i Event Hubs, możesz: 1. Wykonaj kroki opisane w temacie Tworzenie i monitorowanie zdarzeń usługi Media Services za pomocą usługi Event Grid przy użyciu Azure Portal lub 1. Wykonaj kroki w pobliżu końca tego samouczka w sekcji Monitorowanie zdarzeń na żywo przy użyciu usługi Event Grid i Event Hubs w tym artykule.

Pobieranie i konfigurowanie przykładu

Sklonuj repozytorium GitHub zawierające przykład platformy .NET do transmisji strumieniowej na żywo na maszynie przy użyciu następującego polecenia:

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

Przykład transmisji strumieniowej na żywo znajduje się w folderze Live/LiveEventWithDVR .

Otwórz appsettings.json w pobranym projekcie. Zastąp wartości nazwą konta, identyfikatorem subskrypcji i nazwą grupy zasobów.

Ważne

W tym przykładzie jest używany unikatowy sufiks dla każdego zasobu. Jeśli anulujesz debugowanie lub zakończysz działanie aplikacji bez jej uruchamiania, skończysz z wieloma wydarzeniami na żywo na koncie. Pamiętaj, aby zatrzymać uruchomione wydarzenia na żywo. W przeciwnym razie zostanie naliczona opłata!

Rozpoczynanie korzystania z interfejsów API usługi Media Services za pomocą zestawu SDK platformy .NET

Program.cs tworzy odwołanie do zasobu konta usługi Media Services przy użyciu opcji z appsettings.jsonpolecenia :

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

Utwórz wydarzenie na żywo

W tej sekcji pokazano, jak utworzyć typ przekazywanego zdarzenia na żywo (Typ liveEventEncodingType ustawiony na Wartość Brak). Aby uzyskać informacje o dostępnych typach, zobacz Typy zdarzeń na żywo. Jeśli chcesz zmniejszyć ogólną przepustowość pozyskiwania lub nie masz lokalnego transkodera o wielu szybkościach transmisji bitów, możesz użyć zdarzenia transkodowania na żywo dla 720p lub 1080p adaptacyjnego kodowania chmury o szybkości transmisji bitów.

Podczas tworzenia wydarzenia na żywo warto określić następujące kwestie:

  • Protokół pozyskiwania dla wydarzenia na żywo. Obecnie obsługiwane są protokoły RTMPS i Smooth Streaming. Nie można zmienić opcji protokołu podczas uruchamiania wydarzenia na żywo. Jeśli potrzebujesz różnych protokołów, utwórz oddzielne wydarzenie na żywo dla każdego protokołu przesyłania strumieniowego.

  • Ograniczenia adresów IP dotyczące pozyskiwania i podglądu. Możesz zdefiniować adresy IP, które mogą pozyskiwać wideo do tego wydarzenia na żywo. Dozwolone adresy IP można określić jako jedną z następujących opcji:

    • Pojedynczy adres IP (na przykład 10.0.0.1 lub 2001:db8::1)

    • Zakres adresów IP używający adresu IP i maski podsieci bez klas Inter-Domain routingu (CIDR) (na przykład 10.0.0.1/22 lub 2001:db8::/48)

    • Zakres adresów IP, który używa adresu IP i kropkowanej maski podsieci dziesiętnej (na przykład 10.0.0.1 255.255.252.0)

      Jeśli nie określono żadnych adresów IP i nie ma definicji reguły, żaden adres IP nie będzie dozwolony. Aby zezwolić na dowolny adres IP, utwórz regułę i ustaw wartość 0.0.0.0/0 i ::/0. Adresy IP muszą być w jednym z następujących formatów: adresy IPv4 lub IPv6 z czterema numerami lub zakresem adresów CIDR. Aby uzyskać więcej informacji, zobacz Ograniczanie dostępu do licencji DRM i dostarczania kluczy AES przy użyciu list dozwolonych adresów IP.

  • Autostart na zdarzeniu podczas jego tworzenia. Po ustawieniu wartości autostartu na wartość true wydarzenie na żywo rozpocznie się po utworzeniu. Oznacza to, że rozliczenia są uruchamiane natychmiast po rozpoczęciu wydarzenia na żywo. Aby zatrzymać dalsze rozliczenia, należy jawnie wywołać Stop zasób wydarzenia na żywo. Aby uzyskać więcej informacji, zobacz Stany i rozliczenia na żywo zdarzeń.

    Tryby wstrzymania są dostępne do uruchamiania wydarzenia na żywo w stanie "przydzielone" niższego kosztu, co sprawia, że szybsze przechodzenie do stanu uruchomionego. Jest to przydatne w sytuacjach, takich jak gorące pule, które muszą szybko przekazać kanały strumieniom.

  • Statyczna nazwa hosta i unikatowy identyfikator GUID. Aby adres URL pozyskiwania był predykcyjny i łatwiejszy w obsłudze koder na żywo oparty na sprzęcie, ustaw useStaticHostname właściwość na wartość true. Aby uzyskać szczegółowe informacje, zobacz Adresy URL pozyskiwania zdarzeń na żywo.

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

Pobieranie adresów URL pozyskiwania

Po utworzeniu wydarzenia na żywo można uzyskać adresy URL pozyskiwania, które zostaną podane koderowi na żywo. Koder używa tych adresów URL do wprowadzenia strumienia na żywo.

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

Pobieranie adresu URL podglądu

Użyj previewEndpoint polecenia , aby wyświetlić podgląd i sprawdzić, czy dane wejściowe z kodera są odbierane.

Ważne

Przed kontynuowaniem upewnij się, że film wideo jest przepływa do adresu URL podglądu.

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

Tworzenie wydarzeń na żywo i danych wyjściowych na żywo oraz zarządzanie nimi

Po transmisji strumieniowej na żywo z kodera lokalnego do wydarzenia na żywo można rozpocząć wydarzenie na żywo, tworząc element zawartości, dane wyjściowe na żywo i lokalizator przesyłania strumieniowego. Strumień jest archiwizowany i jest dostępny dla osób przeglądających za pośrednictwem punktu końcowego przesyłania strumieniowego.

Następna sekcja przeprowadzi proces tworzenia elementu zawartości i danych wyjściowych na żywo.

Tworzenie zasobu

Utwórz zasób dla danych wyjściowych na żywo do użycia.

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

Tworzenie danych wyjściowych na żywo

Dane wyjściowe na żywo zaczynają się po ich utworzeniu i zatrzymaniu po ich usunięciu. Po usunięciu danych wyjściowych na żywo nie usuwasz elementu zawartości wyjściowej ani zawartości w zasobie. Zasób z nagraniem jest dostępny dla przesyłania strumieniowego na żądanie, o ile istnieje i jest skojarzony z nim lokalizator przesyłania strumieniowego.

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

Tworzenie lokalizatora przesyłania strumieniowego

Uwaga

Po utworzeniu konta usługi Media Services domyślny punkt końcowy przesyłania strumieniowego zostanie dodany do konta w stanie zatrzymanym. Aby rozpocząć przesyłanie strumieniowe zawartości i korzystać z dynamicznego tworzenia pakietów i szyfrowania dynamicznego , punkt końcowy przesyłania strumieniowego, z którego chcesz przesyłać strumieniowo zawartość, musi znajdować się w stanie działania.

Element zawartości można opublikować, tworząc lokalizator przesyłania strumieniowego. Wydarzenie na żywo (do długości okna DVR) można wyświetlić do momentu wygaśnięcia lub usunięcia lokalizatora przesyłania strumieniowego, w zależności od tego, co nastąpi wcześniej. W ten sposób udostępnisz film wideo dla widzów, aby zobaczyć na żywo i na żądanie. Ten sam adres URL może służyć do watch wydarzenia na żywo, okna DVR lub zasobu na żądanie po zakończeniu wydarzenia na żywo i usunięciu danych wyjściowych na żywo.

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

Oglądanie wydarzenia

Uruchom kod. Użyj wyjściowych adresów URL przesyłania strumieniowego, aby watch wydarzenia na żywo. Skopiuj adres URL lokalizatora przesyłania strumieniowego. Możesz użyć wybranego odtwarzacza multimedialnego. Aby przetestować strumień, możesz użyć witryny demonstracyjnej usługi Media Player . Wprowadź adres URL w polu Adres URL i wybierz pozycję Aktualizuj odtwarzacz.

Monitorowanie zdarzeń na żywo przy użyciu usługi Event Grid i event hubs

Przykładowy projekt może używać usługi Event Grid i Event Hubs do monitorowania wydarzenia na żywo. Usługę Event Grid można skonfigurować i użyć, korzystając z poniższych

Aby włączyć monitorowanie:

  1. Używanie Azure Portal do tworzenia przestrzeni nazw usługi Event Hubs i usługi Event Hubs
    1. Wyszukaj ciąg "Event Hubs" przy użyciu pola tekstowego w górnej części Azure Portal.
    2. Wybierz pozycję Centrum zdarzeń z listy, a następnie postępuj zgodnie z instrukcjami, aby utworzyć przestrzeń nazw usługi Event Hubs.
    3. Przejdź do zasobu przestrzeni nazw usługi Event Hubs.
    4. Wybierz pozycję Event Hubs w sekcji Jednostki w menu portalu.
    5. Utwórz usługę Event Hubs w przestrzeni nazw usługi Event Hubs.
    6. Przejdź do zasobu usługi Event Hubs.
    7. Wybierz pozycję Kontrola dostępu , a następnie Dodaj, a następnie Dodaj przypisanie roli.
    8. Wybierz odbiornik danych Azure Event Hubs, a następnie przyznaj sobie dostęp.
    9. Wybierz pozycję Kontrola dostępu , a następnie Dodaj, a następnie Dodaj przypisanie roli.
    10. Wybierz Azure Event Hubs Nadawca danych, a następnie przyznaj mu tożsamość zarządzaną utworzoną dla konta usługi Media Services.
  2. Użyj Azure Portal, aby utworzyć konto usługi Azure Storage.
    1. Po utworzeniu konta magazynu przejdź do zasobu konta magazynu.
    2. Wybierz pozycję Kontrola dostępu , a następnie Dodaj, a następnie Dodaj przypisanie roli.
    3. Wybierz współautora danych obiektu blob usługi Storage , a następnie przyznaj sobie ten dostęp.
  3. Tworzenie subskrypcji zdarzeń
    1. Przejdź do konta usługi Media Services.
    2. Wybierz pozycję Zdarzenia z menu portalu.
    3. Wybierz pozycję + Subskrypcja zdarzeń.
    4. Wprowadź nazwę subskrypcji i nazwę artykułu systemowego.
    5. Ustaw typ punktu końcowego na Event Hub.
    6. Ustaw usługę Event Hubs na wcześniej utworzoną usługę Event Hubs i ustaw tożsamość zarządzaną na tożsamość, która została wcześniej udzielona nadawcy dostępu do usługi Event Hubs
  4. appsetttings.json Zaktualizuj plik.
    1. Ustaw EVENT_HUB_NAMESPACE na pełną nazwę przestrzeni nazw. Powinna być podobna do myeventhub.servicebus.windows.net.
    2. Ustaw EVENT_HUB_NAME.
    3. Ustaw AZURE_STORAGE_ACCOUNT_NAME.

Uruchom ponownie przykład. Po włączeniu integracji z usługą Event Hubs przykład rejestruje zdarzenia, gdy koder nawiązuje połączenie i rozłącza się z wydarzeniem na żywo. Rejestrowane są również różne inne zdarzenia.

Po uruchomieniu przykładu usuń usługę Event Hubs i konto magazynu, jeśli nie są już potrzebne.

Oczyszczanie zasobów na koncie usługi Media Services

Jeśli zostały wykonane zdarzenia przesyłania strumieniowego i chcesz wyczyścić zasoby aprowizowane wcześniej, wykonaj następującą procedurę:

  1. Zatrzymaj przesyłanie strumieniowe z kodera.
  2. Zatrzymaj wydarzenie na żywo. Po zatrzymaniu wydarzenia na żywo nie zostaną naliczone żadne opłaty. Gdy trzeba go ponownie uruchomić, można użyć tego samego adresu URL pozyskiwania, aby nie trzeba było ponownie konfigurować kodera.
  3. Zatrzymaj punkt końcowy przesyłania strumieniowego, chyba że chcesz nadal udostępniać archiwum wydarzenia na żywo jako strumień na żądanie. Jeśli wydarzenie na żywo jest w stanie zatrzymanym, nie spowoduje to naliczania żadnych opłat.
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");
}

Czyszczenie pozostałych zasobów

Jeśli nie potrzebujesz już kont usługi Media Services i magazynu utworzonych na potrzeby tego samouczka, usuń utworzoną wcześniej grupę zasobów.

Uruchom następujące polecenie interfejsu wiersza polecenia:


az group delete --name amsResourceGroup

Uzyskiwanie pomocy i obsługi technicznej

Możesz skontaktować się z usługą Media Services z pytaniami lub postępować zgodnie z naszymi aktualizacjami przy użyciu jednej z następujących metod: