kurz: Upload, kódování a streamování videí pomocí Media Services v3
hledáte dokumentaci k Media Services v2?
Poznámka
I když tento kurz používá příklady sady .NET SDK , jsou obecné kroky stejné pro REST API, CLInebo jiné podporované sady SDK.
Azure Media Services umožňuje kódování mediálních souborů ve formátech, které se přehrávají na nejrůznějších prohlížečích a zařízeních. Například můžete chtít svůj obsah streamovat ve formátu Apple HLS nebo MPEG DASH. Před streamováním je vhodné soubor digitálního média ve vysoké kvalitě zakódovat. Nápovědu k kódování naleznete v tématu Encoding koncept. V tomto kurzu se nahraje místní soubor videa a nahraný soubor se zakóduje. Obsah, který zpřístupníte prostřednictvím adresy URL protokolu HTTPS, můžete také kódovat. Další informace najdete v článku o vytvoření vstupu úlohy z adresy URL protokolu HTTP(S).

V tomto kurzu získáte informace o následujících postupech:
- Stáhněte si ukázkovou aplikaci popsanou v tématu.
- Projděte si kód, který nahrává, zakóduje a streamuje.
- Spusťte aplikaci.
- Otestujte adresu URL streamování.
- Vyčistěte prostředky.
Pokud ještě nemáte předplatné Azure,vytvořte si bezplatný účet před tím, než začnete.
Požadavky
- nainstalujte Visual Studio Code pro Windows/macOS/Linux nebo Visual Studio 2019 pro Windows nebo Mac.
- Nainstalovat sadu .net 5,0 SDK
- vytvořte účet Media Services. nezapomeňte zkopírovat podrobnosti přístupu k rozhraní API ve formátu JSON nebo uložit hodnoty potřebné pro připojení k účtu Media Services ve formátu souboru . env použitém v této ukázce.
- postupujte podle kroků v části přístup k rozhraní Azure Media Services API pomocí Azure CLI a přihlašovací údaje uložte. Budete je muset použít pro přístup k rozhraní API v této ukázce nebo zadat do formátu souboru . env .
Stažení a konfigurace ukázky
naklonujte úložiště GitHub s ukázkou streamování .net do vašeho počítače pomocí následujícího příkazu:
git clone https://github.com/Azure-Samples/media-services-v3-dotnet-tutorials.git
Ukázka se nachází ve složce UploadEncodeAndStreamFiles.
Otevřete appsettings.jsve stažených projektech. Nahraďte hodnoty přihlašovacími údaji, které jste získali z přístupu k rozhraním API.
Poznámka
Můžete také použít formát souboru .env v kořenovém adresáři projektu a nastavit proměnné prostředí jenom jednou pro všechny projekty v úložišti ukázek .NET. Stačí zkopírovat soubor sample.env a pak vyplnit informace, které jste získali ze stránky Media Services API Access v Azure Portal nebo z Azure CLI. Přejmenujte soubor sample.env na .env a použijte ho ve všech projektech.
Soubor .gitignore je už nakonfigurovaný tak, aby se zabránilo publikování tohoto souboru do vašeho forku úložiště.
Kontrola kódu, který provádí nahrávání, kódování a streamování
Tato část popisuje funkce definované v souboru Program.cs projektu UploadEncodeAndStreamFiles.
Tato ukázka provede následující akce:
- Vytvoří novou transformaci (nejprve zkontroluje, jestli Zadaná transformace existuje).
- Vytvoří výstupní Asset , který se používá jako výstup úlohy kódování.
- Vytvoří vstupní Asset a nahraje zadaný místní videosoubor do souboru. Prostředek se použije jako vstup úlohy.
- Odešle úlohu kódování pomocí vytvořeného vstupu a výstupu.
- Zkontroluje stav úlohy.
- Vytvoří Lokátor streamování.
- Vytvoří adresy URL pro streamování.
začínáme používat rozhraní api pro Media Services se sadou .net SDK
chcete-li začít používat rozhraní Media Services api s rozhraním .net, je nutné vytvořit AzureMediaServicesClient objekt. Chcete-li vytvořit objekt, je nutné zadat přihlašovací údaje klienta pro připojení k Azure pomocí Azure Active Directory. Další možností je použít interaktivní ověřování, které je implementováno v GetCredentialsInteractiveAuthAsync .
public static async Task<IAzureMediaServicesClient> CreateMediaServicesClientAsync(ConfigWrapper config, bool interactive = false)
{
ServiceClientCredentials credentials;
if (interactive)
credentials = await GetCredentialsInteractiveAuthAsync(config);
else
credentials = await GetCredentialsAsync(config);
return new AzureMediaServicesClient(config.ArmEndpoint, credentials)
{
SubscriptionId = config.SubscriptionId,
};
}
V kódu, který jste naklonoval na začátku článku, GetCredentialsAsync funkce vytvoří ServiceClientCredentials objekt na základě přihlašovacích údajů zadaných v místním konfiguračním souboru (appSettings. JSON) nebo pomocí souboru proměnných prostředí . env v kořenovém adresáři úložiště.
private static async Task<ServiceClientCredentials> GetCredentialsAsync(ConfigWrapper config)
{
// Use ConfidentialClientApplicationBuilder.AcquireTokenForClient to get a token using a service principal with symmetric key
var scopes = new[] { config.ArmAadAudience + "/.default" };
var app = ConfidentialClientApplicationBuilder.Create(config.AadClientId)
.WithClientSecret(config.AadSecret)
.WithAuthority(AzureCloudInstance.AzurePublic, config.AadTenantId)
.Build();
var authResult = await app.AcquireTokenForClient(scopes)
.ExecuteAsync()
.ConfigureAwait(false);
return new TokenCredentials(authResult.AccessToken, TokenType);
}
V případě interaktivního ověřování GetCredentialsInteractiveAuthAsync funkce vytvoří ServiceClientCredentials objekt na základě interaktivního ověřování a parametrů připojení dodaných v místním konfiguračním souboru (appSettings. JSON) nebo prostřednictvím souboru proměnných prostředí . env v kořenovém adresáři úložiště. V takovém případě nejsou AADCLIENTID a AADSECRET potřeba v souboru proměnných konfigurace nebo prostředí.
private static async Task<ServiceClientCredentials> GetCredentialsInteractiveAuthAsync(ConfigWrapper config)
{
var scopes = new[] { config.ArmAadAudience + "/user_impersonation" };
// client application of Az Cli
string ClientApplicationId = "04b07795-8ddb-461a-bbee-02f9e1bf7b46";
AuthenticationResult result = null;
IPublicClientApplication app = PublicClientApplicationBuilder.Create(ClientApplicationId)
.WithAuthority(AzureCloudInstance.AzurePublic, config.AadTenantId)
.WithRedirectUri("http://localhost")
.Build();
var accounts = await app.GetAccountsAsync();
try
{
result = await app.AcquireTokenSilent(scopes, accounts.FirstOrDefault()).ExecuteAsync();
}
catch (MsalUiRequiredException ex)
{
try
{
result = await app.AcquireTokenInteractive(scopes).ExecuteAsync();
}
catch (MsalException maslException)
{
Console.Error.WriteLine($"ERROR: MSAL interactive authentication exception with code '{maslException.ErrorCode}' and message '{maslException.Message}'.");
}
}
catch (MsalException maslException)
{
Console.Error.WriteLine($"ERROR: MSAL silent authentication exception with code '{maslException.ErrorCode}' and message '{maslException.Message}'.");
}
return new TokenCredentials(result.AccessToken, TokenType);
}
Vytvoření vstupního prostředku a nahrání místního souboru do tohoto prostředku
Funkce CreateInputAsset vytvoří nový vstupní Asset a nahraje zadaný místní videosoubor do souboru. Tento prostředek se používá jako vstup do vaší úlohy kódování. v Media Services v3 může být vstupem do úlohy buď Asset , nebo obsah, který zpřístupníte účtu Media Services prostřednictvím adres url protokolu HTTPS. Informace o tom, jak kódovat z adresy URL HTTPS, najdete v tomto článku.
Ve službě Media Services v3 slouží k nahrání souborů rozhraní API služby Azure Storage. Následující fragment kódu .NET vám ukáže, jak na to.
Uvedená funkce provede následující akce:
Vytvoří Asset.
Získá zapisovatelnou adresu URL SAS kontejneru assetu v úložišti.
Pokud používáte funkci ListContainerSas assetu k získání adres URL SAS, Všimněte si, že funkce vrací několik adres URL SAS, protože pro každý účet úložiště jsou k dispozici dva klíče účtu úložiště. Účet úložiště má dva klíče, protože umožňuje plynulé střídání klíčů účtu úložiště (například při použití druhého, zahájení použití nového klíče a střídání druhého klíče). První adresa URL SAS představuje úložiště klíč1 a druhé úložiště key2.
Nahraje soubor do kontejneru v úložišti pomocí adresy URL SAS.
private static async Task<Asset> CreateInputAssetAsync(
IAzureMediaServicesClient client,
string resourceGroupName,
string accountName,
string assetName,
string fileToUpload)
{
// In this example, we are assuming that the asset name is unique.
//
// If you already have an asset with the desired name, use the Assets.Get method
// to get the existing asset. In Media Services v3, the Get method on entities returns null
// if the entity doesn't exist (a case-insensitive check on the name).
// Call Media Services API to create an Asset.
// This method creates a container in storage for the Asset.
// The files (blobs) associated with the asset will be stored in this container.
Asset asset = await client.Assets.CreateOrUpdateAsync(resourceGroupName, accountName, assetName, new Asset());
// Use Media Services API to get back a response that contains
// SAS URL for the Asset container into which to upload blobs.
// That is where you would specify read-write permissions
// and the exparation time for the SAS URL.
var response = await client.Assets.ListContainerSasAsync(
resourceGroupName,
accountName,
assetName,
permissions: AssetContainerPermission.ReadWrite,
expiryTime: DateTime.UtcNow.AddHours(4).ToUniversalTime());
var sasUri = new Uri(response.AssetContainerSasUrls.First());
// Use Storage API to get a reference to the Asset container
// that was created by calling Asset's CreateOrUpdate method.
BlobContainerClient container = new BlobContainerClient(sasUri);
BlobClient blob = container.GetBlobClient(Path.GetFileName(fileToUpload));
// Use Strorage API to upload the file into the container in storage.
await blob.UploadAsync(fileToUpload);
return asset;
}
Vytvoření výstupního prostředku k uložení výsledku úlohy
Výstupní Asset ukládá výsledek vaší úlohy kódování. Projekt definuje funkci DownloadResults, která stáhne výsledky z tohoto výstupního prostředku do výstupní složky, kde si je můžete zkontrolovat.
private static async Task<Asset> CreateOutputAssetAsync(IAzureMediaServicesClient client, string resourceGroupName, string accountName, string assetName)
{
bool existingAsset = true;
Asset outputAsset;
try
{
// Check if an Asset already exists
outputAsset = await client.Assets.GetAsync(resourceGroupName, accountName, assetName);
}
catch (ErrorResponseException ex) when (ex.Response.StatusCode == System.Net.HttpStatusCode.NotFound)
{
existingAsset = false;
}
Asset asset = new Asset();
string outputAssetName = assetName;
if (existingAsset)
{
// Name collision! In order to get the sample to work, let's just go ahead and create a unique asset name
// Note that the returned Asset can have a different name than the one specified as an input parameter.
// You may want to update this part to throw an Exception instead, and handle name collisions differently.
string uniqueness = $"-{Guid.NewGuid():N}";
outputAssetName += uniqueness;
Console.WriteLine("Warning – found an existing Asset with name = " + assetName);
Console.WriteLine("Creating an Asset with this name instead: " + outputAssetName);
}
return await client.Assets.CreateOrUpdateAsync(resourceGroupName, accountName, outputAssetName, asset);
}
Vytvoření transformace a úlohy, která nahraný soubor zakóduje
při kódování nebo zpracování obsahu v Media Services se jedná o společný vzor pro nastavení kódování jako recept. Potom stačí odeslat Úlohu, která tento předpis použije pro video. Když odešlete nové úlohy pro každé nové video, použijete tento recept na všechna videa v knihovně. recept v Media Services se nazývá transformace. Další informace najdete v tématu Transformace a úlohy. Ukázka popsaná v tomto kurzu definuje předpis, který zakóduje video tak, aby se dalo streamovat na nejrůznějších zařízeních s iOSem a Androidem.
Transformace
Když vytváříte novou instanci Transformace, musíte určit, co má být jejím výstupem. Objekt TransformOutput v níže uvedeném kódu je povinný parametr. Každý objekt TransformOutput obsahuje Předvolbu. Předvolba popisuje podrobné pokyny operací zpracování videa nebo zvuku, které se používají ke generování požadovaného objektu TransformOutput. Ukázka popsaná v tomto článku používá předdefinovanou předvolbu s názvem AdaptiveStreaming. Tato předvolba zakóduje vstupní video na základě vstupního rozlišení a přenosové rychlosti do automaticky generované dvojice přenosová rychlost / rozlišení (tzv. bitrate ladder) a vytvoří soubory ISO MP4 s videem H.264 a zvukem AAC odpovídající jednotlivým dvojicím přenosová rychlost / rozlišení. Informace o této předvolbě najdete v tématu o automatickém generování dvojic bitrate ladder.
Můžete použít předdefinovanou předvolbu EncoderNamedPreset, nebo si vytvořit vlastní. Další informace najdete v tématu o postupu přizpůsobení předvoleb kodéru.
Než začnete vytvářet transformaci, ověřte si nejdřív pomocí metody Get, jestli už neexistuje (viz kód níže). Pokud entita v Media Services v3 neexistuje, metoda Get vrátí hodnotu null (v názvu se nerozlišují malá a velká písmena).
private static async Task<Transform> GetOrCreateTransformAsync(
IAzureMediaServicesClient client,
string resourceGroupName,
string accountName,
string transformName)
{
bool createTransform = false;
Transform transform = null;
try
{
// Does a transform already exist with the desired name? Assume that an existing Transform with the desired name
// also uses the same recipe or Preset for processing content.
transform = client.Transforms.Get(resourceGroupName, accountName, transformName);
}
catch (ErrorResponseException ex) when (ex.Response.StatusCode == System.Net.HttpStatusCode.NotFound)
{
createTransform = true;
}
if (createTransform)
{
// You need to specify what you want it to produce as an output
TransformOutput[] output = new TransformOutput[]
{
new TransformOutput
{
// The preset for the Transform is set to one of Media Services built-in sample presets.
// You can customize the encoding settings by changing this to use "StandardEncoderPreset" class.
Preset = new BuiltInStandardEncoderPreset()
{
// This sample uses the built-in encoding preset for Adaptive Bitrate Streaming.
PresetName = EncoderNamedPreset.AdaptiveStreaming
}
}
};
// Create the Transform with the output defined above
transform = await client.Transforms.CreateOrUpdateAsync(resourceGroupName, accountName, transformName, output);
}
return transform;
}
Úloha
Jak je uvedeno výše, objekt Transformace je předpis a Úloha je vlastní požadavek na službu Media Services, aby transformaci použila na daný vstupní videoobsah nebo zvukový obsah. Úloha určuje informace, jako je umístění vstupního videa a umístění pro výstup.
V tomto příkladu je vstupní video nahrané z místního počítače. Pokud se chcete dozvědět, jak kódovat z adresy URL HTTPS, přečtěte si Tento článek.
private static async Task<Job> SubmitJobAsync(IAzureMediaServicesClient client,
string resourceGroupName,
string accountName,
string transformName,
string jobName,
string inputAssetName,
string outputAssetName)
{
// Use the name of the created input asset to create the job input.
JobInput jobInput = new JobInputAsset(assetName: inputAssetName);
JobOutput[] jobOutputs =
{
new JobOutputAsset(outputAssetName),
};
// In this example, we are assuming that the job name is unique.
//
// If you already have a job with the desired name, use the Jobs.Get method
// to get the existing job. In Media Services v3, the Get method on entities returns null
// if the entity doesn't exist (a case-insensitive check on the name).
Job job = await client.Jobs.CreateAsync(
resourceGroupName,
accountName,
transformName,
jobName,
new Job
{
Input = jobInput,
Outputs = jobOutputs,
});
return job;
}
Čekání na dokončení úlohy
Úloze chvíli trvá, než se dokončí, a když k tomu dojde, budete na to pravděpodobně chtít upozornit. Následující ukázka kódu ukazuje, jak se má služba dotazovat na stav úlohy. Cyklické dotazování není doporučeným osvědčeným postupem pro produkční aplikace kvůli možné latenci. Pokud se dotazování u některého účtu používá nadměrně, je možné ho omezit. Místo dotazování by vývojáři měli používat službu Event Grid.
Služba Event Grid je navržená pro vysokou dostupnost, konzistentní výkon a dynamické škálování. Díky službě Event Grid můžou vaše aplikace naslouchat událostem a reagovat na ně, ať už pocházejí z kterékoli služby Azure. Události můžou pocházet i z vlastních zdrojů. Jednoduché, reaktivní zpracování událostí založené na protokolu HTTP pomáhá sestavovat efektivní řešení prostřednictvím inteligentního filtrování a směrování událostí. Další informace najdete v článku Směrování událostí na vlastní webový koncový bod.
Úloha obvykle prochází následujícími stavy: Naplánováno, Ve frontě, Zpracovávání a Dokončeno (konečný stav). Pokud během provádění úlohy dojde k chybě, přejde úloha do stavu Chyba. Pokud dojde ke zrušení úlohy, po dokončení operace se akce zruší a zruší .
private static async Task<Job> WaitForJobToFinishAsync(IAzureMediaServicesClient client,
string resourceGroupName,
string accountName,
string transformName,
string jobName)
{
const int SleepIntervalMs = 20 * 1000;
Job job;
do
{
job = await client.Jobs.GetAsync(resourceGroupName, accountName, transformName, jobName);
Console.WriteLine($"Job is '{job.State}'.");
for (int i = 0; i < job.Outputs.Count; i++)
{
JobOutput output = job.Outputs[i];
Console.Write($"\tJobOutput[{i}] is '{output.State}'.");
if (output.State == JobState.Processing)
{
Console.Write($" Progress (%): '{output.Progress}'.");
}
Console.WriteLine();
}
if (job.State != JobState.Finished && job.State != JobState.Error && job.State != JobState.Canceled)
{
await Task.Delay(SleepIntervalMs);
}
}
while (job.State != JobState.Finished && job.State != JobState.Error && job.State != JobState.Canceled);
return job;
}
Kódy chyb úlohy
Viz kódy chyb.
Získání lokátoru streamování
Po dokončení kódování následuje zpřístupnění videa ve výstupním prostředku, kde je k dispozici klientům pro přehrávání. Dá se zpřístupnit ve dvou krocích: Nejdřív vytvořte Lokátor streamovánía druhý, sestavte adresy URL streamování, které můžou klienti používat.
Proces vytvoření lokátoru streamování se nazývá publikování. Ve výchozím nastavení je Lokátor streamování platný hned po volání rozhraní API a trvá až do odstranění, pokud nenastavíte volitelné počáteční a koncové časy.
Při vytváření StreamingLocatorje nutné zadat požadované StreamingPolicyName. V tomto příkladu budete zasílat streamování (nebo nešifrovaný obsah), aby se použily předdefinované zásady zrušení streamování (PredefinedStreamingPolicy. ClearStreamingOnly).
Důležité
Pokud používáte vlastní zásady streamování, měli byste navrhnout určitou sadu takových zásad pro svůj účet Media Service a znovu je použít pro své StreamingLocators, kdykoli budete potřebovat stejné možnosti šifrování a protokoly. Váš účet Media Service má kvótu pro počet položek zásad streamování. Nemusíte vytvářet nové zásady streamování pro každý Lokátor streamování.
Následující kód předpokládá, že zavoláte funkci s jedinečným lokátorem.
private static async Task<StreamingLocator> CreateStreamingLocatorAsync(
IAzureMediaServicesClient client,
string resourceGroup,
string accountName,
string assetName,
string locatorName)
{
StreamingLocator locator = await client.StreamingLocators.CreateAsync(
resourceGroup,
accountName,
locatorName,
new StreamingLocator
{
AssetName = assetName,
StreamingPolicyName = PredefinedStreamingPolicy.ClearStreamingOnly
});
return locator;
}
I když ukázka v tomto tématu popisuje streamování, můžete použít stejné volání k vytvoření lokátoru streamování pro doručování videa prostřednictvím progresivního stahování.
Vytvoření adres URL pro streamování
Teď, když se vytvořil Lokátor streamování , můžete získat adresy URL streamování, jak je znázorněno v GetStreamingURLs. Pokud chcete vytvořit adresu URL, musíte zřetězit název hostitele koncového bodu streamování a cestu k lokátoru streamování . V této ukázce se používá výchozí koncový bod streamování . Při prvním vytvoření účtu služby Media Service bude tento výchozí koncový bod streamování v zastaveném stavu, takže je potřeba zavolat Start.
Poznámka
V této metodě budete potřebovat lokátor, který se použil při vytváření lokátoru streamování pro výstupní prostředek.
private static async Task<IList<string>> GetStreamingUrlsAsync(
IAzureMediaServicesClient client,
string resourceGroupName,
string accountName,
String locatorName)
{
const string DefaultStreamingEndpointName = "default";
IList<string> streamingUrls = new List<string>();
StreamingEndpoint streamingEndpoint = await client.StreamingEndpoints.GetAsync(resourceGroupName, accountName, DefaultStreamingEndpointName);
if (streamingEndpoint.ResourceState != StreamingEndpointResourceState.Running)
{
await client.StreamingEndpoints.StartAsync(resourceGroupName, accountName, DefaultStreamingEndpointName);
}
ListPathsResponse paths = await client.StreamingLocators.ListPathsAsync(resourceGroupName, accountName, locatorName);
foreach (StreamingPath path in paths.StreamingPaths)
{
UriBuilder uriBuilder = new UriBuilder
{
Scheme = "https",
Host = streamingEndpoint.HostName,
Path = path.Paths[0]
};
streamingUrls.Add(uriBuilder.ToString());
}
return streamingUrls;
}
Vyčištění prostředků v účtu služby Media Services
Obecně platí, že byste měli vyčistit všechno kromě objektů, které plánujete znovu použít (obvykle budete znovu používat transformace a budete uchovávat StreamingLocators atd.). Pokud chcete, aby se Váš účet vyčistil po experimentování, odstraňte prostředky, které nechcete znovu použít. Například následující kód odstraní úlohu, vytvořené prostředky a zásady klíčů obsahu:
private static async Task CleanUpAsync(
IAzureMediaServicesClient client,
string resourceGroupName,
string accountName,
string transformName,
string jobName,
List<string> assetNames,
string contentKeyPolicyName = null
)
{
await client.Jobs.DeleteAsync(resourceGroupName, accountName, transformName, jobName);
foreach (var assetName in assetNames)
{
await client.Assets.DeleteAsync(resourceGroupName, accountName, assetName);
}
if (contentKeyPolicyName != null)
{
client.ContentKeyPolicies.Delete(resourceGroupName, accountName, contentKeyPolicyName);
}
}
Spuštění ukázkové aplikace
- Stisknutím kombinace kláves CTRL + F5 spusťte aplikaci EncodeAndStreamFiles .
- Zkopírujte jednu z adresy URL pro streamování z konzoly.
Tento příklad uvádí adresy URL, které můžete použít k přehrávání videa pomocí různých protokolů:

