Руководство по Отправка, кодировка и потоковая передача видео с помощью Служб мультимедиа версии 3Tutorial: Upload, encode, and stream videos with Media Services v3

Примечание

Несмотря на то, что в этом учебнике используются примеры для пакета SDK для .NET , общие шаги одинаковы для REST API, CLI или других поддерживаемых пакетов SDK.Even though this tutorial uses .NET SDK examples, the general steps are the same for REST API, CLI, or other supported SDKs.

Службы мультимедиа Azure позволяют кодировать файлы мультимедиа в форматы, пригодные для воспроизведения в разных браузерах и на различных устройствах.Azure Media Services lets you encode your media files into formats that play on a wide variety of browsers and devices. Например, можно организовать потоковую передачу содержимого в форматах HLS или MPEG DASH от Apple.For example, you might want to stream your content in Apple's HLS or MPEG DASH formats. Перед тем как передавать файл мультимедиа высокого качества, его нужно закодировать.Before streaming, you should encode your high-quality digital media file. Справку по кодированию см. в разделе Концепция кодирования.For help with encoding, see Encoding concept. В этом руководстве описана отправка локального файла видео и кодирование загруженного файла.This tutorial uploads a local video file and encodes the uploaded file. Также можно закодировать содержимое, которое доступно через URL-адрес HTTPS.You can also encode content that you make accessible via an HTTPS URL. Дополнительные сведения см. в разделе Создание входных данных задания из URL-адреса HTTP (HTTPS).For more information, see Create a job input from an HTTP(s) URL.

Воспроизведение видео с помощью Проигрывателя мультимедиа Azure

В этом учебнике описаны следующие процедуры.This tutorial shows you how to:

  • Скачивание примера приложения, описанного в этой статье.Download the sample app described in the topic.
  • Проверка кода, который загружает, кодирует и выполняет потоковую передачу.Examine the code that uploads, encodes, and streams.
  • Запустите приложение.Run the app.
  • Тестирование URL-адреса потоковой передачи.Test the streaming URL.
  • Очистка ресурсов.Clean up resources.

Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начать работу.If you don't have an Azure subscription, create a free account before you begin.

Предварительные требованияPrerequisites

Скачивание и настройка примераDownload and set up the sample

Клонируйте репозиторий GitHub, содержащий пример потоковой передачи данных .NET на компьютер с помощью следующей команды:Clone a GitHub repository that has the streaming .NET sample to your machine using the following command:

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

Этот образец находится в папке UploadEncodeAndStreamFiles.The sample is located in the UploadEncodeAndStreamFiles folder.

Откройте файл appsettings.json в скачанном проекте.Open appsettings.json in your downloaded project. Замените значения учетными данными, которые вы получили, выполнив действия из статьи Доступ к API Служб мультимедиа Azure с помощью Azure CLI.Replace the values with credentials that you got from accessing APIs.

Проверка кода, который загружает, кодирует и выполняет потоковую передачуExamine the code that uploads, encodes, and streams

В этом разделе рассматриваются функции, определенные в файле Program.cs проекта UploadEncodeAndStreamFiles.This section examines functions defined in the Program.cs file of the UploadEncodeAndStreamFiles project.

Этот пример выполняет следующие действия:The sample performs the following actions:

  1. Создает новое преобразование (сначала проверяет, существует ли указанное преобразование).Creates a new Transform (first, checks if the specified Transform exists).
  2. Создает выходной ресурс, который используется в качестве выходных данных задания кодирования.Creates an output Asset that's used as the encoding Job's output.
  3. Создает входной ресурс и передает в него указанный локальный файл видео.Create an input Asset and uploads the specified local video file into it. Ресурс используется в качестве входных данных задания.The asset is used as the job's input.
  4. Отправляет задание кодирования с использованием входных и выходных данных, которые были созданы.Submits the encoding job using the input and output that was created.
  5. Проверяет состояние задания.Checks the job's status.
  6. Создает указатель потоковой передачи.Creates a Streaming Locator.
  7. компиляция URL-адресов потоковой передачи.Builds streaming URLs.

