Kurz: analýza videí pomocí Media Services V3Tutorial: Analyze videos with Media Services v3

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.Even though this tutorial uses the .NET SDK examples, the general steps are the same for REST API, CLI, or other supported SDKs.

Tento kurz vám ukáže, jak analyzovat video pomocí služby Azure Media Services.This tutorial shows you how to analyze videos with Azure Media Services. Existuje mnoho případů, ve kterých můžete potřebovat získat podrobnější přehled o zaznamenaném video nebo audio obsahu.There are many scenarios in which you might want to gain deep insights into recorded videos or audio content. Pokud chtějí organizace například dosáhnout vyšší spokojenosti zákazníků, mohou převést záznamy řeči zákaznické podpory na text a vytvořit prohledávatelný katalog s rejstříky a řídicími panely.For example, to achieve higher customer satisfaction, organizations can run speech-to-text processing to convert customer support recordings into a searchable catalog, with indexes and dashboards. Pak můžou získat přehled o svých firmách.Then, they can obtain insights into their business. Tyto přehledy obsahují seznam běžných stížností, zdroje těchto stížností a další užitečné informace.These insights include a list of common complaints, sources of such complaints, and other useful information.

V tomto kurzu získáte informace o následujících postupech:This tutorial shows you how to:

  • Stáhněte si ukázkovou aplikaci popsanou v tématu.Download the sample app described in the topic.
  • Projděte si kód, který analyzuje zadané video.Examine the code that analyzes the specified video.
  • Spusťte aplikaci.Run the app.
  • Prohlédněte si výstup.Examine the output.
  • Vyčistěte prostředky.Clean up resources.

Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet před tím, než začnete.If you don't have an Azure subscription, create a free account before you begin.

Dodržování předpisů, ochrana osobních údajů a zabezpečeníCompliance, Privacy and Security

Důležitou připomínkou je, že je nutné dodržovat všechny použitelné zákony v používání Video Indexer a nesmíte používat Video Indexer ani žádnou jinou službu Azure způsobem, který porušuje práva jiných nebo může být škodlivá jiným osobám.As an important reminder, you must comply with all applicable laws in your use of Video Indexer, and you may not use Video Indexer or any other Azure service in a manner that violates the rights of others or may be harmful to others. Před nahráním videí, včetně jakýchkoli biometrických dat, do služby Video Indexer pro zpracování a ukládání, musíte mít všechna patřičná práva, včetně příslušných souhlasů, od jednotlivých jednotlivců ve videu.Before uploading any videos, including any biometric data, to the Video Indexer service for processing and storage, You must have all the proper rights, including all appropriate consents, from the individual(s) in the video. Pokud se chcete dozvědět o dodržování předpisů, ochraně osobních údajů a zabezpečení v Video Indexer, podmínky Cognitive ServicesMicrosoftu.To learn about compliance, privacy and security in Video Indexer, the Microsoft Cognitive Services Terms. Pro závazky ochrany osobních údajů Microsoftu a jejich zpracování si přečtěte prohlášení o zásadách ochrany osobních údajůod Microsoftu, podmínky online služeb ("OST") a doplněk pro zpracování dat (DPA).For Microsoft’s privacy obligations and handling of your data, please review Microsoft’s Privacy Statement, the Online Services Terms (“OST”) and Data Processing Addendum (“DPA”). Další informace o ochraně osobních údajů, včetně uchovávání, odstranění nebo zničení dat, jsou k dispozici v OST a zde.Additional privacy information, including on data retention, deletion/destruction, is available in the OST and here. Když použijete Video Indexer, souhlasíte s tím, že jste vázáni na Cognitive Services podmínky, OST, DPA a prohlášení o zásadách ochrany osobních údajů.By using Video Indexer, you agree to be bound by the Cognitive Services Terms, the OST, DPA and the Privacy Statement.

PředpokladyPrerequisites

Stažení a konfigurace ukázkyDownload and configure the sample

Do svého počítače naklonujte pomocí následujícího příkazu úložiště GitHub obsahující ukázku .NET:Clone a GitHub repository that contains the .NET sample to your machine using the following command:

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

