我使用Azure Media服务对上传的视频进行编码以进行流式传输。我想用不同的音频源替换音频轨道。我已经为编码创建了自定义预设配置,但我还没有找到替换或覆盖不同音频的方法。这可能吗?
答案 0 :(得分:0)
首先,我假设您正在尝试使用Media Encoder Standard,而不是已弃用的Azure Media Encoder。
替换音频源是否与视频同步/对齐 - 相同的开始时间戳,相同的持续时间等?
虽然叠加功能在这种情况下不起作用(它最终会混合来自原始音频和替换的音频),但您可以尝试一种简单的解决方法,要求内容时间对齐。我今天晚些时候可以分享示例代码。
答案 1 :(得分:0)
下面的解决方法有三个部分:
仅视频编码预设 将下面的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"
}
}
]
}
<强>编码 下面的代码假定您将视频文件上传为Asset myVideoAsset,并将音频文件作为Asset 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.