Начало использования API Служб мультимедиа с пакетом SDK для .NETStart using Media Services APIs with .NET SDK

Чтобы начать использование API Служб мультимедиа с .NET, создайте объект AzureMediaServicesClient.To start using Media Services APIs with .NET, you need to create an AzureMediaServicesClient object. Чтобы создать объект, введите учетные данные, необходимые клиенту для подключения к Azure с помощью Azure AD.To create the object, you must supply credentials needed for the client to connect to Azure using Azure AD. В коде, который вы клонировали в начале статьи, функция GetCredentialsAsync создает объект ServiceClientCredentials с использованием учетных данных, предоставленных в локальном файле конфигурации.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,
    };
}

Создание входного ресурса и отправка в него локального файлаCreate an input asset and upload a local file into it

Функция CreateInputAsset создает входной ресурс и отправляет в него определенный локальный видеофайл.The CreateInputAsset function creates a new input Asset and uploads the specified local video file into it. Этот ресурс используется в качестве входных данных для задания кодирования.This Asset is used as the input to your encoding job. В Службах мультимедиа версии 3 входные данные для задания могут быть либо ресурсом, либо содержимым, доступным в учетной записи Служб мультимедиа через URL-адрес HTTPS.In Media Services v3, the input to a Job can either be an Asset or content that you make available to your Media Services account via HTTPS URLs. Сведения о кодировании URL-адреса HTTPS см. в этой статье.To learn how to encode from an HTTPS URL, see this article.

В Службах мультимедиа версии 3 для отправки файлов используются API службы хранилища.In Media Services v3, you use Azure Storage APIs to upload files. В следующих фрагментах кода .NET показано, как это сделать.The following .NET snippet shows how.

Следующая функция выполняет такие действия:The following function performs these actions:

  • создает ресурс;Creates an Asset.

  • получает записываемый URL-адрес SAS в контейнере в хранилище ресурса;Gets a writable SAS URL to the asset’s container in storage.

    При использовании функции ListContainerSas ресурса для получения URL-адресов SAS обратите внимание, что функция возвращает несколько URL-адресов SAS, так как для каждой учетной записи хранения существует два ключа.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. Учетная запись хранения имеет два ключа, чтобы обеспечить легкую смену ключей (например, можно использовать первый ключ и в это время заменить второй ключ, а затем начать использовать новый ключ, а в это время заменить первый ключ).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). Первый URL-адресом SAS представляет собой ключ к хранилищу данных 1, а второй — ключ к хранилищу данных 2.The 1st SAS URL represents storage key1 and second one storage key2.

  • отправляет файл в контейнер в хранилище через 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;
}

Создание выходного ресурса для хранения результатов заданияCreate an output asset to store the result of a job

Выходной ресурс сохраняет результаты задания кодирования.The output Asset stores the result of your encoding job. Проект определяет функцию DownloadResults, которая скачивает результаты из выходного ресурса в папку output, чтобы вы могли просмотреть их.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);
}

Создание преобразования и задания, которое кодирует отправленный файлCreate a Transform and a Job that encodes the uploaded file

При кодировании или обработке содержимого в Службах мультимедиа параметры кодировки часто задают в качестве набора инструкций.When encoding or processing content in Media Services, it's a common pattern to set up the encoding settings as a recipe. Затем необходимо отправить задание, чтобы применить этот набор к видео.You would then submit a Job to apply that recipe to a video. Отправляя новые задания для каждого нового видео, вы применяете этот набор ко всем видео в своей библиотеке.By submitting new jobs for each new video, you're applying that recipe to all the videos in your library. Набор инструкций в Службах мультимедиа называется Преобразование.A recipe in Media Services is called a Transform. Дополнительные сведения см. в статье Преобразования и задания.For more information, see Transforms and Jobs. Пример кода, описанный в руководстве, определяет набор инструкций, которые кодируют видео для его потоковой передачи на различные устройства под управлением iOS и Android.The sample described in this tutorial defines a recipe that encodes the video in order to stream it to a variety of iOS and Android devices.

ПреобразованиеTransform

