Восстановление миниатюры из существующего ресурса в службах мультимедиа Azure - PullRequest
0 голосов
/ 20 сентября 2018

Я использую службы мультимедиа Azure и функции Azure для создания элемента VOD для веб-сайта.Обычно при загрузке исходного видео триггер BLOB-объектов запускает DurableOrchestration, чтобы создать ресурс, а затем кодировать видео.Он также генерирует 3 миниатюры разных размеров, используя рамку по умолчанию {Best}.Пока все хорошо.

Теперь я хочу позволить пользователю выбрать кадр из закодированного видео и выбрать его в качестве эскиза плаката.

У меня есть HttpTrigger, который принимаетидентификатор ресурса и метка времени кадра и запускает другую долговременную функцию, которая должна воссоздать миниатюры в указанном кадре.

Но это не работает.

Изначально я получил 3 пустых изображения вновый актив, и когда я попытался заставить его вернуть изображения в исходный ресурс, я ничего не получил.

Это код, который я использую, чтобы попытаться достичь этого.Это почти то же самое, что и код для создания исходного ресурса.Единственное реальное отличие состоит в том, что в пресете json есть только инструкция для создания миниатюр, в активе уже есть 6 закодированных видео, 3 миниатюры и связанные метафайлы, и я не передаю исходный видеофайл в него (потому что я удаляюэто как часть очистки, как только оригинальная кодировка будет завершена).

        PostData data = inputs.GetInput<PostData>();

        IJob job = null;
        ITask taskEncoding = null;
        IAsset outputEncoding = null;
        int OutputMES = -1;
        int taskindex = 0;
        bool useEncoderOutputForAnalytics = false;
        MediaServicesCredentials amsCredentials = new MediaServicesCredentials();
        try
        {
            AzureAdTokenCredentials tokenCredentials = new AzureAdTokenCredentials(amsCredentials.AmsAadTenantDomain,
                                                    new AzureAdClientSymmetricKey(amsCredentials.AmsClientId, amsCredentials.AmsClientSecret),
                                                    AzureEnvironments.AzureCloudEnvironment);

            AzureAdTokenProvider tokenProvider = new AzureAdTokenProvider(tokenCredentials);

            _context = new CloudMediaContext(amsCredentials.AmsRestApiEndpoint, tokenProvider);
            IAsset asset = _context.Assets.Where(a => a.Id == data.assetId).FirstOrDefault();

            // Declare a new encoding job with the Standard encoder
            int priority = 10;
            job = _context.Jobs.Create("CMS encoding job", priority);

            foreach (var af in asset.AssetFiles)
            {
                if (af.Name.Contains(".mp4)"))
                    af.IsPrimary = true;
                else
                    af.IsPrimary = false;
            }

            // Get a media processor reference, and pass to it the name of the 
            // processor to use for the specific task.
            IMediaProcessor processorMES = MediaServicesHelper.GetLatestMediaProcessorByName(_context, "Media Encoder Standard");

            string preset = null;

            preset = "MesThumbnails.json";  // the default preset

            string start = data.frame;

            if (preset.ToUpper().EndsWith(".JSON"))
            {
                // Build the folder path to the preset
                string presetPath = Path.Combine(System.IO.Directory.GetParent(data.execContext.FunctionDirectory).FullName, "presets", preset);
                log.Info("presetPath= " + presetPath);
                preset = File.ReadAllText(presetPath).Replace("{Best}", start);
            }

            taskEncoding = job.Tasks.AddNew("rebuild thumbnails task",
               processorMES,
               preset,
               TaskOptions.None);

            // Specify the input asset to be encoded.
            taskEncoding.InputAssets.Add(asset);
            OutputMES = taskindex++;

            string _storageAccountName = amsCredentials.StorageAccountName;
            outputEncoding = taskEncoding.OutputAssets.AddNew(asset.Name + " MES encoded", _storageAccountName, AssetCreationOptions.None);

            asset = useEncoderOutputForAnalytics ? outputEncoding : asset;

            job.Submit();
            await job.GetExecutionProgressTask(CancellationToken.None);

Мой вопрос заключается в том, возможно ли то, что я пытаюсь сделать, и если да, то что не так с подходом, который я использую?m take.

Я довольно много искал по этой теме, но всегда могу найти только ссылку на создание миниатюр во время кодирования видео, но никогда не генерировать миниатюры из кодированных видео после события.

1 Ответ

0 голосов
/ 24 сентября 2018

Я не передаю исходный видеофайл в него. Вероятно, поэтому вы столкнулись с проблемой.Вывод вашего задания адаптивной потоковой передачи, как вы видели, содержит несколько файлов.Есть несколько дополнительных флагов, необходимых для задания задания создания миниатюр, чтобы он фокусировался только на одном файле (обычно это файл с самой высокой скоростью передачи битов).Приведенный ниже пресет должен помочь.

  1. Обратите внимание, как пресет начинается с секции Streams, в которой кодировщик выбирает самый высокий / максимальный битрейт для видео и аудио
  2. Обратите внимание, что для шага установлено значение 2, а для диапазона установлено значение 1, при этом в выходных данных создается только одно изображение

{
  "Version": 1.0,
  "Sources": [
    {
      "Streams": [
        {
          "Type": "AudioStream",
          "Value": "TopBitrate"
        },
        {
          "Type": "VideoStream",
          "Value": "TopBitrate"
        }
      ]
    }
  ],
  "Codecs": [
    {
      "Start": "00:00:03:00",
      "Step": "2",
      "Range": "1",
      "Type": "JpgImage",
      "JpgLayers": [
        {
          "Quality": 90,
          "Type": "JpgLayer",
          "Width": "100%",
          "Height": "100%"
        }
      ]
    }
  ],
  "Outputs": [
    {
      "FileName": "{Basename}_{Index}{Extension}",
      "Format": {
        "Type": "JpgFormat"
      }
    }
  ]
}
...