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

罗索实验室

Faac 编码实时pcm流到aac流

落鹤生 发布于 2013-05-16 11:22 点击:次 
根据faac 1.28 库中的frontend目录下的faac的例子改的。下面是程序的运行流程.
TAG:

我的程序是根据faac 1.28 库中的frontend目录下的faac的例子改的。

下面是程序的运行流程:

首先调用faacEncHandle hEncoder=faacEncOpen(samplerate,channels,& samplesInput,

&maxBytesOutput);

1.打开aac编码引擎,创建aac编码句柄。

参数 samplerate 为要编码的音频pcm流的采样率,channels为要编码的音频pcm流的的频道数(原有的例子程序是从wav文件中读出这些信 息),sampleInput在编码时要用到,意思是每次要编码的采样数,参数maxBytesOutput为编码时输出地最大字节数。

2.然后在设置一些编码参数,如

  1. int version=MPEG4;    //设置版本,录制MP4文件时要用MPEG4 
  2. int objecttype=LOW;    //编码类型 
  3. int midside=1;          //M/S编码 
  4. int usetns=DEFAULT_TNS;   //瞬时噪声定形(temporal noise shaping,TNS)滤波器 
  5. int shortctl=SHORTCTL_NORMAL; 
  6. int inputformat=FAAC_INPUT_16BIT;  //输入数据类型 
  7. int outputformat=RAW_STREAM; //录制MP4文件时,要用raw流。检验编码是否正确时可设 
  8.              //置为adts传输流,把aac 流写入.aac文件中,如编码正确 
  9.              //用千千静听就可以播放。 

其他的参数可根据例子程序设置。

设置完参数后就调用faacEncSetConfiguration(hEncoder, aacFormat)设置编码参数。

3.如编码完的aac流要写入MP4文件时,要调用

  1. faacEncGetDecoderSpecificInfo(hEncoder,&(ASC), &(ASCLength));//得到解码信息 
  2.              //(mpeg4ip mp4 录制使用) 

此函数支持MPEG4版本,得到的ASC 和ACSLength 数据在录制MP4(mpegip库)文件时用。

4.然后就是编码了,每次从实时的pcm音频队列中读出samplesInput* channels*(量化位数/8),

字节数的pcm数据。然后再把得到pcm流转变一下存储位数,我是转化为16位的了,这部分

可以根据例子程序写一个函数,这是我写的一个,

  1. size_t read_int16(AACInfo *sndf, int16_t *outbuf, size_t num, unsigned char *inputbuf) 
  2.        size_t i=0,j=0; 
  3.        unsigned char bufi[8]; 
  4.        while(i<num) 
  5.        { 
  6.              memcpy(bufi,inputbuf+j,sndf->samplebytes); 
  7.              j+=sndf->samplebytes; 
  8.              int16_t s=((int16_t*)bufi)[0]; 
  9.              outbuf[i]=s; 
  10.              i++; 
  11.        } 
  12.        return i; 

也可以写一个read_float32(AACInfo *sndf, float *outbuf, size_t num ,unsigned char *inputbuf),

和size_t read_int24(AACInfo *sndf, int32_t *outbuf, size_t num, unsigned char *inputbuf)。

处理完数据转换后就调用

  1. bytesWritten = faacEncEncode(hEncoder, 
  2.                 (int *)pcmbuf, 
  3.                 samplesInput, 
  4.                 outbuff, 
  5.                 maxbytesoutput); 

进行编码,pcmbuf为转换后的pcm流数据,samplesInput为调用faacEncOpen时得到的输入采样数,outbuff为编码 后的数据buff,maxbytesoutput为调用faacEncOpen时得到的最大输出字节数。然后每次从outbuff中得到编码后的aac数 据流,放到数据队列就行了,如果还要录制MP4文件,在编码完samplesInput(一帧)个采样数时,打上时间戳(mpegip库用于音视频同步) 后再放到输出队列中。如果想测试看编码的aac流是否正确,设置输出格式为ADTS_STREAM,把aac数据写入到.aac文件中,看能否用千千静听 播放。

5.释放资源,调用faacEncClose(hEncoder);就行了

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