Oktatóanyag: Élő streamelés a Media Services szolgáltatással a .NET 7.0 használatával
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:
- Telepítse a Visual Studio Code-ot Windows/macOS/Linux vagy Visual Studio 2022 for Windows vagy Mac rendszeren.
- A .NET 7.0 SDK telepítése
-
Hozzon létre egy Media Services-fiókot. Ügyeljen arra, hogy a fióknév, az előfizetés-azonosító és az erőforráscsoport nevének API Access-adatait JSON formátumban másolja, vagy tárolja a Media Services-fiókhoz való csatlakozáshoz szükséges értékeket az ebben
appsettings.json
a fájlban használt JSON-fájlformátumban. - Kövesse az Azure Media Services API elérése az Azure CLI-vel című cikk lépéseit, és mentse a részleteket. Ebben a példában a fióknevet, az előfizetés azonosítóját és az erőforráscsoport nevét kell használnia, és be kell írnia őket a
appsettings.json
fájlba.
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.json
lehető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:
- Event Hubs-névtér és eseményközpontok létrehozása a Azure Portal használatával
- Keressen rá az "Event Hubs" kifejezésre a Azure Portal tetején található szövegmezővel.
- 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.
- Lépjen az Event Hubs-névtér erőforráshoz.
- A portál menüjének Entitások szakaszában válassza az Event Hubs lehetőséget.
- Hozzon létre egy Event Hubs-központot az Event Hubs-névtérben.
- Lépjen az Event Hubs erőforráshoz.
- 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.
- Válassza ki a Azure Event Hubs adatfogadót, majd adja meg a hozzáférést saját magának.
- 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.
- Válassza ki az Azure Event Hubs adatküldőt, majd adja meg a Media Services-fiókhoz létrehozott felügyelt identitásnak.
- Az Azure Portal használatával hozzon létre egy Azure Storage-fiókot.
- A tárfiók létrehozása után lépjen a Tárfiók erőforrásra.
- 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.
- 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.
- Esemény-előfizetés létrehozása
- Lépjen a Media Services-fiókhoz.
- A portál menüjében válassza az Események lehetőséget.
- Válassza a + Esemény-előfizetés lehetőséget.
- Adja meg az előfizetés nevét és a rendszercikk nevét.
- Állítsa a végponttípust a értékre
Event Hub
. - Á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
- Frissítse a
appsetttings.json
fájlt.- Állítsa EVENT_HUB_NAMESPACE a névtér teljes nevére. Ennek hasonlónak kell lennie a fájlhoz
myeventhub.servicebus.windows.net
. - Állítsa be a EVENT_HUB_NAME.
- Állítsa be a AZURE_STORAGE_ACCOUNT_NAME.
- Állítsa EVENT_HUB_NAMESPACE a névtér teljes nevére. Ennek hasonlónak kell lennie a fájlhoz
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:
- Állítsa le a streamelést a kódolóról.
- Á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.
- Á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:
- Q & A
-
Stack Overflow. Kérdések címkézése a következővel:
azure-media-services
. - @MSFTAzureMediavagy @AzureSupport használatával kérjen támogatást.
- Nyisson meg egy támogatási jegyet a Azure Portal keresztül.