При создании нового экземпляра преобразования необходимо указать, что требуется создать в качестве выходных данных.When creating a new Transform instance, you need to specify what you want it to produce as an output. Обязательный параметр — это объект TransformOutput, как показано в приведенном ниже примере кода.The required parameter is a TransformOutput object, as shown in the code below. Каждый объект TransformOutput содержит предустановку (Preset).Each TransformOutput contains a Preset. Предустановка описывает пошаговые инструкции для операций обработки видео и звука, которые будут использоваться для создания нужного объекта TransformOutput.Preset describes the step-by-step instructions of video and/or audio processing operations that are to be used to generate the desired TransformOutput. Пример, описанный в этой статье, использует встроенную предустановку, называемую AdaptiveStreaming.The sample described in this article uses a built-in Preset called AdaptiveStreaming. Предустановка кодирует входное видео в автоматически созданную схему скоростей и разрешений (пары "скорость — разрешение") на основе входного разрешения и скорости и создает файлы ISO MP4 с видео H.264 и аудио AAC, соответствующие каждой паре "скорость — разрешение".The Preset encodes the input video into an auto-generated bitrate ladder (bitrate-resolution pairs) based on the input resolution and bitrate, and produces ISO MP4 files with H.264 video and AAC audio corresponding to each bitrate-resolution pair. Дополнительные сведения об этой предустановке см. в этой статье.For information about this Preset, see auto-generating bitrate ladder.

Вы можете использовать встроенную предустановку кодирования или пользовательскую предустановку.You can use a built-in EncoderNamedPreset or use custom presets. Дополнительные сведения см. в разделе How to customize encoder presets (Настройка предустановки кодировщика).For more information, see How to customize encoder presets.

При создании преобразования сначала проверьте, существует ли оно, с помощью метода Get, как показано в следующем коде.When creating a Transform, you should first check if one already exists using the Get method, as shown in the code that follows. В Службах мультимедиа версии 3 методы Get, отправленные к сущностям, возвращают значение NULL, если сущность не существует (проверка по имени без учета регистра).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)
{
    // 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)
    {
        // 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;
}

ЗаданиеJob

Как было указано выше, объект преобразования является набором инструкций, а задание — фактическим запросом к Службам мультимедиа для применения этого преобразования к данному видео и аудио.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. Задание указывает такую информацию, как расположение входного и выходного видео.The Job specifies information like the location of the input video, and the location for the output.

В этом примере входное видео было отправлено с локального компьютера.In this example, the input video has been uploaded from your local machine. Дополнительные сведения о кодировании из URL-адреса HTTPS см. в этой статье.If you want to learn how to encode from an HTTPS URL, see this article.

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

Ожидание завершения заданияWait for the Job to complete

Выполнение задания занимает некоторое время. По его завершению вы будете уведомлены.The job takes some time to complete and when it does you want to be notified. В примере кода ниже показано, как опрашивать службу о состоянии задания.The code sample below shows how to poll the service for the status of the Job. Опрос не рекомендуется для приложений рабочей среды из-за потенциальной задержки.Polling isn't a recommended best practice for production apps because of potential latency. Его можно регулировать при чрезмерном использовании в учетной записи.Polling can be throttled if overused on an account. Вместо этого разработчики должны использовать службу "Сетка событий".Developers should instead use Event Grid.

Служба "Сетка событий" предназначена для обеспечения высокого уровня доступности, стабильной производительности и динамического масштабирования.Event Grid is designed for high availability, consistent performance, and dynamic scale. С помощью службы "Сетка событий Azure" приложения могут ожидать передачи данных и реагировать на события, поступающие буквально из всех служб Azure и пользовательских источников.With Event Grid, your apps can listen for and react to events from virtually all Azure services, as well as custom sources. Простая реактивная обработка событий на основе HTTP позволяет создавать эффективные решения с использованием интеллектуальной фильтрации и маршрутизации событий.Simple, HTTP-based reactive event handling helps you build efficient solutions through intelligent filtering and routing of events. Дополнительные сведения см. в статье Route Azure Media Services events to a custom web endpoint using CLI (Маршрутизация событий Служб мультимедиа в пользовательскую конечную точку с помощью CLI).See Route events to a custom web endpoint.

Для задания обычно последовательно устанавливаются следующие состояния: Запланировано, В очереди, Идет обработка, Завершено (конечное состояние).The Job usually goes through the following states: Scheduled, Queued, Processing, Finished (the final state). Если в задании обнаружена ошибка, вы получите состояние Ошибка.If the job has encountered an error, you get the Error state. Если задание находится в процессе отмены, вы получите состояние Выполнение отмены и Отменено по завершении.If the job is in the process of being canceled, you get Canceling and 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;
}

