AAC ADTS头详解
AACADTS详解结合:http://blog.csdn.net/jay100500/article/details/52955232与下面的程序输入aac文件/***最简单的视音频数据处理示例*SimplestMediaDataTest**雷霄骅LeiXiaohua*leixiaohua1020@126.com*中国传媒大学/数字电视技术*CommunicationUniversityofChina/DigitalTVTechnology*http://blog.csdn.net/leixiaohua1020**本项目包含如下几种视音频测试示例:*(1)像素数据处理程序。包含RGB和YUV像素格式处理的函数。*(2)音频采样数据处理程序。包含PCM音频采样格式处理的函数。*(3)H.264码流分析程序。可以分离并解析NALU。*(4)AAC码流分析程序。可以分离并解析ADTS帧。*(5)FLV封装格式分析程序。可以将FLV中的MP3音频码流分离出来。*(6)UDP-RTP协议分析程序。可以将分析UDP/RTP/MPEG-TS数据包。**Thisprojectcontainsfollowingsamplestohandlingmultimediadata:*(1)Videopixeldatahandlingprogram.ItcontainsseveralexamplestohandleRGBandYUVdata.*(2)Audiosampledatahandlingprogram.ItcontainsseveralexamplestohandlePCMdata.*(3)H.264streamanalysisprogram.ItcanparseH.264bitstreamandanalysisNALUofstream.*(4)AACstreamanalysisprogram.ItcanparseAACbitstreamandanalysisADTSframeofstream.*(5)FLVformatanalysisprogram.ItcananalysisFLVfileandextractMP3audiostream.*(6)UDP-RTPprotocolanalysisprogram.ItcananalysisUDP/RTP/MPEG-TSPacket.**/#include<stdio.h>#include<stdlib.h>#include<string.h>intgetADTSframe(unsignedchar*buffer,intbuf_size,unsignedchar*data,int*data_size){intsize=0;if(!buffer||!data||!data_size){return-1;}while(1){if(buf_size<7){return-1;}//Syncwordsif((buffer[0]==0xff)&&((buffer[1]&0xf0)==0xf0)){size|=((buffer[3]&0x03)<<11);//high2bitsize|=buffer[4]<<3;//middle8bitsize|=((buffer[5]&0xe0)>>5);//low3bitbreak;}--buf_size;++buffer;}if(buf_size<size){return1;}memcpy(data,buffer,size);*data_size=size;return0;}intsimplest_aac_parser(char*url){intdata_size=0;intsize=0;intcnt=0;intoffset=0;//FILE*myout=fopen("output_log.txt","wb+");FILE*myout=stdout;unsignedchar*aacframe=(unsignedchar*)malloc(1024*5);unsignedchar*aacbuffer=(unsignedchar*)malloc(1024*1024);FILE*ifile=fopen(url,"rb");if(!ifile){printf("Openfileerror");return-1;}printf("-----+-ADTSFrameTable-+------+\n");printf("NUM|Profile|Frequency|Size|\n");printf("-----+---------+----------+------+\n");while(!feof(ifile)){data_size=fread(aacbuffer+offset,1,1024*1024-offset,ifile);unsignedchar*input_data=aacbuffer;while(1){intret=getADTSframe(input_data,data_size,aacframe,&size);if(ret==-1){break;}elseif(ret==1){memcpy(aacbuffer,input_data,data_size);offset=data_size;break;}charprofile_str[10]={0};charfrequence_str[10]={0};unsignedcharprofile=aacframe[2]&0xC0;profile=profile>>6;switch(profile){case0:sprintf(profile_str,"Main");break;case1:sprintf(profile_str,"LC");break;case2:sprintf(profile_str,"×××");break;default:sprintf(profile_str,"unknown");break;}unsignedcharsampling_frequency_index=aacframe[2]&0x3C;sampling_frequency_index=sampling_frequency_index>>2;switch(sampling_frequency_index){case0:sprintf(frequence_str,"96000Hz");break;case1:sprintf(frequence_str,"88200Hz");break;case2:sprintf(frequence_str,"64000Hz");break;case3:sprintf(frequence_str,"48000Hz");break;case4:sprintf(frequence_str,"44100Hz");break;case5:sprintf(frequence_str,"32000Hz");break;case6:sprintf(frequence_str,"24000Hz");break;case7:sprintf(frequence_str,"22050Hz");break;case8:sprintf(frequence_str,"16000Hz");break;case9:sprintf(frequence_str,"12000Hz");break;case10:sprintf(frequence_str,"11025Hz");break;case11:sprintf(frequence_str,"8000Hz");break;default:sprintf(frequence_str,"unknown");break;}fprintf(myout,"%5d|%8s|%8s|%5d|\n",cnt,profile_str,frequence_str,size);data_size-=size;input_data+=size;cnt++;}}fclose(ifile);free(aacbuffer);free(aacframe);return0;}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。