使用Azure Media Encoder替换视频上的音频

时间:2017-10-05 20:00:56

标签: azure-media-services azure-sdk-.net

我使用Azure Media服务对上传的视频进行编码以进行流式传输。我想用不同的音频源替换音频轨道。我已经为编码创建了自定义预设配置,但我还没有找到替换或覆盖不同音频的方法。这可能吗?

2 个答案:

答案 0 :(得分:0)

首先,我假设您正在尝试使用Media Encoder Standard,而不是已弃用的Azure Media Encoder。

替换音频源是否与视频同步/对齐 - 相同的开始时间戳,相同的持续时间等?

虽然叠加功能在这种情况下不起作用(它最终会混合来自原始音频和替换的音频),但您可以尝试一种简单的解决方法,要求内容时间对齐。我今天晚些时候可以分享示例代码。

答案 1 :(得分:0)

下面的解决方法有三个部分:

  1. 描述了对视频文件进行仅视频编码的预设
  2. 描述了对叠加/替换文件进行纯音频编码的预设
  3. 代码块,显示如何使用写入同一输出资产的两个任务提交作业
  4. 仅视频编码预设 将下面的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.