Kurz: použití dynamického šifrování DRM a služby doručování licencí
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 můžete použít k doručování datových proudů šifrovaných pomocí licencí Microsoft PlayReady, Google Widevine nebo Apple FairPlay. Podrobné vysvětlení najdete v tématu Ochrana obsahu s dynamickým šifrováním.
Media Services taky poskytuje službu pro doručování licencí PlayReady, Widevine a FairPlay DRM. když si uživatel vyžádá obsah chráněný pomocí DRM, aplikace přehrávače si vyžádá licenci od služby Media Services license service. pokud je aplikace přehrávače autorizována, služba Media Services license service vydá licenci ke službě player. Licence obsahuje dešifrovací klíč, kterým může klientský přehrávač dešifrovat a streamovat obsah.
Tento článek vychází z ukázky šifrování pomocí ochrany DRM.
Ukázka popsaná v tomto článku vede k tomuto výsledku:

V tomto kurzu získáte informace o následujících postupech:
- Vytvoří transformaci kódování.
- Nastavení podpisového klíče sloužícího k ověření vašeho tokenu.
- Nastavte požadavky na zásady klíče obsahu.
- Vytvořte StreamingLocator se zadaným zásadou streamování.
- Vytvořte adresu URL používanou k přehrání souboru.
Pokud ještě nemáte předplatné Azure,vytvořte si bezplatný účet před tím, než začnete.
Požadavky
K dokončení kurzu potřebujete následující položky:
- Přečíst si článek Přehled ochrany obsahu
- Projděte si téma návrh ochrany obsahu s více technologiemi DRM pomocí řízení přístupu.
- nainstalujte Visual Studio Code nebo Visual Studio.
- Vytvořit si nový účet služby Azure Media Services podle popisu v tomto rychlém startu
- Získat přihlašovací údaje nutné k používání rozhraní API služby Media Services podle článku Přístup k rozhraním API
- Nastavte příslušné hodnoty v konfiguračním souboru aplikace (appsettings.jssouboru nebo souboru. ENV).
Stažení kódu a konfigurace ukázky
Pomocí následujícího příkazu naklonujte do svého počítače úložiště GitHub s úplnou ukázkou streamování .NET, o které pojednává tento článek:
git clone https://github.com/Azure-Samples/media-services-v3-dotnet-tutorials.git
Ukázka „Encrypt with DRM“ se nachází ve složce EncryptWithDRM.
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ě.
Poznámka
Ukázka vytvoří jedinečné prostředky pokaždé, když aplikaci spustíte. Obvykle znovu použijete stávající prostředky, jako jsou transformace a zásady (Pokud existující prostředek má požadované konfigurace).
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 prostřednictvím 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í výstupního prostředku
Výstupní Asset ukládá výsledek vaší úlohy kódování.
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);
}
Získání nebo vytvoření transformace kódování
Když vytváříte novou instanci Transformace, musíte určit, co má být jejím výstupem. Požadovaný parametr je transformOutput objekt, jak je znázorněno v následujícím kódu. 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. Přednastavení zakóduje vstupní video do automaticky vygenerovaného žebříku (páry přenosných rychlostí) na základě rozlišení vstupu a přenosové rychlosti a vytváří soubory ISO MP4 s H. 264 a zvukem AAC odpovídajícím dvojicím přenosové rychlosti.
Než začnete vytvářet novou transformaci, ověřte si nejdřív pomocí metody Get, jestli už neexistuje, jak vidíte v následujícím kódu. 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;
}
Spuštění úlohy
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í výstupu.
V tomto kurzu vytvoříme vstup úlohy na základě souboru, který je ingestný přímo z adresy URL zdroje https.
private static async Task<Job> SubmitJobAsync(IAzureMediaServicesClient client,
string resourceGroup,
string accountName,
string transformName,
string outputAssetName,
string jobName)
{
// This example shows how to encode from any HTTPs source URL - a new feature of the v3 API.
// Change the URL to any accessible HTTPs URL or SAS URL from Azure.
JobInputHttp jobInput =
new JobInputHttp(files: new[] { SourceUri });
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(
resourceGroup,
accountName,
transformName,
jobName,
new Job
{
Input = jobInput,
Outputs = jobOutputs,
});
return job;
}
Čekání na dokončení úlohy
Dokončení úlohy trvá déle. V takovém případě chcete být upozorněni. 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. 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 se úloha dokončí v rámci chyby, zobrazí se chybový stav. 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;
}
Vytvoření zásad pro klíč obsahu
Symetrický klíč poskytuje zabezpečený přístup k vašim prostředkům. Je potřeba vytvořit zásadu klíče obsahu při šifrování obsahu pomocí DRM. Zásady nakonfigurují způsob doručení klíče obsahu koncovým klientům. Klíč obsahu je přidružen k lokátoru streamování. Služba Media Services poskytuje taky službu doručování klíčů, která doručuje šifrovací klíče a licence autorizovaným uživatelům.
Je nutné nastavit požadavky (omezení) na zásady klíče obsahu , které musí být splněny pro doručení klíčů se zadanou konfigurací. V tomto příkladu jsme nastavili následující konfigurace a požadavky:
Konfigurace
Licence PlayReady a Widevine jsou nakonfigurované tak, že se dají doručit pomocí služby doručení licencí Media Services. I když Tato ukázková aplikace nekonfiguruje licenci Fairplay , obsahuje metodu, kterou můžete použít ke konfiguraci Fairplay. Konfiguraci FairPlay můžete přidat jako jinou možnost.
Omezení
Aplikace nastaví u této zásady omezení typu tokenu JSON Web Token (JWT).
Když přehrávač zadá požadavek na stream, služba Media Services pomocí zadaného klíče dynamicky zašifruje váš obsah. K dešifrování streamu si přehrávač vyžádá klíč ze služby doručování klíčů. K tomu, aby služba zjistila, jestli má daný uživatel povolené získání klíče, vyhodnocuje zásadu symetrického klíče, kterou jste pro klíč určili.
private static async Task<ContentKeyPolicy> GetOrCreateContentKeyPolicyAsync(
IAzureMediaServicesClient client,
string resourceGroupName,
string accountName,
string contentKeyPolicyName,
byte[] tokenSigningKey)
{
bool createPolicy = false;
ContentKeyPolicy policy = null;
try
{
policy = await client.ContentKeyPolicies.GetAsync(resourceGroupName, accountName, contentKeyPolicyName);
}
catch (ErrorResponseException ex) when (ex.Response.StatusCode == System.Net.HttpStatusCode.NotFound)
{
createPolicy = true;
}
if (createPolicy)
{
ContentKeyPolicySymmetricTokenKey primaryKey = new ContentKeyPolicySymmetricTokenKey(tokenSigningKey);
List<ContentKeyPolicyTokenClaim> requiredClaims = new List<ContentKeyPolicyTokenClaim>()
{
ContentKeyPolicyTokenClaim.ContentKeyIdentifierClaim
};
List<ContentKeyPolicyRestrictionTokenKey> alternateKeys = null;
ContentKeyPolicyTokenRestriction restriction
= new ContentKeyPolicyTokenRestriction(Issuer, Audience, primaryKey, ContentKeyPolicyRestrictionTokenType.Jwt, alternateKeys, requiredClaims);
ContentKeyPolicyPlayReadyConfiguration playReadyConfig = ConfigurePlayReadyLicenseTemplate();
ContentKeyPolicyWidevineConfiguration widevineConfig = ConfigureWidevineLicenseTemplate();
// ContentKeyPolicyFairPlayConfiguration fairplayConfig = ConfigureFairPlayPolicyOptions();
List<ContentKeyPolicyOption> options = new List<ContentKeyPolicyOption>();
options.Add(
new ContentKeyPolicyOption()
{
Configuration = playReadyConfig,
// If you want to set an open restriction, use
// Restriction = new ContentKeyPolicyOpenRestriction()
Restriction = restriction
});
options.Add(
new ContentKeyPolicyOption()
{
Configuration = widevineConfig,
Restriction = restriction
});
// add CBCS ContentKeyPolicyOption into the list
// options.Add(
// new ContentKeyPolicyOption()
// {
// Configuration = fairplayConfig,
// Restriction = restriction,
// Name = "ContentKeyPolicyOption_CBCS"
// });
policy = await client.ContentKeyPolicies.CreateOrUpdateAsync(resourceGroupName, accountName, contentKeyPolicyName, options);
}
else
{
// Get the signing key from the existing policy.
var policyProperties = await client.ContentKeyPolicies.GetPolicyPropertiesWithSecretsAsync(resourceGroupName, accountName, contentKeyPolicyName);
if (policyProperties.Options[0].Restriction is ContentKeyPolicyTokenRestriction restriction)
{
if (restriction.PrimaryVerificationKey is ContentKeyPolicySymmetricTokenKey signingKey)
{
TokenSigningKey = signingKey.KeyValue;
}
}
}
return policy;
}
Vytvoření lokátoru streamování
Po dokončení kódování a nastavení zásady symetrického klíče spočívá další krok ve vytvoření videa ve výstupním prostředku, které budou moct klienti přehrávat. Video zpřístupníte ve dvou krocích:
- Vytvořte Lokátor streamování.
- Vytvoření adres URL pro streamování, které můžou používat klienti
Proces vytvoření lokátoru streamování se nazývá publikování. Ve výchozím nastavení je Lokátor streamování platný ihned po volání rozhraní API. Bude trvat až do odstranění, pokud nenastavíte volitelné počáteční a koncové časy.
Při vytváření lokátoru streamování je potřeba zadat požadované StreamingPolicyName . v tomto kurzu používáme jednu z předdefinovaných zásad streamování, která oznamuje Azure Media Services, jak publikovat obsah pro streamování. V tomto příkladu jsme nastavili název StreamingLocator.StreamingPolicyName na zásadu Predefined_MultiDrmCencStreaming. Šifry PlayReady a Widevine se aplikují a klíč se doručí klientovi pro přehrávání na základě konfigurovaných licencí DRM. Pokud zároveň chcete svůj stream zašifrovat pomocí CBCS (FairPlay), použijte zásadu Predefined_MultiDrmStreaming.
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. Počet záznamů StreamingPolicy je pro účty služby Media Service omezený kvótou. Neměli byste vytvářet novou StreamingPolicy pro každou StreamingLocator.
private static async Task<StreamingLocator> CreateStreamingLocatorAsync(
IAzureMediaServicesClient client,
string resourceGroup,
string accountName,
string assetName,
string locatorName,
string contentPolicyName)
{
// If you also added FairPlay, use "Predefined_MultiDrmStreaming
StreamingLocator locator = await client.StreamingLocators.CreateAsync(
resourceGroup,
accountName,
locatorName,
new StreamingLocator
{
AssetName = assetName,
// "Predefined_MultiDrmCencStreaming" policy supports envelope and cenc encryption
// And sets two content keys on the StreamingLocator
StreamingPolicyName = "Predefined_MultiDrmCencStreaming",
DefaultContentKeyPolicyName = contentPolicyName
});
return locator;
}
Získání testovacího tokenu
V tomto kurzu určíme, že má mít zásada symetrického klíče omezení tokenu. Zásady omezení tokenem musí být doplněny tokenem vydaným službou tokenů zabezpečení (STS). Media Services podporuje tokeny ve formátech JWT a to je to, co v ukázce nakonfigurujeme.
V zásadě ContentKeyPolicy se používá deklarace ContentKeyIdentifierClaim, což znamená, že token předaný službě doručování klíčů musí mít v sobě identifikátor symetrického klíče. V ukázce nezadáte klíč obsahu při vytváření lokátoru streamování, systém pro nás vytvoří náhodný. Pro vygenerování testovacího tokenu je potřeba získat ContentKeyId, který se vloží do deklarace ContentKeyIdentifierClaim.
private static string GetTokenAsync(string issuer, string audience, string keyIdentifier, byte[] tokenVerificationKey)
{
var tokenSigningKey = new SymmetricSecurityKey(tokenVerificationKey);
SigningCredentials cred = new SigningCredentials(
tokenSigningKey,
// Use the HmacSha256 and not the HmacSha256Signature option, or the token will not work!
SecurityAlgorithms.HmacSha256,
SecurityAlgorithms.Sha256Digest);
Claim[] claims = new Claim[]
{
new Claim(ContentKeyPolicyTokenClaim.ContentKeyIdentifierClaim.ClaimType, keyIdentifier)
};
// To set a limit on how many times the same token can be used to request a key or a license.
// add the "urn:microsoft:azure:mediaservices:maxuses" claim.
// For example, claims.Add(new Claim("urn:microsoft:azure:mediaservices:maxuses", 4));
JwtSecurityToken token = new JwtSecurityToken(
issuer: issuer,
audience: audience,
claims: claims,
notBefore: DateTime.Now.AddMinutes(-5),
expires: DateTime.Now.AddMinutes(60),
signingCredentials: cred);
JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler();
return handler.WriteToken(token);
}
Sestavení adresy URL streamování
Vytvořili jste streamovací lokátor StreamingLocator a teď můžete vytvořit adresy URL pro streamování. Pokud chcete vytvořit adresu URL, musíte zřetězit název hostitele StreamingEndpoint 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.
private static async Task<string> GetDASHStreamingUrlAsync(
IAzureMediaServicesClient client,
string resourceGroupName,
string accountName,
string locatorName)
{
const string DefaultStreamingEndpointName = "default";
string dashPath = "";
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
};
// Look for just the DASH path and generate a URL for the Azure Media Player to playback the content with the AES token to decrypt.
// Note that the JWT token is set to expire in 1 hour.
if (path.StreamingProtocol == StreamingPolicyStreamingProtocol.Dash)
{
uriBuilder.Path = path.Paths[0];
dashPath = uriBuilder.ToString();
}
}
return dashPath;
}
Po spuštění aplikace se zobrazí následující obrazovka:

Můžete otevřít prohlížeč a zadáním výsledné adresy URL spustit ukázkovou stránku Azure Media Player, na které je už předem vyplněná adresa URL a token.
Vyčištění prostředků v účtu služby Media Services
Obecně platí, že byste měli vyčistit vše kromě objektů, které plánujete znovu použít (obvykle budete znovu používat transformace, StreamingLocators a tak dále). 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);
}
}
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
Další poznámky
- Widevine je služba od společnosti Google Inc. v souladu s podmínkami služby a zásadami ochrany osobních údajů Google, Inc.
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
Rezervovat