Коды ошибок заданияJob error codes

См. статью о кодах ошибок.See Error codes.

Создание указателя потоковой передачиGet a Streaming Locator

После выполнения кодирования необходимо сделать видео в выходном ресурсе доступным для воспроизведения клиентами.After the encoding is complete, the next step is to make the video in the output Asset available to clients for playback. Это можно сделать в два этапа. Сначала создайте указатель потоковой передачи, а затем URL-адреса потоковой передачи, которые могут использовать клиенты.You can make it available in two steps: first, create a Streaming Locator, and second, build the streaming URLs that clients can use.

Процесс создания указателя потоковой передачи называется публикацией.The process of creating a Streaming Locator is called publishing. По умолчанию указатель потоковой передачи допустим сразу после выполнения вызова API и действует, пока не будет удален, если не настроить дополнительное начальное и конечное время.By default, the Streaming Locator is valid immediately after you make the API calls, and lasts until it's deleted, unless you configure the optional start and end times.

При создании StreamingLocator необходимо указать желаемое имя StreamingPolicyName.When creating a StreamingLocator, you'll need to specify the desired StreamingPolicyName. В этом примере выполняется потоковая передача незашифрованного содержимого, поэтому используется предварительно определенная политика прозрачной потоковой передачи (PredefinedStreamingPolicy.ClearStreamingOnly).In this example, you'll be streaming in-the-clear (or non-encrypted content) so the predefined clear streaming policy (PredefinedStreamingPolicy.ClearStreamingOnly) is used.

Важно!

При использовании пользовательской политики потоковой передачи следует разработать ограниченный набор таких политик для учетной записи Служб мультимедиа и повторно использовать их для компонентов StreamingLocator каждый раз, когда требуются те же параметры шифрования и протоколы.When using a custom Streaming Policy, you should design a limited set of such policies for your Media Service account, and re-use them for your StreamingLocators whenever the same encryption options and protocols are needed. У вашей учетной записи служб мультимедиа есть квота на количество входов в политику потоковой передачи.Your Media Service account has a quota for the number of Streaming Policy entries. Вам не нужно создавать новую политику потоковой передачи для каждого указателя потоковой передачи.You shouldn't be creating a new Streaming Policy for each Streaming Locator.

В следующем коде предполагается, что вы вызываете функцию с уникальным locatorName.The following code assumes that you're calling the function with a unique locatorName.

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

Хотя пример в этом разделе рассматривает потоковую передачу, этот же вызов можно использовать, чтобы создать указатель потоковой передачи для передачи видео с помощью поэтапной загрузки.While the sample in this topic discusses streaming, you can use the same call to create a Streaming Locator for delivering video via progressive download.

Получение URL-адресов потоковой передачиGet streaming URLs

После создания указателя потоковой передачи можно получить URL-адреса потоковой передачи, как показано в разделе GetStreamingURLs.Now that the Streaming Locator has been created, you can get the streaming URLs, as shown in GetStreamingURLs. Чтобы создать URL-адрес, необходимо сцепить имя узла конечной точки потоковой передачи и путь указателя потоковой передачи.To build a URL, you need to concatenate the Streaming Endpoint host name and the Streaming Locator path. В этом примере используется конечная точка потоковой передачи по умолчанию.In this sample, the default Streaming Endpoint is used. При первом создании учетной записи Служб мультимедиа эта конечная точка потоковой передачи по умолчанию будет находиться в состоянии "Остановлено", поэтому вам необходимо вызвать функцию Start.When you first create a Media Service account, this default Streaming Endpoint will be in a stopped state, so you need to call Start.

