Oktatóanyag: Élő streamelés a Media Services szolgáltatással a .NET 7.0 használatával

Media Services embléma v3


Figyelmeztetés

Az Azure Media Services 2024. június 30-án megszűnik. További információkért lásd az AMS kivezetési útmutatót.

Az Azure Media Servicesben az élő események az élő streamelési tartalmak feldolgozásáért felelősek. Az élő esemény egy bemeneti végpontot (betöltési URL-címet) biztosít, amelyet aztán megad egy élő kódolónak. Az élő esemény az RTMP/S vagy a Smooth Streaming protokoll használatával fogadja a bemeneti streameket az élő kódolótól, és elérhetővé teszi őket egy vagy több streamvégponton keresztüli streameléshez. Az élő események emellett egy előzetes verziójú végpontot (előzetes verziójú URL-címet) is biztosítanak, amellyel megtekintheti és ellenőrizheti a streamet a további feldolgozás és teljesítés előtt.

Ez az oktatóanyag bemutatja, hogyan hozhat létre átmenő élő eseményt a .NET 7.0 használatával. Az átmenő élő események akkor hasznosak, ha olyan kódolóval rendelkezik, amely képes többbites, GOP-hez igazított kódolásra a helyszínen. Ezzel csökkentheti a felhőköltségeket. Ha csökkenteni szeretné a sávszélességet, és egyetlen sávszélességű streamet szeretne küldeni a felhőbe a többbites kódoláshoz, használhat átkódolási élő eseményt a 720P vagy 1080P kódolási beállításokkal.

Az oktatóanyagban a következőket végezheti el:

  • Mintaprojekt letöltése.
  • Vizsgálja meg az élő streamelést végző kódot.
  • Tekintse meg az eseményt az Azure Media Playerrel a Media Player bemutatówebhelyén.
  • Állítsa be az Event Gridet az élő esemény figyeléséhez.
  • Az erőforrások eltávolítása.

Előfeltételek

Az oktatóanyag elvégzéséhez a következő elemekre van szüksége:

Ezekre az elemekre az élő streamelési szoftverekhez is szüksége van:

  • Egy eseményközvetítéshez használt kamera vagy eszköz (például laptop).
  • Egy helyszíni szoftverkódoló, amely kódolja a kamerastreamet, és elküldi azt a Media Services élő streamelési szolgáltatásának a Real-Time Messaging Protocol (RTMP/S) protokollon keresztül. További információ: Ajánlott helyszíni élő kódolók. A streamnek RTMP/S vagy Smooth Streaming formátumúnak kell lennie. Ez a minta feltételezi, hogy az Open Broadcaster Software (OBS) Studióval közvetíti az RTMP/S-t a betöltési végpontra. Telepítse az OBS Studiót.
  • Másik lehetőségként kipróbálhatja az OBS gyorsútmutatót a teljes folyamat teszteléséhez a Azure Portal először.

Az élő esemény Event Grid és Event Hubs használatával történő monitorozásához a következőket teheti: 1. Kövesse a Media Services-események létrehozása és monitorozása az Event Griddel a Azure Portal vagy 1 használatával című témakör lépéseit. Kövesse az oktatóanyag végén található lépéseket a cikk Élő események monitorozása az Event Grid és az Event Hubs használatával című szakaszában.

Tipp

Mielőtt továbblép, tekintse át az élő streamelést a Media Services v3-val .

A minta letöltése és konfigurálása

Klónozza az élő streamelt .NET-mintát tartalmazó GitHub-adattárat a gépére a következő paranccsal:

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

Az élő streamelési minta a Live/LiveEventWithDVR mappában található.

Nyissa meg appsettings.json a letöltött projektben. Cserélje le az értékeket a fióknévre, az előfizetés azonosítójára és az erőforráscsoport nevére.

Fontos

Ez a minta minden erőforráshoz egyedi utótagot használ. Ha a hibakeresést megszakítja, vagy anélkül állítja le az alkalmazást, hogy nem futtatja azt, akkor a fiókjában több élő esemény is létrejön. Mindenképpen állítsa le a futó élő eseményeket. Ellenkező esetben a rendszer kiszámlázzuk!

A Media Services API-k használatának megkezdése a .NET SDK-val

Program.cs létrehoz egy hivatkozást a Media Services-fiók erőforrására a következő appsettings.jsonlehetőségek használatával:

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

Élő esemény létrehozása

Ez a szakasz bemutatja, hogyan hozhat létre átmenő típusú élő eseményt (a LiveEventEncodingType értéke Nincs). Az elérhető típusokkal kapcsolatos információkért lásd: Élő eseménytípusok. Ha csökkenteni szeretné a teljes betöltési sávszélességet, vagy nem rendelkezik helyszíni többbites átviteli kódolóval, használhat élő átkódolási eseményt 720p vagy 1080p adaptív sávszélességű felhőkódoláshoz.

