转 ipad播放44100采样率音频爆音问题分析

4074阅读 0评论2012-10-20 pppStar
分类:LINUX

ipad播放44100采样率音频爆音问题分析
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.
上一篇:realloc 崩溃
下一篇:遭遇bus error