如果我使用 AVAssetExportPresetPassthrough,则忽略 AVAssetExportSession AudioMix

问题描述

我正在尝试通过 AVAssetExportSession AudioMix 属性修改视频音频。

除了声音修改之外,我不会修剪或做任何其他事情。因此,我尝试使用 AVAssetExportPresetPassthrough 并应用相关的 AudioMixAVAssetExportSession 有效,但声音保持不变。如果我将预设更改为 AVAssetExportPresetHighestQuality,它会慢得多,但音频更改有效。

代码

let exportSession = AVAssetExportSession(asset: asset,presetName: AVAssetExportPresetPassthrough)
exportSession.audioMix = audioMix // ignored

let exportSession = AVAssetExportSession(asset: asset,presetName: AVAssetExportPresetHighestQuality)
exportSession.audioMix = audioMix // works

知道为什么吗?提前致谢!

解决方法

通过修改 audioMix,您不会通过。并且没有单程方式可以说“通过视频轨道并解码/应用 audioMix 然后重新编码为 AVAssetExportPresetHighestQuality”,因此您可以尝试两步法:

使用 AVMutableComposition 自行导出音轨[创建一个仅包含该音轨的 AVAssetExportPresetHighestQuality]:

let exportSession = AVAssetExportSession(asset: audioOnlyMutableComposition,presetName: AVAssetExportPresetHighestQuality)
exportSession.audioMix = audioMix

然后创建一个包含原始视频轨道和新创建的混合音轨的新 AVMutableComposition,并通过 AVAssetExportPresetPassthrough AVAssetExportSession 传递乐曲。