Előfordulhat, hogy az élő esemény létrehozásakor a következő dolgokat szeretné megadni:

  • Az élő esemény betöltési protokollja. Jelenleg az RTMPS és a Smooth Streaming protokoll támogatott. Az élő esemény futása közben nem módosíthatja a protokollbeállítást. Ha különböző protokollokra van szüksége, hozzon létre egy külön élő eseményt minden streamelési protokollhoz.

  • IP-korlátozások a betöltési és az előzetes verzióra. Megadhatja azokat az IP-címeket, amelyek lehetővé tehetik a videó betöltését erre az élő eseményre. Az engedélyezett IP-címek az alábbi lehetőségek egyikeként adhatók meg:

    • Egyetlen IP-cím (például 10.0.0.1 vagy 2001:db8::1)

    • Ip-címet és osztály nélküli Inter-Domain útválasztási (CIDR) alhálózati maszkot (például 10.0.0.1/22 vagy 2001:db8:::/48) használó IP-címtartomány

    • IP-címet és pontozott decimális alhálózati maszkot használó IP-címtartomány (például 10.0.0.1 255.255.252.0)

      Ha nincs megadva IP-cím, és nincs szabálydefiníció, akkor az IP-cím nem lesz engedélyezve. Bármely IP-cím engedélyezéséhez hozzon létre egy szabályt, és állítsa be a 0.0.0.0/0 és a ::/0 értéket. Az IP-címeknek a következő formátumok egyikében kell lenniük: IPv4- vagy IPv6-címek négy számmal vagy CIDR-címtartománysal. További információ: A DRM-licenchez és az AES-kulcsok kézbesítésének korlátozása IP-engedélyezési listák használatával.

  • Automatikus indítás egy eseményen a létrehozáskor. Ha az automatikus indítás igaz értékre van állítva, az élő esemény a létrehozás után kezdődik. Ez azt jelenti, hogy a számlázás azonnal elindul, amint az élő esemény elindul. A további számlázás leállításához explicit módon fel kell hívnia Stop az élő esemény erőforrását. További információ: Élő eseményállapotok és számlázás.

    A készenléti üzemmódok alacsonyabb költségű "lefoglalt" állapotban indítják el az élő eseményt, így gyorsabban válthat futó állapotra. Olyan helyzetekben hasznos, mint a gyakori elérésű készletek, amelyeknek gyorsan ki kell adniuk a csatornákat a streamelőknek.

  • Egy statikus gazdagép neve és egy egyedi GUID. Ha egy betöltési URL-cím prediktív és könnyebben kezelhető egy hardveralapú élő kódolóban, állítsa a useStaticHostname tulajdonságot true (igaz) értékre. Részletes információkért lásd: Élő eseménybetöltési URL-címek.

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

A betöltési URL-címek beolvasása

Az élő esemény létrehozása után lekérheti az élő kódolónak megadott betöltési URL-címeket. A kódoló ezekre az URL-címekre küldi a bemeneti élő streamet.

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

Az előnézeti URL-cím lekérése

A használatával previewEndpoint megtekintheti és ellenőrizheti, hogy a kódoló bemenete megérkezik-e.

Fontos

A folytatás előtt győződjön meg arról, hogy a videó az előnézeti URL-címre halad.

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

Élő események és élő kimenetek létrehozása és kezelése

Miután a helyszíni kódoló élő adatfolyama streamelt az élő eseményre, elindíthatja az élő eseményt egy objektum, egy élő kimenet és egy streamelési lokátor létrehozásával. A stream archiválva van, és a streamvégponton keresztül érhető el a nézők számára.

A következő szakasz végigvezeti az objektum létrehozásán és az élő kimeneten.

Adategység létrehozása

Hozzon létre egy objektumot az élő kimenethez.

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

Élő kimenet létrehozása

Az élő kimenetek létrehozásakor kezdődnek, és a törlésükkor leállnak. Az élő kimenet törlésekor nem törli a kimeneti objektumot vagy tartalmat az objektumban. A felvételt tartalmazó eszköz igény szerinti streameléshez érhető el, amíg létezik, és van hozzá egy streamelési lokátor.

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

Streamelési lokátor létrehozása

Megjegyzés

A Media Services-fiók létrehozásakor a rendszer egy alapértelmezett streamvégpontot ad hozzá a fiókjához leállított állapotban. A tartalom streamelésének megkezdéséhez és a dinamikus csomagolás és a dinamikus titkosítás előnyeinek kihasználásához a streamvégpontnak, amelyről tartalmat szeretne streamelni, futó állapotban kell lennie.

Egy adategységet egy streamelési lokátor létrehozásával tehet közzé. Az élő esemény (a DVR-ablak hosszáig) a streamelési lokátor lejáratáig vagy törléséig tekinthető meg, attól függően, hogy melyik következik be először. Így teszi elérhetővé a videót a megtekintő közönség számára, hogy élőben és igény szerint láthassa. Ugyanez az URL-cím használható az élő esemény, a DVR ablak vagy az igény szerinti eszköz watch az élő esemény befejezésekor és az élő kimenet törlésekor.

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

