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

标签 ios swift avfoundation

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

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

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

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

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

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

最佳答案

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

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

根据 documentation AVPlayer 或 AVAssetExportSession 的任何实例上 audioTimePitchAlgorithm 的默认值是 .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**

希望对您有所帮助,

皮特

关于ios - 导出的慢动作视频有音频问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55443719/

相关文章:

ios - 在 Swift 中使用 Glimpse 时指定文档目录作为文件输出 URL

ios - Swift - 将 UserDefaults 添加到 NotificationCenter

iphone - 录制视频时更改相机捕获设备

ios - 自定义 UitableViewCell 显示表格某些行的重复数据

ios - 试图让后台获取工作

ios - 使用 Xcode 出现错误 "No such module",但框架在那里

ios - 专门使用这行代码时无法解包值

iPhone:自动布局不起作用

ios - Swift 将泛型类型限制为 Type

ios - 检测带有圆角的卡片边缘