Tato ukázka se nachází ve složce AnalyzeVideos.The sample is located in the AnalyzeVideos folder.

Ve staženém projektu otevřete appsettings.js .Open appsettings.json in your downloaded project. Nahraďte hodnoty přihlašovacími údaji, které jste získali při přístupu k rozhraním API.Replace the values with the credentials you got from accessing APIs.

Kontrola kódu, který analyzuje dané videoExamine the code that analyzes the specified video

Tato část prozkoumává funkce definované v souboru Program.cs z projektu AnalyzeVideos.This section examines functions defined in the Program.cs file of the AnalyzeVideos project.

Ukázka dokončí následující akce:The sample completes the following actions:

  1. Vytvoří transformaci a úlohu , která analyzuje vaše video.Creates a Transform and a Job that analyzes your video.
  2. Vytvoří vstupní Asset a nahraje do něj video.Creates an input Asset and uploads the video into it. Prostředek se použije jako vstup úlohy.The asset is used as the job's input.
  3. Vytvoří výstupní prostředek, který ukládá výstup úlohy.Creates an output asset that stores the job's output.
  4. Odešle úlohu.Submits the job.
  5. Zkontroluje stav úlohy.Checks the job's status.
  6. Stáhne soubory, které jsou výsledkem spuštění úlohy.Downloads the files that resulted from running the job.

Poznámka

Pokud použijete předvolby analyzátoru videa nebo zvuku, pomocí webu Azure Portal nastavte pro svůj účet 10 rezervovaných jednotek médií S3.When using a Video or Audio Analyzer presets, use the Azure portal to set your account to have 10 S3 Media Reserved Units. Další informace najdete v tématu Škálování zpracování médií.For more information, see Scale media processing.

Začínáme s rozhraním API služby Media Services se sadou .NET SDKStart using Media Services APIs with .NET SDK

Pokud chcete začít používat rozhraní Media Services API se sadou .NET SDK, musíte vytvořit objekt AzureMediaServicesClient.To start using Media Services APIs with .NET, you need to create an AzureMediaServicesClient object. K vytvoření tohoto objektu, musíte zadat přihlašovací údaje, aby se klient mohl připojit k Azure pomocí Azure AD.To create the object, you need to supply credentials needed for the client to connect to Azure using Azure AD. V kódu, který jste naklonovali na začátku článku, vytvoří funkce GetCredentialsAsync objekt ServiceClientCredentials na základě pověření zadaných v místním konfiguračním souboru.In the code you cloned at the beginning of the article, the GetCredentialsAsync function creates the ServiceClientCredentials object based on the credentials supplied in local configuration file.

private static async Task<IAzureMediaServicesClient> CreateMediaServicesClientAsync(ConfigWrapper config)
{
    var credentials = await GetCredentialsAsync(config);

    return new AzureMediaServicesClient(config.ArmEndpoint, credentials)
    {
        SubscriptionId = config.SubscriptionId,
    };
}

Vytvoření vstupního prostředku a nahrání místního souboru do tohoto prostředkuCreate an input asset and upload a local file into it

Funkce CreateInputAsset vytvoří nový vstupní Asset a nahraje zadaný místní videosoubor do souboru.The CreateInputAsset function creates a new input Asset and uploads the specified local video file into it. Tento prostředek se použije jako vstup ve vaší úloze kódování.This Asset is used as the input to your encoding Job. Ve službě Media Services v3 můžete jako vstup úlohy použít buď prostředek, nebo obsah, který jste přes adresu URL protokolu HTTPS zpřístupnili ve svém účtu služby Media Services.In Media Services v3, the input to a Job can either be an Asset, or it can be content that you make available to your Media Services account via HTTPS URLs. Informace o tom, jak kódovat z adresy URL HTTPS, najdete v tomto článku.To learn how to encode from an HTTPS URL, see this article.

Ve službě Media Services v3 slouží k nahrání souborů rozhraní API služby Azure Storage.In Media Services v3, you use Azure Storage APIs to upload files. Následující fragment kódu .NET vám ukáže, jak na to.The following .NET snippet shows how.

