我正在开发一个应用程序,该程序可让您将从用户的照片库中选择的照片和视频合并到单个电影中。到目前为止,我的应用程序可以轻松处理常规视频,实时照片(作为视频)和静态照片。但是,我在慢动作视频方面遇到了很多麻烦(就此而言,时间流逝)。
我的主要问题是:慢动作视频的慢动作片段中的音频极度失真(例如,听起来像是嗡嗡声,机械声音和断断续续的声音)。视频将按原样显示。
从this question的答案中,我决定首先使用AVAssetExportSession和最高质量的预设将慢动作视频的AVComposition导出到临时目录,然后使用生成的文件创建一个AVURLAsset以用于我的作品。我可以确认此最初导出的视频也有音频失真。我正在做的就是尝试不做任何更改就导出从PHAsset获取的AVAset。
我的问题是:如何从用户库中获取慢动作视频并将其作为.mov文件导出到临时目录中,从而使其按预期播放,并且慢动作段的音频正确调整了音调而没有极端失真?
AVASsetExportSession是否不能正确处理此权限?我应该改用AVAssetWriter吗?我不确定发布任何代码是否会有所帮助,因为我所做的只是设置临时目录路径和AVAssetExportSession来导出AVComposition,此操作成功。
我的应用程序是Swift编写的,但是我将在Objective C中得到答案。
答案 0 :(得分:1)
我的一个应用程序遇到了类似的问题,将滤镜应用于从库中选择的视频,然后将其导出。如您所说,慢动作视频的音频严重失真。我想我已经找到了解决方案,希望对您有帮助。
TLDR 检查应用中任何AVPlayers上的 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**
希望这会有所帮助,
Pete