Замена звука на видео с помощью Azure Media Encoder

Я использую службы мультимедиа Azure для кодирования загруженных видео для потоковой передачи. Я хотел бы заменить звуковую дорожку другим источником звука. Я уже создаю пользовательскую предустановленную конфигурацию для кодировки, но не нашел способа заменить или наложить другой звук. Это возможно?


person Scott Stevenson    schedule 05.10.2017    source источник


Ответы (2)


Прежде всего, я предполагаю, что вы пытаетесь использовать Media Encoder Standard, а не устаревший Azure Media Encoder.

Является ли заменяющий источник звука синхронизированным/выровненным по времени относительно видео — та же метка времени начала, та же продолжительность и т. д.?

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

person Anil Murching    schedule 05.10.2017
comment
Да, я использую Media Encoder Standard, и звук имеет ту же продолжительность, что и видео. - person Scott Stevenson; 06.10.2017

Обходной путь ниже состоит из трех разделов:

  1. Описывает предустановку, выполняющую кодирование видеофайла только для видео.
  2. Описывает предустановку, выполняющую аудиокодирование файла наложения/замены.
  3. Блок кода, который показывает, как отправить Задание с двумя Заданиями, которые записывают в один и тот же выходной Актив.

Предустановка кодирования только для видео Сохраните приведенный ниже JSON в подходящий файл, например "C:\TEMP\VideoOnly.json". В качестве примера я буду использовать один параметр битрейта, чтобы JSON был кратким.

{
  "Version": 1.0,
  "Codecs": [
  {
    "KeyFrameInterval": "00:00:02",
    "H264Layers": [
       {
         "Profile": "Auto",
         "Level": "auto",
         "Bitrate": 2500,
         "MaxBitrate": 2500,
         "BufferWindow": "00:00:05",
         "Width": 1280,
         "Height": 720,
         "BFrames": 3,
         "Type": "H264Layer",
         "FrameRate": "0/1"
       }
     ],
    "Type": "H264Video"
   }
  ],
  "Outputs": [
  {
    "FileName": "{Basename}_{Resolution}_{Bitrate}.mp4",
    "Format": {
       "Type": "MP4Format"
    }
  }
 ]
}

Предустановка кодирования только аудио Сохраните приведенный ниже JSON в подходящий файл, скажем, «C:\TEMP\AudioOnly.json».

{
  "Version": 1.0,
  "Codecs": [
    {
      "Profile": "AACLC",
      "Channels": 2,
      "SamplingRate": 48000,
      "Bitrate": 128,
      "Type": "AACAudio"
    }
  ],
 "Outputs": [
    {
      "FileName": "{Basename}_AAC_{AudioBitrate}.mp4",
      "Format": {
         "Type": "MP4Format"
      }
    }
  ]
}

Кодирование В приведенном ниже коде предполагается, что видеофайл загружен как объект myVideoAsset, а аудиофайл загружен как объект myAudioAsset.

        string videoConfig = File.ReadAllText(_presetFiles + @"C:\TEMP\VideoOnly.json");
        string audioConfig = File.ReadAllText(_presetFiles + @"C:\TEMP\AudioOnly.json");


        // Prepare a job with two Tasks that write to the same Asset
        IJob job = _context.Jobs.Create(@"Encoding " + myVideoAsset.Name + @" and " + myAudioAsset.Name);
        IMediaProcessor mediaProcessor = GetLatestMediaProcessorByName("Media Encoder Standard");

        ITask videoTask = job.Tasks.AddNew("Video Task", mediaProcessor, videoConfig, TaskOptions.DoNotCancelOnJobFailure | TaskOptions.DoNotDeleteOutputAssetOnFailure);
        videoTask.InputAssets.Add(myVideoAsset);
        IAsset outputAsset = videoTask.OutputAssets.AddNew(myVideoAsset.Name + @" plus " + myAudioAsset.Name + @ - Encoded", options: AssetCreationOptions.None, formatOption: AssetFormatOption.None);

        ITask audioTask = job.Tasks.AddNew("Audio Task", mediaProcessor, audioConfig, TaskOptions.DoNotCancelOnJobFailure | TaskOptions.DoNotDeleteOutputAssetOnFailure);
        audioTask.InputAssets.Add(myAudioAsset);
        audioTask.OutputAssets.Add(outputAsset); // Note the re-use of outputAsset here

        Console.WriteLine("Submitting transcoding job...");
        job.Submit();
        // Wait for job to succeed, etc.
person Anil Murching    schedule 06.10.2017
comment
Так что это имеет смысл для меня, и похоже, что работа доходит до конца и терпит неудачу. Ошибка: Произошла ошибка. Стадия: Загрузка выходного актива. Код: System.InvalidOperationException. Есть идеи, что это может означать? В задании есть выходной актив, и у него есть два артефакта mp4... один - аудиофайл, который в порядке, и видеофайл, в котором нет звука. - person Scott Stevenson; 09.10.2017