AVAssetWriter设置采样率与输入不一致是否会导致音视频漂移?
AVAssetWriter音频采样率设置相关问题解答
采样率不匹配是否会导致音视频漂移?
会,而且大概率引发同步问题。
AVAssetWriter依靠音频样本缓冲区的时间戳(CMSampleBuffer的presentationTimeStamp)对齐音视频时间轴。如果你在outputSettings中通过AVSampleRateKey指定的采样率,和待写入的音频样本缓冲区实际采样率不一致,Writer会强制按照你设置的采样率计算音频播放时长:
- 比如输入缓冲区实际是44100Hz,你设成48000Hz,Writer会把原本对应1秒播放时长的音频帧,判定为仅对应约0.919秒,导致音频播放速度加快,和视频的同步点逐渐偏移;
- 反之若设置的采样率低于实际采样率,音频会被放慢,同样会出现音视频不同步。
除此之外,这种不匹配还可能导致音频失真、部分帧被丢弃,甚至触发写入错误。
是否不建议随意指定采样率?
是的,绝对不建议随意设置AVSampleRateKey,必须保证它和待写入的音频样本缓冲区的实际采样率完全一致。
需要注意的是,canApply(outputSettings:forMediaType:)这个API只会验证配置本身是否合法(比如参数格式正确、当前编码器支持该采样率),但不会检查该采样率和后续输入的缓冲区是否匹配——哪怕这个API返回YES,采样率不匹配的问题依然会存在。
如果需要将音频转换为目标采样率,不能直接在Writer的配置里修改参数,必须先对输入的音频缓冲区做采样率转换(比如使用AVAudioConverter将缓冲区转成目标采样率),再将转换后的缓冲区写入AVAssetWriter,同时把outputSettings里的AVSampleRateKey设为转换后的采样率。
内容的提问来源于stack exchange,提问作者Deepak Sharma
相关产品推荐
相关产品推荐