Testování adresy URL pro streamování
Tento článek používá k otestování streamu přehrávač Azure Media Player.
Poznámka
Pokud se přehrávač hostuje na webu HTTPS, nezapomeňte adresu URL aktualizovat tak, aby obsahovala „https“.
- Otevřete webový prohlížeč a přejděte na https://aka.ms/azuremediaplayer/ .
- Do pole Adresa URL: vložte jednu z hodnot URL streamování, které jste dostali při spuštění aplikace.
- Vyberte aktualizovat přehrávač.
Azure Media Player lze použít pro testování, ale neměl by se používat v produkčním prostředí.
Vyčištění prostředků
Pokud ze skupiny prostředků už žádné prostředky nepotřebujete, včetně účtu služby Media Services a účtu úložiště, které jste vytvořili v tomto kurzu, pak tuto dříve vytvořenou skupinu prostředků odstraňte.
Spusťte následující příkaz rozhraní příkazového řádku:
az group delete --name amsResourceGroup
Multithreading
sady sdk Azure Media Services v3 nejsou bezpečné pro přístup z více vláken. Při vývoji aplikace s více vlákny byste měli vygenerovat a použít nový objekt AzureMediaServicesClient na vlákno.
Položte otázky, sdělte nám svůj názor, Získejte aktualizace.
podívejte se na článek o komunitě Azure Media Services a podívejte se na různé způsoby, jak můžete klást otázky, sdělit svůj názor a získávat aktualizace Media Services.
Další kroky
Teď, když už víte, jak nahrávat, kódovat a streamovat videa, podívejte se na následující článek: