用faad解码AAC(ADTS封装)

转自 :http://blog.csdn.net/gavinr/article/details/6959198


一个小程序,使用faad解码AAC音频,只能解码ADTS封装的帧。编译好的程序可以从这里下载:http://download.csdn.net/detail/gavinr/3782154

  1. /** 
  2.  * faaddec.c 
  3.  * use faad library to decode AAC, only can decode frame with ADTS head  
  4.  */  
  5. #include <stdio.h>  
  6. #include <memory.h>  
  7. #include "faad.h"  
  8.   
  9. #define FRAME_MAX_LEN 1024*5   
  10. #define BUFFER_MAX_LEN 1024*1024  
  11.   
  12. void show_usage()  
  13. {  
  14.     printf("usage\nfaaddec src_file dst_file");  
  15. }  
  16.   
  17. /** 
  18.  * fetch one ADTS frame 
  19.  */  
  20. int get_one_ADTS_frame(unsigned char* buffer, size_t buf_size, unsigned char* data ,size_t* data_size)  
  21. {  
  22.     size_t size = 0;  
  23.   
  24.     if(!buffer || !data || !data_size )  
  25.     {  
  26.         return -1;  
  27.     }  
  28.   
  29.     while(1)  
  30.     {  
  31.         if(buf_size  < 7 )  
  32.         {  
  33.             return -1;  
  34.         }  
  35.   
  36.         if((buffer[0] == 0xff) && ((buffer[1] & 0xf0) == 0xf0) )  
  37.         {  
  38.             size |= ((buffer[3] & 0x03) <<11);     //high 2 bit  
  39.             size |= buffer[4]<<3;                //middle 8 bit  
  40.             size |= ((buffer[5] & 0xe0)>>5);        //low 3bit  
  41.             break;  
  42.         }  
  43.         --buf_size;  
  44.         ++buffer;  
  45.     }  
  46.   
  47.     if(buf_size < size)  
  48.     {  
  49.         return -1;  
  50.     }  
  51.   
  52.     memcpy(data, buffer, size);  
  53.     *data_size = size;  
  54.       
  55.     return 0;  
  56. }  
  57.   
  58. int main(int argc, char* argv[])  
  59. {  
  60.     static unsigned char frame[FRAME_MAX_LEN];  
  61.     static unsigned char buffer[BUFFER_MAX_LEN] = {0};  
  62.   
  63.     char src_file[128] = {0};  
  64.     char dst_file[128] = {0};  
  65.     FILE* ifile = NULL;  
  66.     FILE* ofile = NULL;  
  67.   
  68.     unsigned long samplerate;  
  69.     unsigned char channels;  
  70.     NeAACDecHandle decoder = 0;  
  71.   
  72.     size_t data_size = 0;  
  73.     size_t size = 0;  
  74.   
  75.     NeAACDecFrameInfo frame_info;  
  76.     unsigned char* input_data = buffer;  
  77.     unsigned char* pcm_data = NULL;  
  78.   
  79.     //analyse parameter  
  80.     if(argc < 3)  
  81.     {  
  82.         show_usage();  
  83.         return -1;  
  84.     }  
  85.     sscanf(argv[1], "%s", src_file);  
  86.     sscanf(argv[2], "%s", dst_file);  
  87.   
  88.   
  89.     ifile = fopen(src_file, "rb");  
  90.     ofile = fopen(dst_file, "wb");  
  91.     if(!ifile || !ofile)  
  92.     {  
  93.         printf("source or destination file");  
  94.         return -1;  
  95.     }  
  96.   
  97.      data_size = fread(buffer, 1, BUFFER_MAX_LEN, ifile);  
  98.   
  99.      //open decoder  
  100.     decoder = NeAACDecOpen();      
  101.     if(get_one_ADTS_frame(buffer, data_size, frame, &size) < 0)  
  102.     {  
  103.         return -1;  
  104.     }  
  105.   
  106.     //initialize decoder  
  107.     NeAACDecInit(decoder, frame, size, &samplerate, &channels);  
  108.     printf("samplerate %d, channels %d\n", samplerate, channels);  
  109.       
  110.     while(get_one_ADTS_frame(input_data, data_size, frame, &size) == 0)  
  111.     {  
  112.        // printf("frame size %d\n", size);  
  113.   
  114.         //decode ADTS frame  
  115.         pcm_data = (unsigned char*)NeAACDecDecode(decoder, &frame_info, frame, size);   
  116.           
  117.         if(frame_info.error > 0)  
  118.         {  
  119.             printf("%s\n",NeAACDecGetErrorMessage(frame_info.error));              
  120.   
  121.         }  
  122.         else if(pcm_data && frame_info.samples > 0)  
  123.         {  
  124.             printf("frame info: bytesconsumed %d, channels %d, header_type %d\  
  125.                 object_type %d, samples %d, samplerate %d\n",   
  126.                 frame_info.bytesconsumed,   
  127.                 frame_info.channels, frame_info.header_type,   
  128.                 frame_info.object_type, frame_info.samples,   
  129.                 frame_info.samplerate);  
  130.   
  131.             fwrite(pcm_data, 1, frame_info.samples * frame_info.channels, ofile);      //2个通道  
  132.             fflush(ofile);  
  133.         }          
  134.         data_size -= size;  
  135.         input_data += size;  
  136.     }      
  137.   
  138.     NeAACDecClose(decoder);  
  139.   
  140.     fclose(ifile);  
  141.     fclose(ofile);  
  142.   
  143.     return 0;  
  144. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值