织梦CMS - 轻松建站从此开始!

罗索

AAC文件格式 之 24小时精通

罗索客 发布于 2009-11-19 22:30 点击:次 
今天有了一个新任务,要把RTSP的音频流存成文件,格式是AAC的。花了很长时间去找ISO的文档,ISO是收费的,网络是免费了,虽然难了点,但还是找到了部分的文档。其中辛苦不足为外人道也。
TAG:

今天有了一个新任务,要把RTSP的音频流存成文件,格式是AAC的。
网上找了很久,也没有找到关于AAC文件的格式。
后来请教了一个专门作编解码的同事,在ISO MPEG的文档里可能会有相关的信息。
花了很长时间去找ISO的文档,ISO是收费的,网络是免费了,虽然难了点,但还是找到了部分的文档。其中辛苦不足为外人道也。
在找了个quicktime可以播放的aac文件,边看文档,边分析一下,总算是基本搞定了。但是有的文档没找到,还有些字段不知是什么意思。不管了,反正能放了:)
 
AAC格式是frame head + frame length, 没有文件头。感到比较奇怪的,我觉得应该是有文件头的,文档上也有adts_fixed_header,但是好像没有头quicktime也能放,那就先不管了吧。
参见ISO/IEC 11496-3 1.1 Interchange format streams  

 

  1. adts_frame()  
  2. {  
  3. byte_alignment()  
  4. adts_fixed_header()  
  5. adts_variable_header()  
  6. adts_error_check()  
  7. ÓISO/IEC ISO/IEC CD 14496-3 Subpart 4: 1998  
  8. MPEG-4 CD 14496-3 Subpart 4 / 20:09 / 22.06.98 11  
  9. for( i=0; i<number_of_raw_data_blocks_in_frame+1; i++) {  
  10. raw_data_block()  
  11. }  
  12. }  
  13.    
  14. adts_fixed_header()  
  15. {  
  16. syncword      12 bslbf  
  17. ID        1 bslbf  
  18. layer       2 uimsbf  
  19. protection_absent    1 bslbf  
  20. profile      2 uimsbf  
  21. sampling_frequency_index  4 uimsbf  
  22. private_bit     1 bslbf  
  23. channel_configuration   3 uimsbf  
  24. original/copy     1 bslbf  
  25. home       1 bslbf  
  26. emphasis      2 bslbf  
  27. }  
  28.    
  29. adts_variable_header()  
  30. {  
  31. copyright_identification_bit 1 bslbf  
  32. copyright_identification_start 1 bslbf  
  33. frame_length 13 bslbf  
  34. adts_buffer_fullness 11 bslbf  
  35. number_of_raw_data_blocks_in_frame 2 uimsfb  
  36. }  

存文件的代码:

  1. static char head1[7];  
  2. int temp = frame_len + 7;  
  3. head1[0] = (char)0xff;  
  4. head1[1] = (char)0xf9;  
  5. int sr_index = rtp_aac_get_sr_index(aac_param_ptr->sample_rate);  
  6. head1[2] = (0x01<<6)|(sr_index<<2)|0x00;  
  7. //head1[3] = (char)0x80;  //双声道? a=rtpmap:97 mpeg4-generic/44100/2  
  8. head1[3] = (char)0x40;    //单声道? a=rtpmap:97 mpeg4-generic/44800  
  9. head1[4] = (temp>>3)&0xff;  
  10. head1[5] = ((temp&0x07)<<5|0x1f);  
  11. head1[6] = (char)0xfc;  
  12.  
  13. fwrite(head1,1,sizeof(head1),g_file_audio);  
  14. fwrite(frame_buf,1,frame_len,g_file_audio);  

其中frame_buf是一帧的数据,framec_len是帧长度。
 
简单的说明和困惑:
长度为7个字节
 
syncword       12 bit   1111 1111 1111
ID                 1 bit     1 for mpeg audio
layer              2 bit     not sure, I set to 00
protection_absent   1 bit   set to 1
profile           2 bit   1  for AAC main
sampling_frequency_index   4 bit   sample rate index
private_bit    1 bit     set to 0
channel_configuration   3 bit  是不是声道数?
在SDP中有  a=rtpmap:97 mpeg4-generic/44100/2  此时  channel_configuration = 010
a=rtpmap:97 mpeg4-generic/44800   此时 channel_configuration = 001
original/copy  1 bit    set to 0
home      1 bit     set ot 0
emphasis  2bit  set to 00
copyright_identification_bit   1 bit   set to 0
copyright_identification_start  1 bit  set to 0
frame_length                     13 bit   这个长度是包括head 7个字节的
最后添FC    最后两个字段没搞清楚
 
文档不全,对编解码也知之甚少,只能靠分析别人的文件和试验了,至少能出声音了。
文章引用自:http://ajonbin.spaces.live.com/blog/cns!5619A73390DCD51E!115.entry
 

(ajonbin)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/200911/7973.html]
本文出处:http://ajonbin.spaces.live.com 作者:ajonbin
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容