Následující funkce dokončí tyto akce:The following function completes these actions:

  • Vytvoří Asset.Creates an Asset.

  • Získá zapisovatelnou adresu URL SAS kontejneru assetu v úložišti.Gets a writable SAS URL to the Asset’s container in storage.

    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ě.If using asset’s ListContainerSas function to get SAS URLs, note that the function returns multiple SAS URLs as there are two storage account keys for each storage account. Úč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).A storage account has two keys because it allows for seamless rotation of storage account keys (for example, change one while using the other then start using the new key and rotate the other key). První adresa URL SAS představuje úložiště klíč1 a druhé úložiště key2.The 1st SAS URL represents storage key1 and second one storage key2.

  • Nahraje soubor do kontejneru v úložišti pomocí adresy URL SAS.Uploads the file into the container in storage using the SAS URL.

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.  
    CloudBlobContainer container = new CloudBlobContainer(sasUri);
    var blob = container.GetBlockBlobReference(Path.GetFileName(fileToUpload));

    // Use Strorage API to upload the file into the container in storage.
    await blob.UploadFromFileAsync(fileToUpload);

    return asset;
}

Vytvoření výstupního prostředku k uložení výsledku úlohyCreate an output asset to store the result of the job

Výstupní Asset ukládá výsledek vaší úlohy.The output Asset stores the result of your job. 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.The project defines the DownloadResults function that downloads the results from this output asset into the "output" folder, so you can see what you got.

