Я использую службы мультимедиа Azure для кодирования загруженных видео для потоковой передачи. Я хотел бы заменить звуковую дорожку другим источником звука. Я уже создаю пользовательскую предустановленную конфигурацию для кодировки, но не нашел способа заменить или наложить другой звук. Это возможно?
Замена звука на видео с помощью Azure Media Encoder
Ответы (2)
Прежде всего, я предполагаю, что вы пытаетесь использовать Media Encoder Standard, а не устаревший Azure Media Encoder.
Является ли заменяющий источник звука синхронизированным/выровненным по времени относительно видео — та же метка времени начала, та же продолжительность и т. д.?
Хотя функция наложения в этом случае не будет работать (в конечном итоге это приведет к смешиванию звука из оригинала с заменой), вы можете попробовать простой обходной путь, требующий выравнивания контента по времени. Я смогу поделиться примером кода позже сегодня.
Обходной путь ниже состоит из трех разделов:
- Описывает предустановку, выполняющую кодирование видеофайла только для видео.
- Описывает предустановку, выполняющую аудиокодирование файла наложения/замены.
- Блок кода, который показывает, как отправить Задание с двумя Заданиями, которые записывают в один и тот же выходной Актив.
Предустановка кодирования только для видео Сохраните приведенный ниже 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.