精简ADTS AAC的方法
dwing吧
全部回复
仅看楼主
level 9
roo_zhou 楼主
前几天为了修正ffmpeg处理aac的问题研究了一下ADTS
同时想到dwing在做高压游戏时经常用到aac,可以设法去掉adts header使得文件更小
先简单讲一下对于ADTS header的结构的理解:
1)ADTS header位于每一个aac帧的开头,长度一般是7字节(也可以是9字节的,没见过)。
2)每个aac帧的长度固定为1024个sample(可以是1024*n,没见过n>1的情况)。
3)ADTS header中大部分信息无用,有用的只有采样率(4bit)、声道数(3bit)和帧的大小(13bit),这三项总共只有20bit。
mp4格式会集中存放每一个frame的index,每个index占4个字节。但因为mp4本身还有其他tag,所以对于较短的小文件冗余依然比ADTS大。
那么一个20kpbs的48kHz he-aac语音,如果用ADTS存放,冗余数据占的比例可以这么计算
1)每秒的大小是20/8 = 2560 Byte
2) 每秒有24000/1024 = 23.4375帧(开启后SBR只有一半的采样率)
3)每秒ADTS header的大小是7*23.4375=164.0625 Byte
4) 冗余数据占的比例是164.0625 / 2560 = 6.4%
可见还是相当大的
现在用这样的方法来精简:
文件开头是3字节表示总帧数n,1字节包含采样率和声道数(可以直接用ADTS header里的数据),然后接下来2*n个字节表示每一帧的大小,之后就把去掉ADTS header的aac帧连续存放。播放时,可以非常方便的加上ADTS header,也可以直接将aac帧传给解码器(faad2两种格式都支持)。
这样大约可以让AAC文件的体积减小6.4%*5/7=4.57%。以Clannad为例,20k
bp
s的语音体积大概是300M,如此精简可以节省大概14M,而且这14M是7z难以压缩的部分。
如果dwing大还有精简游戏的计划可以考虑这种方法。
2009年05月11日 14点05分 1
level 13
嗯...其实这些我以前也分析过,也考虑过如此精简,只是因为不是精简的重点,未去实现而已.这比UCI的开发重要度低得多.
2009年05月12日 01点05分 2
level 9
roo_zhou 楼主
至少这部分属于无损的
另外降低采样率同样可以减少冗余,可以考虑压缩语音时将采样率降到32k
2009年05月12日 01点05分 3
level 0
对嘛。
这才是有意义的应用
2009年05月12日 04点05分 4
level 0
那请问如何去掉无用信息呢,我有一个大段音频AAC是ADTS的,有没有软件可以做到?
2009年07月08日 15点07分 5
level 9
roo_zhou 楼主
我说的方法,显然只能自己写软件实现
你码率多高?如果很高的话无所谓去不去掉了
2009年07月08日 16点07分 6
level 13
这种冗余的消除虽然是无损的,但不是透明的,解码时无法直接被AAC parser识别,要么自己修改parser,要么做一个还原层.
2009年07月09日 01点07分 7
level 0
同意七楼的说话!
2009年10月28日 03点10分 8
level 7
改用ADIF封装如何?
2009年10月28日 03点10分 9
level 9
roo_zhou 楼主
ADIF格式相当于把所有的帧直接顺序存放,header里没有samplerate,channel之类的信息,也没有索引,如果不调用解码器是无法将帧分割出来的
2009年10月28日 07点10分 10
level 7
有必要单独把帧分割出来吗?
FAAD也支持直接播放,也能用FAAD转换为ADTS AAC。
而aacinfo中可以看到
正确的
sampling_rate。
2009年10月28日 12点10分 11
level 0
问一下 我要把AAC 编码的打包 成TS流 格式 能给个建议吗?
ADTS 本身就是TS格式吗?
2009年12月10日 07点12分 12
level 0
???
2009年12月24日 07点12分 13
level 9
roo_zhou 楼主
ADTS和TS是两种格式,TS里还要包含视频
2009年12月24日 08点12分 14
level 1
请问楼主有无aac的spec?
2012年09月15日 07点09分 16
level 1
2013年05月20日 08点05分 17
level 1
请问aac文件转成每帧加入adts头后,可以直接存成ts文件,然后做成支持hls的音频流媒体吗?
2014年06月16日 13点06分 18
1