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
同时想到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大还有精简游戏的计划可以考虑这种方法。
