ffmpeg转码AAC音频时PTS不匹配及间歇性音频爆音问题咨询
问题原因分析
1. 时间基转换累积误差
你观测到的PTS差值波动本质是浮点时长转整数时间基的舍入误差累积:
- AAC LC编码默认每个音频帧固定为1024采样点,44.1kHz采样率下单帧时长为
1024/44100 ≈ 0.02322s - 你采用mpegts作为中间封装格式,默认音频时间基为1/90000,对应单帧PTS增量的理论值为
0.02322 * 90000 ≈ 2089.8,取整后标记为2089 - 每次取整损失的0.8个时间单位会逐帧累积,累积到足够抹平误差的阈值后就会通过调整单帧PTS增量补平,就出现了你观测到的多数帧差值为2070,每间隔几帧出现一个2160差值的规律。
2. 多级转码的PTS重计算逻辑
你采用了两级ffmpeg级联的转码结构,第二级ffmpeg默认不会复用输入的PTS,会根据音画同步逻辑重新生成PTS,叠加zerolatency参数禁用了帧缓存做平滑校正,进一步放大了PTS波动。
3. 封装格式适配引入的偏移
mpegts封装器默认会做PTS与PCR时钟的对齐调整,加上FLV封装时aac_adtstoasc比特流滤镜的处理逻辑,也会引入额外的PTS偏移。
修复方案
- 固定音频采样率,不要使用
aformat滤镜的双采样率兼容配置,明确指定与源文件一致的采样率,避免采样率切换引入的时长波动:-af "aformat=sample_rates=44100:channel_layouts=stereo" - 第二级转码命令添加
-copyts参数,强制复用输入流的原始PTS,禁止ffmpeg自动重计算PTS - 第一级转码的mpegts输出参数添加
-avoid_negative_ts make_zero,避免负PTS导致的封装偏移 - 优先优化转码架构,取消两级级联的结构,直接在单级ffmpeg中输出多路不同清晰度的FLV流,减少一次封装解封装的PTS转换环节
- 若保留级联结构,可在第一级音频编码参数中添加
-frame_size 1024强制固定AAC帧长,同时添加-async 1开启严格音频同步模式,校正PTS与帧时长的匹配关系
修复后PTS增量会稳定在2089±1的误差范围内,播放器按固定增量推算后续帧位置时不会出现错位,即可解决爆音问题。
内容的提问来源于stack exchange,提问作者eca2ed291a2f572f66f4a5fcf57511
相关产品推荐
相关产品推荐

