加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码网 (https://www.900php.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

视音频数据处理入门:AAC音频码流解析

发布时间:2020-12-31 06:09:17 所属栏目:大数据 来源:网络整理
导读:副标题#e# ===================================================== 视音频数据处理入门系列文章: 视音频数据处理入门:RGB、YUV像素数据处理 视音频数据处理入门:PCM音频采样数据处理 视音频数据处理入门:H.264视频码流解析 视音频数据处理入门:AAC音
副标题[/!--empirenews.page--]

=====================================================

视音频数据处理入门系列文章:

视音频数据处理入门:RGB、YUV像素数据处理

视音频数据处理入门:PCM音频采样数据处理

视音频数据处理入门:H.264视频码流解析

视音频数据处理入门:AAC音频码流解析

视音频数据处理入门:FLV封装格式解析

视音频数据处理入门:UDP-RTP协议解析

=====================================================


本文继续上一篇文章的内容,介绍一个音频码流处理程序。音频码流在视频播放器中的位置如下所示。

视音频数据处理入门:AAC音频码流解析


本文中的程序是一个AAC码流解析程序。该程序可以从AAC码流中分析得到它的基本单元ADTS frame,并且可以简单解析ADTS frame首部的字段。通过修改该程序可以实现不同的AAC码流处理功能。


原理

AAC原始码流(又称为“裸流”)是由一个一个的ADTS frame组成的。他们的结构如下图所示。

视音频数据处理入门:AAC音频码流解析


其中每个ADTS frame之间通过syncword(同步字)进行分隔。同步字为0xFFF(二进制“222222222211”)。AAC码流解析的步骤就是首先从码流中搜索0x0FFF,分离出ADTS frame;然后再分析ADTS frame的首部各个字段。本文的程序即实现了上述的两个步骤。
代码 整个程序位于simplest_aac_parser()函数中,如下所示。
[cpp]? view plain ?copy ?

在CODE上查看代码片

派生到我的代码片

  1. /**?
  2. ?*?最简单的视音频数据处理示例?
  3. ?*?Simplest?MediaData?Test?
  4. ?*?
  5. ?*?雷霄骅?Lei?Xiaohua?
  6. ?*?leixiaohua1020@126.com?
  7. ?*?中国传媒大学/数字电视技术?
  8. ?*?Communication?University?of?China?/?Digital?TV?Technology?
  9. ?*?http://blog.csdn.net/leixiaohua1020?
  10. ?*?本项目包含如下几种视音频测试示例:?
  11. ?*??(1)像素数据处理程序。包含RGB和YUV像素格式处理的函数。?
  12. ?*??(2)音频采样数据处理程序。包含PCM音频采样格式处理的函数。?
  13. ?*??(3)H.264码流分析程序。可以分离并解析NALU。?
  14. ?*??(4)AAC码流分析程序。可以分离并解析ADTS帧。?
  15. ?*??(5)FLV封装格式分析程序。可以将FLV中的MP3音频码流分离出来。?
  16. ?*??(6)UDP-RTP协议分析程序。可以将分析UDP/RTP/MPEG-TS数据包。?
  17. ?*?This?project?contains?following?samples?to?handling?multimedia?data:?
  18. ?*??(1)?Video?pixel?data?handling?program.?It?contains?several?examples?to?handle?RGB?and?YUV?data.?
  19. ?*??(2)?Audio?sample?data?handling?program.?It?contains?several?examples?to?handle?PCM?data.?
  20. ?*??(3)?H.264?stream?analysis?program.?It?can?parse?H.264?bitstream?and?analysis?NALU?of?stream.?
  21. ?*??(4)?AAC?stream?analysis?program.?It?can?parse?AAC?bitstream?and?analysis?ADTS?frame?of?stream.?
  22. ?*??(5)?FLV?format?analysis?program.?It?can?analysis?FLV?file?and?extract?MP3?audio?stream.?
  23. ?*??(6)?UDP-RTP?protocol?analysis?program.?It?can?analysis?UDP/RTP/MPEG-TS?Packet.?
  24. ?*/??
  25. #include?<stdio.h>??
  26. #include?<stdlib.h>??
  27. #include?<string.h>??
  28. ??
  29. ??
  30. int?getADTSframe(unsigned?char*?buffer,?int?buf_size,?unsigned?char*?data?,int*?data_size){??
  31. ????int?size?=?0;??
  32. ????if(!buffer?||?!data?||?!data_size?){??
  33. ????????return?-1;??
  34. ????}??
  35. while(1){??
  36. if(buf_size??<?7?){??
  37. ????????????return?-1;??
  38. ????????}??
  39. ????????//Sync?words??
  40. if((buffer[0]?==?0xff)?&&?((buffer[1]?&?0xf0)?==?0xf0)?){??
  41. ????????????size?|=?((buffer[3]?&?0x03)?<<11);?????//high?2?bit??
  42. ????????????size?|=?buffer[4]<<3;????????????????//middle?8?bit??
  43. ????????????size?|=?((buffer[5]?&?0xe0)>>5);????????//low?3bit??
  44. ????????????break;??
  45. ????????}??
  46. ????????--buf_size;??
  47. ????????++buffer;??
  48. ????}??
  49. ????if(buf_size?<?size){??
  50. ????????return?1;??
  51. ????memcpy(data,?buffer,?size);??
  52. ????*data_size?=?size;??
  53. return?0;??
  54. }??
  55. int?simplest_aac_parser(char?*url)??
  56. {??
  57. ????int?data_size?=?0;??
  58. int?cnt=0;??
  59. int?offset=0;??
  60. ????//FILE?*myout=fopen("output_log.txt","wb+");??
  61. FILE?*myout=stdout;??
  62. ????unsigned?char?*aacframe=(unsigned?char?*)malloc(1024*5);??
  63. ????unsigned?char?*aacbuffer=(unsigned?char?*)malloc(1024*1024);??
  64. FILE?*ifile?=?fopen(url,?"rb");??
  65. if(!ifile){??
  66. ????????printf("Open?file?error");??
  67. ????printf("-----+-?ADTS?Frame?Table?-+------+n");??
  68. ????printf("?NUM?|?Profile?|?Frequency|?Size?|n");??
  69. ????printf("-----+---------+----------+------+n");??
  70. while(!feof(ifile)){??
  71. ????????data_size?=?fread(aacbuffer+offset,?1,?1024*1024-offset,?ifile);??
  72. ????????unsigned?char*?input_data?=?aacbuffer;??
  73. while(1)??
  74. ????????{??
  75. ????????????int?ret=getADTSframe(input_data,?data_size,?aacframe,?&size);??
  76. if(ret==-1){??
  77. ????????????????break;??
  78. ????????????}else?if(ret==1){??
  79. ????????????????memcpy(aacbuffer,input_data,data_size);??
  80. ????????????????offset=data_size;??
  81. ????????????}??
  82. ????????????char?profile_str[10]={0};??
  83. char?frequence_str[10]={0};??
  84. ????????????unsigned?char?profile=aacframe[2]&0xC0;??
  85. ????????????profile=profile>>6;??
  86. switch(profile){??
  87. case?0:?sprintf(profile_str,"Main");case?1:?sprintf(profile_str,"LC");case?2:?sprintf(profile_str,"SSR");default:sprintf(profile_str,"unknown"); ????????????unsigned?char?sampling_frequency_index=aacframe[2]&0x3C;??
  88. ????????????sampling_frequency_index=sampling_frequency_index>>2;??
  89. switch(sampling_frequency_index){??
  90. case?0:?sprintf(frequence_str,"96000Hz");case?1:?sprintf(frequence_str,"88200Hz");case?2:?sprintf(frequence_str,"64000Hz");case?3:?sprintf(frequence_str,"48000Hz");case?4:?sprintf(frequence_str,"44100Hz");case?5:?sprintf(frequence_str,"32000Hz");case?6:?sprintf(frequence_str,"24000Hz");case?7:?sprintf(frequence_str,"22050Hz");case?8:?sprintf(frequence_str,"16000Hz");case?9:?sprintf(frequence_str,"12000Hz");case?10:?sprintf(frequence_str,"11025Hz");case?11:?sprintf(frequence_str,"8000Hz");default:sprintf(frequence_str,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; list-style-position:outside!important"> ????????????fprintf(myout,"%5d|?%8s|??%8s|?%5d|n",cnt,profile_str?,frequence_str,size);??
  91. ????????????data_size?-=?size;??
  92. ????????????input_data?+=?size;??
  93. ????????????cnt++;??
  94. ????????}?????
  95. ????fclose(ifile);??
  96. ????free(aacbuffer);??
  97. ????free(aacframe);??
  98. return?0;??
  99. }??

上文中的函数调用方法如下所示。

结果

本程序的输入为一个AAC原始码流(裸流)的文件路径,输出为该码流中ADTS frame的统计数据,如下图所示。

视音频数据处理入门:AAC音频码流解析



下载


Simplest mediadata test


项目主页
SourceForge:https://sourceforge.net/projects/simplest-mediadata-test/

Github:https://github.com/leixiaohua1020/simplest_mediadata_test

开源中国: http://git.oschina.net/leixiaohua1020/simplest_mediadata_test

CSDN下载地址: http://download.csdn.net/detail/leixiaohua1020/9422409
本项目包含如下几种视音频数据解析示例:
?(1)像素数据处理程序。包含RGB和YUV像素格式处理的函数。
?(2)音频采样数据处理程序。包含PCM音频采样格式处理的函数。
?(3)H.264码流分析程序。可以分离并解析NALU。
?(4)AAC码流分析程序。可以分离并解析ADTS帧。
?(5)FLV封装格式分析程序。可以将FLV中的MP3音频码流分离出来。
?(6)UDP-RTP协议分析程序。可以将分析UDP/RTP/MPEG-TS数据包。
雷霄骅 (Lei Xiaohua)
leixiaohua1020@126.com

http://blog.csdn.net/leixiaohua1020


(编辑:源码网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读