private static async Task<Asset> CreateOutputAssetAsync(IAzureMediaServicesClient client, string resourceGroupName, string accountName, string assetName)
{
    // Check if an Asset already exists
    Asset outputAsset = await client.Assets.GetAsync(resourceGroupName, accountName, assetName);
    Asset asset = new Asset();
    string outputAssetName = assetName;

    if (outputAsset != null)
    {
        // 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á analyzuje videaCreate a transform and a job that analyzes videos

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.When encoding or processing content in Media Services, it's a common pattern to set up the encoding settings as a recipe. Potom stačí odeslat Úlohu, která tento předpis použije pro video.You would then submit a Job to apply that recipe to a video. Když odešlete nové úlohy pro každé nové video, použijete tento recept na všechna videa v knihovně.By submitting new Jobs for each new video, you're applying that recipe to all the videos in your library. Recept v Media Services se nazývá transformace.A recipe in Media Services is called a Transform. Další informace najdete v tématu transformace a úlohy.For more information, see Transforms and jobs. Ukázka popsaná v tomto kurzu definuje předpis, který analyzuje zadané video.The sample described in this tutorial defines a recipe that analyzes the specified video.

TransformaceTransform

Když vytváříte novou instanci Transformace, musíte určit, co má být jejím výstupem.When creating a new Transform instance, you need to specify what you want it to produce as an output. TransformOutput je povinný parametr.TransformOutput is a required parameter. Každý objekt TransformOutput obsahuje Předvolbu.Each TransformOutput contains a Preset. Předvolba popisuje podrobné pokyny operací zpracování videa a/nebo audia, které se používají ke generování požadovaného objektu TransformOutput.Preset describes step-by-step instructions of video and/or audio processing operations that are to be used to generate the desired TransformOutput. V tomto příkladu se používá předvolba VideoAnalyzerPreset a jazyk ("en-US") je předán konstruktoru ( new VideoAnalyzerPreset("en-US") ).In this example, the VideoAnalyzerPreset preset is used and the language ("en-US") is passed to its constructor (new VideoAnalyzerPreset("en-US")). Tato předvolba vám umožňuje z videa extrahovat několik audio a video přehledů.This preset enables you to extract multiple audio and video insights from a video. Pokud potřebujete z videa extrahovat pouze několik audio přehledů, můžete použít předvolbu AudioAnalyzerPreset.You can use the AudioAnalyzerPreset preset if you need to extract multiple audio insights from a video.

Při vytváření transformacesi nejdříve zajistěte, pokud už existuje, pomocí metody Get , jak je znázorněno v následujícím kódu.When creating a Transform, check first if one already exists using the Get method, as shown in the code that follows. Pokud entita v Media Services v3 neexistuje, metoda Get vrátí hodnotu null (v názvu se nerozlišují malá a velká písmena).In Media Services v3, Get methods on entities return null if the entity doesn’t exist (a case-insensitive check on the name).

private static async Task<Transform> GetOrCreateTransformAsync(IAzureMediaServicesClient client,
    string resourceGroupName,
    string accountName,
    string transformName,
    Preset preset)
{
    // 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 transform = await client.Transforms.GetAsync(resourceGroupName, accountName, transformName);

    if (transform == null)
    {
        // Start by defining the desired outputs.
        TransformOutput[] outputs = new TransformOutput[]
        {
            new TransformOutput(preset),
        };

        // Create the Transform with the output defined above
        transform = await client.Transforms.CreateOrUpdateAsync(resourceGroupName, accountName, transformName, outputs);
    }

    return transform;
}

ÚlohaJob

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.As mentioned above, the Transform object is the recipe and a Job is the actual request to Media Services to apply that Transform to a given input video or audio content. Úloha určuje informace, jako je umístění vstupního videa a umístění výstupu.The Job specifies information like the location of the input video and the location for the output. Umístění videa můžete zadat pomocí adres URL protokolu HTTPS, adres URL podpisu SAS nebo prostředků, které máte ve svém účtu služby Media Services.You can specify the location of your video using: HTTPS URLs, SAS URLs, or Assets that are in your Media Service account.

V tomto příkladu je vstupem úlohy místní video.In this example, the job input is a local video.

private static async Task<Job> SubmitJobAsync(IAzureMediaServicesClient client,
    string resourceGroupName,
    string accountName,
    string transformName,
    string jobName,
    JobInput jobInput,
    string outputAssetName)
{
    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, Get methods 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í úlohyWait for the job to complete

Dokončení úlohy trvá déle.The job takes some time to complete. V takovém případě chcete být upozorněni.When it does, you want to be notified. Existují různé možnosti, jak získat upozornění na dokončení úlohy .There are different options to get notified about the Job completion. Nejjednodušší možnost (zobrazená tady) je použití cyklického dotazování.The simplest option (that's shown here) is to use polling.

Cyklické dotazování není doporučeným osvědčeným postupem pro produkční aplikace kvůli možné latenci.Polling isn't a recommended best practice for production apps because of potential latency. Pokud se dotazování u některého účtu používá nadměrně, je možné ho omezit.Polling can be throttled if overused on an account. Místo dotazování by vývojáři měli používat službu Event Grid.Developers should instead use Event Grid.

Služba Event Grid je navržená pro vysokou dostupnost, konzistentní výkon a dynamické škálování.Event Grid is designed for high availability, consistent performance, and dynamic scale. 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ů.With Event Grid, your apps can listen for and react to events from virtually all Azure services, as well as custom sources. 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í.Simple, HTTP-based reactive event handling helps you build efficient solutions through intelligent filtering and routing of events. Další informace najdete v tématu Směrování událostí do vlastního webového koncového bodu.For more information, see Route events to a custom web endpoint.

Úloha obvykle prochází následujícími stavy: Naplánováno, Ve frontě, Zpracovávání a Dokončeno (konečný stav).The Job usually goes through the following states: Scheduled, Queued, Processing, Finished (the final state). Pokud se úloha dokončí v rámci chyby, zobrazí se chybový stav.If the job has come across an error, you get the Error state. Pokud se úloha právě ruší, vrátíte se a po dokončení se zruší .If the job is in the process of being canceled, you get Canceling and then Canceled when it's done.

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 úlohyJob error codes

Viz kódy chyb.See Error codes.

Stažení výsledku úlohyDownload the result of the job

Následující funkce stáhne výsledky z výstupního prostředku do složky "Output", abyste mohli kontrolovat výsledky úlohy.The following function downloads the results from the output Asset into the "output" folder so you can examine the results of the job.

private static async Task DownloadOutputAssetAsync(
    IAzureMediaServicesClient client,
    string resourceGroup,
    string accountName,
    string assetName,
    string outputFolderName)
{
    if (!Directory.Exists(outputFolderName))
    {
        Directory.CreateDirectory(outputFolderName);
    }

    AssetContainerSas assetContainerSas = await client.Assets.ListContainerSasAsync(
        resourceGroup,
        accountName,
        assetName,
        permissions: AssetContainerPermission.Read,
        expiryTime: DateTime.UtcNow.AddHours(1).ToUniversalTime());

    Uri containerSasUrl = new Uri(assetContainerSas.AssetContainerSasUrls.FirstOrDefault());
    CloudBlobContainer container = new CloudBlobContainer(containerSasUrl);

    string directory = Path.Combine(outputFolderName, assetName);
    Directory.CreateDirectory(directory);

    Console.WriteLine($"Downloading output results to '{directory}'...");

    BlobContinuationToken continuationToken = null;
    IList<Task> downloadTasks = new List<Task>();

    do
    {
        // A non-negative integer value that indicates the maximum number of results to be returned at a time,
        // up to the per-operation limit of 5000. If this value is null, the maximum possible number of results
        // will be returned, up to 5000.
        int? ListBlobsSegmentMaxResult = null;

        BlobResultSegment segment = await container.ListBlobsSegmentedAsync(null, true, BlobListingDetails.None, ListBlobsSegmentMaxResult, continuationToken, null, null);

        foreach (IListBlobItem blobItem in segment.Results)
        {
            if (blobItem is CloudBlockBlob blob)
            {
                string path = Path.Combine(directory, blob.Name);

                downloadTasks.Add(blob.DownloadToFileAsync(path, FileMode.Create));
            }
        }

        continuationToken = segment.ContinuationToken;
    }
    while (continuationToken != null);

    await Task.WhenAll(downloadTasks);

    Console.WriteLine("Download complete.");
}

Vyčištění prostředků v účtu služby Media ServicesClean up resource in your Media Services account

Obecně byste měli vyčistit vše kromě objektů, které plánujete použít (obvykle budete znovu používat transformaci a trvalé StreamingLocators).Generally, you should clean up everything except objects that you're planning to reuse (typically, you'll reuse Transforms and persist StreamingLocators). Pokud chcete, aby se Váš účet vyčistil po experimentování, odstraňte prostředky, které nechcete znovu použít.If you want for your account to be clean after experimenting, delete the resources that you don't plan to reuse. Například následující kód odstraní úlohu a výstupní prostředek:For example, the following code deletes the job and output asset:

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é aplikaceRun the sample app

Stisknutím kombinace kláves CTRL + F5 spusťte aplikaci AnalyzeVideos .Press Ctrl+F5 to run the AnalyzeVideos app.

Když program spustíte, úloha vytvoří miniatury každého obličeje, který ve videu najde.When we run the program, the job produces thumbnails for each face that it finds in the video. Zároveň vytvoří soubor insights.json.It also produces the insights.json file.

Prozkoumání výstupuExamine the output

Výstupní soubor analyzování videa se nazývá insights.json.The output file of analyzing videos is called insights.json. Tento soubor obsahuje přehledy o vašem videu.This file contains insights about your video. Popis jednotlivých elementů nalezených v souboru JSON získáte v článku Inteligentní funkce médií.You can find description of elements found in the json file in the Media intelligence article.

Vyčištění prostředkůClean up resources

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.If you no longer need any of the resources in your resource group, including the Media Services and storage accounts you created for this tutorial, delete the resource group you created earlier.

Spusťte následující příkaz rozhraní příkazového řádku:Execute the following CLI command:

az group delete --name amsResourceGroup

MultithreadingMultithreading

Sady SDK Azure Media Services V3 nejsou bezpečné pro přístup z více vláken.The Azure Media Services v3 SDKs aren't thread-safe. Při práci s aplikacemi s více vlákny byste měli vytvořit nový objekt AzureMediaServicesClient pro každé vlákno.When working with a multi-threaded app, you should generate a new AzureMediaServicesClient object per thread.

Položte otázky, sdělte nám svůj názor, Získejte aktualizace.Ask questions, give feedback, get updates

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.Check out the Azure Media Services community article to see different ways you can ask questions, give feedback, and get updates about Media Services.

Další krokyNext steps