Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1852823
  • 博文数量: 274
  • 博客积分: 2366
  • 博客等级: 大尉
  • 技术积分: 1880
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-22 09:37
文章分类

全部博文(274)

文章存档

2022年(1)

2020年(10)

2019年(7)

2018年(18)

2017年(26)

2016年(32)

2015年(43)

2014年(30)

2013年(44)

2012年(36)

2011年(17)

2010年(10)

分类: LINUX

2012-10-20 09:30:40

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.
阅读(4028) | 评论(0) | 转发(1) |
0

上一篇:realloc 崩溃

下一篇:遭遇bus error

给主人留下些什么吧!~~