导出的慢动作视频有音频问题

Exported slow motion video has audio issues

我正在开发一款应用程序,可让您将从用户的照片库中选择的照片和视频合并到一部电影中。到目前为止,我的应用程序可以轻松处理常规视频、实时照片(作为视频)和静态照片。但是,我在处理慢动作视频时遇到了很多麻烦(就此而言还有时间流逝)。

我的主要问题是:慢动作视频的慢动作片段中的音频极度失真(例如,听起来有点嗡嗡声、机器人和断断续续)。视频会正常显示。

根据 的答案,我决定首先使用 AVAssetExportSession 和最高质量预设将慢动作视频的 AVComposition 导出到临时目录,然后使用生成的文件创建一个 AVURLAsset 以供我使用作品。我可以确认这个最初导出的视频也有音频失真。我所做的只是尝试导出我从 PHAsset 中获取的 AVAsset 而不做任何更改。

我的问题是:我怎样才能从用户的库中获取慢动作视频并将其作为 .mov 文件导出到临时目录,以便它按预期播放,慢动作片段的音频正确音高移动而没有极度失真?

难道 AVAssetExportSession 不能处理这个问题吗?我应该改用 AVAssetWriter 吗?我不确定发布任何代码是否有帮助,因为我所做的只是设置一个临时目录路径和一个 AVAssetExportSession 来导出 AVComposition,它成功了。

我的应用程序是 Swift,但我会在 Objective C 中回答。

我的一个应用程序也遇到了类似的问题,对从库中选择的视频应用过滤器,然后导出它们。正如您所说,慢动作视频中的音频严重失真。我想我已经找到了适合我的情况的解决方案,希望它对您有所帮助。

TLDR 检查应用程序中任何 AVPlayer 上的 audioTimePitchAlgorithm,尤其是 AVAssetExportSession 的任何实例 - 确保将其设置为 .varispeed

根据 documentation audioTimePitchAlgorithm 在 AVPlayer 或 AVAssetExportSession 的任何实例上的默认值是 .spectral,这是最高质量但会保持恒定的音高。我认为在慢动作视频中保持恒定音高的尝试会产生不需要的失真效果。切换到 .varispeed 会按预期生成导出的视频,并带有变调的音频。

这是我为此目的实例化 AVAssetExportSession 的代码:

    let compatiblePresets = AVAssetExportSession.exportPresets(compatibleWith: asset)
    var preset: String = AVAssetExportPresetPassthrough
    if compatiblePresets.contains(outputQuality) { preset = outputQuality }
    let session = AVAssetExportSession.init(asset: asset, presetName: preset)
    session?.audioTimePitchAlgorithm = **.varispeed**

希望对您有所帮助,

皮特