Примечание

В этом методе вам необходим locatorName, который использовался при создании указателя потоковой передачи для выходного ресурса.In this method, you need the locatorName that was used when creating the Streaming Locator for the output Asset.

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 != null)
    {
        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;
}

Очистка ресурсов в учетной записи Служб мультимедиаClean up resources in your Media Services account

Как правило, необходимо очистить все, кроме объектов, которые вы планируете использовать повторно. Обычно повторно используются преобразования и сохраняются StreamingLocators и т. д.Generally, you should clean up everything except objects that you're planning to reuse (typically, you'll reuse Transforms, and you'll persist StreamingLocators, etc.). Если учетную запись требуется очистить после эксперимента, удалите ресурсы, которые не планируется использовать повторно.If you want your account to be clean after experimenting, delete the resources that you don't plan to reuse. Удалить задание, созданные ресурсы и политику ключа содержимого можно с помощью следующего кода:For example, the following code deletes the job, created assets and content key policy:

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

Запуск примера приложенияRun the sample app

  1. Нажмите клавиши CTRL+F5, чтобы выполнить приложение EncodeAndStreamFiles.Press Ctrl+F5 to run the EncodeAndStreamFiles app.
  2. Скопируйте URL-адрес потоковой передачи из консоли.Copy one of the streaming URLs from the console.

В этом примере отображаются URL-адреса, которые можно использовать для воспроизведения видео с помощью различных протоколов:This example displays URLs that can be used to play back the video using different protocols:

Пример вывода URL-адресов для потоковой передачи видео в Службу мультимедиа

Тестирование URL-адреса потоковой передачи.Test the streaming URL

Для тестирования потоковой передачи в этой статье используется Проигрыватель мультимедиа Azure.To test the stream, this article uses Azure Media Player.

Примечание

Если проигрыватель размещен на сайте HTTPS, обновите URL-адрес до HTTPS.If a player is hosted on an https site, make sure to update the URL to "https".

  1. Откройте браузер и перейдите по ссылке https://aka.ms/azuremediaplayer/.Open a web browser and navigate to https://aka.ms/azuremediaplayer/.
  2. В поле URL: (URL-адрес:) вставьте одно из значений URL-адресов потоковой передачи, полученных при работе приложения.In the URL: box, paste one of the streaming URL values you got when you ran the app.
  3. Выберите Update Player (Обновить проигрыватель).Select Update Player.

Проигрыватель мультимедиа Azure можно использовать для тестирования, но его нельзя применять в рабочей среде.Azure Media Player can be used for testing but shouldn't be used in a production environment.

Очистка ресурсовClean up resources

Если вам больше не нужны какие-либо ресурсы в группе ресурсов, включая Службы мультимедиа и учетные записи хранения, созданные для этого руководства, удалите группу ресурсов, созданную ранее.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.

Выполните следующую команду CLI:Execute the following CLI command:

az group delete --name amsResourceGroup

МногопоточностьMultithreading

Пакеты SDK для Служб мультимедиа Azure версии 3 не являются потокобезопасными.The Azure Media Services v3 SDKs aren't thread-safe. При разработке многопоточного приложения необходимо создать и использовать новый объект AzureMediaServicesClient для каждого потока.When developing a multi-threaded app, you should generate and use a new AzureMediaServicesClient object per thread.

Получение справки, отправка отзывов, получение обновленийAsk questions, give feedback, get updates

Прочитайте статью сообщества Служб мультимедиа Azure, чтобы узнать, как задавать вопросы, оставлять отзывы и получать новости о Службах мультимедиа.Check out the Azure Media Services community article to see different ways you can ask questions, give feedback, and get updates about Media Services.

Дальнейшие действияNext steps

Теперь, когда вы знаете, как отправлять, кодировать и выполнять потоковую передачу своего видео, перейдите к следующей статье:Now that you know how to upload, encode, and stream your video, see the following article: