Настройка предустановок Media Encoder StandardCustomizing Media Encoder Standard presets

ОбзорOverview

В этой статье показано, как выполнять расширенные задачи кодирования с помощью Media Encoder Standard (MES) и пользовательской предустановки.This article shows how to perform advanced encoding with Media Encoder Standard (MES) using a custom preset. В этой статье с помощью .NET создаются задача кодирования и задание, которое выполняет эту задачу.The article uses .NET to create an encoding task and a job that executes this task.

В этой статье показано, как настроить предустановку. Для примера взята предустановка H264 Multiple Bitrate 720p, в которой уменьшается количество уровней.This article shows you how to customize a preset by taking the H264 Multiple Bitrate 720p preset and reducing the number of layers. В статье Настройка предустановок MES для расширенного кодирования показаны пользовательские предустановки, которые могут использоваться для выполнения расширенных задач кодирования.The Customizing Media Encoder Standard presets article demonstrates custom presets that can be used to perform advanced encoding tasks.

Примечание

Пользовательские предустановки, описанные в этой статье, нельзя использовать в преобразованиях служб мультимедиа v3 или командах CLI.The custom presets described in this article cannot be used in Media Services V3 transforms or the CLI commands. Дополнительные сведения см. в руководстве по миграции с версии 2 на v3 .See the migration guidance from v2 to v3 for more details.

Настройка предустановки MESCustomizing a MES preset

Первоначальная предустановкаOriginal preset

Сохраните код JSON, определенный в статье H264 Multiple Bitrate 720p, в отдельный JSON-файл.Save the JSON defined in the H264 Multiple Bitrate 720p article in some file with .json extension. Например, CustomPreset_JSON.json.For example, CustomPreset_JSON.json.

Настроенная предустановкаCustomized preset

Откройте файл CustomPreset_JSON.json и удалите первые три слоя из H264Layers, чтобы файл выглядел, как показано ниже.Open the CustomPreset_JSON.json file and remove first three layers from H264Layers so your file looks like this.

    {  
      "Version": 1.0,  
      "Codecs": [  
        {  
          "KeyFrameInterval": "00:00:02",  
          "H264Layers": [  
            {  
              "Profile": "Auto",  
              "Level": "auto",  
              "Bitrate": 1000,  
              "MaxBitrate": 1000,  
              "BufferWindow": "00:00:05",  
              "Width": 640,  
              "Height": 360,  
              "BFrames": 3,  
              "ReferenceFrames": 3,  
              "AdaptiveBFrame": true,  
              "Type": "H264Layer",  
              "FrameRate": "0/1"  
            },  
            {  
              "Profile": "Auto",  
              "Level": "auto",  
              "Bitrate": 650,  
              "MaxBitrate": 650,  
              "BufferWindow": "00:00:05",  
              "Width": 640,  
              "Height": 360,  
              "BFrames": 3,  
              "ReferenceFrames": 3,  
              "AdaptiveBFrame": true,  
              "Type": "H264Layer",  
              "FrameRate": "0/1"  
            },  
            {  
              "Profile": "Auto",  
              "Level": "auto",  
              "Bitrate": 400,  
              "MaxBitrate": 400,  
              "BufferWindow": "00:00:05",  
              "Width": 320,  
              "Height": 180,  
              "BFrames": 3,  
              "ReferenceFrames": 3,  
              "AdaptiveBFrame": true,  
              "Type": "H264Layer",  
              "FrameRate": "0/1"  
            }  
          ],  
          "Type": "H264Video"  
        },  
        {  
          "Profile": "AACLC",  
          "Channels": 2,  
          "SamplingRate": 48000,  
          "Bitrate": 128,  
          "Type": "AACAudio"  
        }  
      ],  
      "Outputs": [  
        {  
          "FileName": "{Basename}_{Width}x{Height}_{VideoBitrate}.mp4",  
          "Format": {  
            "Type": "MP4Format"  
          }  
        }  
      ]  
    }  

Кодирование с помощью пакета SDK служб мультимедиа для .NETEncoding with Media Services .NET SDK

В следующем примере кода пакет SDK служб мультимедиа используется для выполнения следующих задач.The following code example uses Media Services .NET SDK to perform the following tasks:

  • Создание задания кодирования.Create an encoding job.

  • Получение ссылки на стандартный кодировщик мультимедиа.Get a reference to the Media Encoder Standard encoder.

  • Загрузите пользовательскую предустановку JSON, созданную в предыдущем разделе.Load the custom JSON preset that you created in the previous section.

      // Load the JSON from the local file.
      string configuration = File.ReadAllText(fileName);  
    
  • Добавление задачи кодирования в задание.Add an encoding task to the job.

  • Указание входного ресурса-контейнера для кодирования.Specify the input asset to be encoded.

  • Создание выходного ресурса-контейнера с закодированным ресурсом.Create an output asset that contains the encoded asset.

  • Добавление обработчика событий для проверки хода выполнения задания.Add an event handler to check the job progress.

  • Отправка задания.Submit the job.

Создание и настройка проекта Visual StudioCreate and configure a Visual Studio project

Настройте среду разработки и заполните файл App. config сведениями о соединении, как описано в разделе Разработка служб мультимедиа с помощью .NET.Set up your development environment and populate the app.config file with connection information, as described in Media Services development with .NET.

ПримерExample

using System;
using System.Configuration;
using System.IO;
using System.Linq;
using Microsoft.WindowsAzure.MediaServices.Client;
using System.Threading;

namespace CustomizeMESPresests
{
    class Program
    {
        // Read values from the App.config file.
        private static readonly string _AADTenantDomain =
            ConfigurationManager.AppSettings["AMSAADTenantDomain"];
        private static readonly string _RESTAPIEndpoint =
            ConfigurationManager.AppSettings["AMSRESTAPIEndpoint"];
        private static readonly string _AMSClientId =
            ConfigurationManager.AppSettings["AMSClientId"];
        private static readonly string _AMSClientSecret =
            ConfigurationManager.AppSettings["AMSClientSecret"];

        // Field for service context.
        private static CloudMediaContext _context = null;

        private static readonly string _mediaFiles =
            Path.GetFullPath(@"../..\Media");

        private static readonly string _singleMP4File =
            Path.Combine(_mediaFiles, @"BigBuckBunny.mp4");

        static void Main(string[] args)
        {
            AzureAdTokenCredentials tokenCredentials =
                new AzureAdTokenCredentials(_AADTenantDomain,
                    new AzureAdClientSymmetricKey(_AMSClientId, _AMSClientSecret),
                    AzureEnvironments.AzureCloudEnvironment);

            var tokenProvider = new AzureAdTokenProvider(tokenCredentials);

            _context = new CloudMediaContext(new Uri(_RESTAPIEndpoint), tokenProvider);

            // Get an uploaded asset.
            var asset = _context.Assets.FirstOrDefault();

            // Encode and generate the output using custom presets.
            EncodeToAdaptiveBitrateMP4Set(asset);

            Console.ReadLine();
        }

        static public IAsset EncodeToAdaptiveBitrateMP4Set(IAsset asset)
        {
            // Declare a new job.
            IJob job = _context.Jobs.Create("Media Encoder Standard Job");
            // Get a media processor reference, and pass to it the name of the 
            // processor to use for the specific task.
            IMediaProcessor processor = GetLatestMediaProcessorByName("Media Encoder Standard");

            // Load the XML (or JSON) from the local file.
            string configuration = File.ReadAllText("CustomPreset_JSON.json");

            // Create a task
            ITask task = job.Tasks.AddNew("Media Encoder Standard encoding task",
            processor,
            configuration,
            TaskOptions.None);

            // Specify the input asset to be encoded.
            task.InputAssets.Add(asset);
            // Add an output asset to contain the results of the job. 
            // This output is specified as AssetCreationOptions.None, which 
            // means the output asset is not encrypted. 
            task.OutputAssets.AddNew("Output asset",
            AssetCreationOptions.None);

            job.StateChanged += new EventHandler<JobStateChangedEventArgs>(JobStateChanged);
            job.Submit();
            job.GetExecutionProgressTask(CancellationToken.None).Wait();

            return job.OutputMediaAssets[0];
        }

        private static void JobStateChanged(object sender, JobStateChangedEventArgs e)
        {
            Console.WriteLine("Job state changed event:");
            Console.WriteLine("  Previous state: " + e.PreviousState);
            Console.WriteLine("  Current state: " + e.CurrentState);
            switch (e.CurrentState)
            {
                case JobState.Finished:
                    Console.WriteLine();
                    Console.WriteLine("Job is finished. Please wait while local tasks or downloads complete...");
                    break;
                case JobState.Canceling:
                case JobState.Queued:
                case JobState.Scheduled:
                case JobState.Processing:
                    Console.WriteLine("Please wait...\n");
                    break;
                case JobState.Canceled:
                case JobState.Error:

                    // Cast sender as a job.
                    IJob job = (IJob)sender;

                    // Display or log error details as needed.
                    break;
                default:
                    break;
            }
        }

        private static IMediaProcessor GetLatestMediaProcessorByName(string mediaProcessorName)
        {
            var processor = _context.MediaProcessors.Where(p => p.Name == mediaProcessorName).
            ToList().OrderBy(p => new Version(p.Version)).LastOrDefault();

            if (processor == null)
                throw new ArgumentException(string.Format("Unknown media processor", mediaProcessorName));

            return processor;
        }

    }
}

См. такжеSee also

Схемы обучения работе со службами мультимедиаMedia Services learning paths

Службы мультимедиа версии 3 (последняя версия)Media Services v3 (latest)

Ознакомьтесь с последней версией служб мультимедиа Azure.Check out the latest version of Azure Media Services!

Службы мультимедиа версии 2 (прежняя версия)Media Services v2 (legacy)

Предоставление отзываProvide feedback

На форуме User Voice можно оставить свои отзывы о работе служб мультимедиа Azure или предложения по их улучшению.Use the User Voice forum to provide feedback and make suggestions on how to improve Azure Media Services. Вы также можете перейти непосредственно к одной из следующих категорий:You also can go directly to one of the following categories: