1. ipad播放aac音频(44100采样率)爆音的原因分析:
现象:
mp4-->m3u8, 采样率44100,没有问题;
mp4-->flv-->m3u8, 这时候,如果音频采样率是44100,ipad播放就会出现爆音;
mp4-->flv-->mp4-->m3u8, ipad播放也会出现爆音;
原因:
mp4文件的timescale(时间标尺)为90000,90000相当于1秒;
flv文件的timescale为1000,
m3u8的timescale为90000,与mp4相同;
第N帧的时戳计算公式:
mp4文件,timescale=90000, 音频采样率为44100,timestamp1 = N*44100/1024*90000,
flv文件, timescale=1000, 音频采样率为44100,timestamp2 = N*44100/1024*1000,
m3u8, timescale=90000, 音频采样率为44100,timestamp3 = N*44100/1024*90000,
如果由mp4-->flv, timestamp2=timestamp1/90, 由flv-->m3u8, timestamp3=timestamp2*90, 在这个转换过程中,时戳损失了精度,造成了误差;
这也可以解释第三种现象,这损失已经造成,即使反向转换,也无法修复。
解决办法:
将音频采样率设定为32000,这样
mp4 第一帧时戳:90000/(32000/1024)=90000*1024/32000=32*90, 第二帧时戳:2*32*90,第三帧时戳3*32*90, ...第N帧时戳N*32*90
转换为flv, 第一帧时戳:32, 第二帧时戳为2*32, 第三帧时戳为3*32, ...第N帧时戳为N*32
转换为m3u8,第一帧时戳:32*90, 第二时戳为2*32*90,第三帧时戳为3*32*90, 第N帧时戳为N*32*90.
各位,可以尝试一下,将上面的采样率由32000,替换为44100来计算一遍看一下,会发现每一次计算都会有除不尽导致的误差,这误差累计导致了ipad爆音。
通过实验发现,如果修正了这误差,那么ipad不再出现爆音,证实了这一点。
只是这种修正,不具有通用性,建议采取规避办法,将音频采样率设定为32000.