Esemény megtekintése

Futtassa a kódot. Az élő esemény watch a kimeneti streamelési URL-címek használatával. Másolja ki a streamelési lokátor URL-címét. Használhat egy tetszőleges médialejátszót. A Media Player bemutatówebhelyén tesztelheti a streamet. Írja be az URL-címet az URL-mezőbe, és válassza a Lejátszó frissítése lehetőséget.

Élő események monitorozása az Event Grid és az Event Hubs használatával

A mintaprojekt az Event Grid és az Event Hubs használatával figyelheti az élő eseményt. Az Event Gridet az alábbi paranccsal állíthatja be és használhatja:

A figyelés engedélyezése:

  1. Event Hubs-névtér és eseményközpontok létrehozása a Azure Portal használatával
    1. Keressen rá az "Event Hubs" kifejezésre a Azure Portal tetején található szövegmezővel.
    2. Válassza az Eseményközpont elemet a listából, majd kövesse az utasításokat egy Event Hubs-névtér létrehozásához.
    3. Lépjen az Event Hubs-névtér erőforráshoz.
    4. A portál menüjének Entitások szakaszában válassza az Event Hubs lehetőséget.
    5. Hozzon létre egy Event Hubs-központot az Event Hubs-névtérben.
    6. Lépjen az Event Hubs erőforráshoz.
    7. Válassza a Hozzáférés-vezérlés , majd a Hozzáadás, majd a Szerepkör-hozzárendelés hozzáadása lehetőséget.
    8. Válassza ki a Azure Event Hubs adatfogadót, majd adja meg a hozzáférést saját magának.
    9. Válassza a Hozzáférés-vezérlés , majd a Hozzáadás, majd a Szerepkör-hozzárendelés hozzáadása lehetőséget.
    10. Válassza ki az Azure Event Hubs adatküldőt, majd adja meg a Media Services-fiókhoz létrehozott felügyelt identitásnak.
  2. Az Azure Portal használatával hozzon létre egy Azure Storage-fiókot.
    1. A tárfiók létrehozása után lépjen a Tárfiók erőforrásra.
    2. Válassza a Hozzáférés-vezérlés , majd a Hozzáadás, majd a Szerepkör-hozzárendelés hozzáadása lehetőséget.
    3. Válassza ki a Storage-blobadatok közreműködője lehetőséget, majd adja meg ezt a hozzáférést saját magának.
  3. Esemény-előfizetés létrehozása
    1. Lépjen a Media Services-fiókhoz.
    2. A portál menüjében válassza az Események lehetőséget.
    3. Válassza a + Esemény-előfizetés lehetőséget.
    4. Adja meg az előfizetés nevét és a rendszercikk nevét.
    5. Állítsa a végponttípust a értékre Event Hub.
    6. Állítsa az Event Hubsot a korábban létrehozott Event Hubsra, és állítsa a felügyelt identitást arra az identitásra, amely korábban hozzáférést kapott a feladónak az Event Hubshoz
  4. Frissítse a appsetttings.json fájlt.
    1. Állítsa EVENT_HUB_NAMESPACE a névtér teljes nevére. Ennek hasonlónak kell lennie a fájlhoz myeventhub.servicebus.windows.net.
    2. Állítsa be a EVENT_HUB_NAME.
    3. Állítsa be a AZURE_STORAGE_ACCOUNT_NAME.

Futtassa újra a mintát. Ha az Event Hubs-integráció engedélyezve van, a minta naplózza az eseményeket, amikor a kódoló csatlakozik és leválasztja az élő eseményt. A rendszer más eseményeket is naplóz.

A minta futtatása után törölje az Event Hubs-fiókot és a tárfiókot, ha már nincs rájuk szükség.

A Media Service-fiók erőforrásainak eltávolítása

Ha befejezte a streamelési eseményeket, és törölni szeretné a korábban kiépített erőforrásokat, használja az alábbi eljárást:

  1. Állítsa le a streamelést a kódolóról.
  2. Állítsa le az élő eseményt. Az élő esemény leállítása után nem kell fizetnie. Ha újra el kell indítania, ugyanazt a betöltési URL-címet használhatja, így nem kell újrakonfigurálnia a kódolót.
  3. Állítsa le a streamvégpontot, hacsak nem szeretné továbbra is igény szerinti streamként biztosítani az élő esemény archívumát. Ha az élő esemény leállított állapotban van, nem kell díjat fizetnie.
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");
}

A fennmaradó erőforrások törlése

Ha már nincs szüksége az oktatóanyaghoz létrehozott Media Services- és tárfiókokra, törölje a korábban létrehozott erőforráscsoportot.

Futtassa a következő parancssori felületi parancsot:


az group delete --name amsResourceGroup

Súgó és támogatás

Kérdéseket tehet fel a Media Serviceshez, vagy kövesse a frissítéseket az alábbi módszerek egyikével: