关闭

Faac 编码实时pcm流到aac流

1300人阅读 评论(0) 收藏 举报
分类:
编码流程:

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

&maxBytesOutput);

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

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

通过 sampleInput、通道数、采样率多占位宽可以知道采集PCM数据多少数据打成一帧,sampleInput*channels*wBitsPerSample/8字节打包成一帧,其中wBitsPerSample表示每个采样率占用的位宽(一般为16)。

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

int version=MPEG4;    //设置版本,录制MP4文件时要用MPEG4

int objecttype=LOW;    //编码类型

int midside=1;          //M/S编码

int usetns=DEFAULT_TNS;   //瞬时噪声定形(temporal noise shaping,TNS)滤波器

int shortctl=SHORTCTL_NORMAL;

int inputformat=FAAC_INPUT_16BIT;  //输入数据类型

int outputformat=0; //录制MP4文件时,要用raw流。检验编码是否正确时可设置为adts传输流,把aac 流写入.aac文件中,如编码正确,用千千静听就可以播放。

//output format (0 = Raw; 1 = ADTS),如果为1,acc流中会自动加上ADTS头。

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

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

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

faacEncGetDecoderSpecificInfo(hEncoder,&(ASC), &(ASCLength));//得到解码信息

                                                                                                                         //(mpeg4ip mp4 录制使用)

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

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

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

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

size_t read_int16(AACInfo *sndf, int16_t *outbuf, size_t num, unsigned char *inputbuf)

{

       size_t i=0,j=0;

       unsigned char bufi[8];

       while(i<num)

       {

                memcpy(bufi,inputbuf+j,sndf->samplebytes);

               j+=sndf->samplebytes;

              int16_t s=((int16_t*)bufi)[0];

             outbuf[i]=s;

             i++;

       }

       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)。

处理完数据转换后就调用

bytesWritten = faacEncEncode(hEncoder,

                                                        (int *)pcmbuf,

                                                        samplesInput,

                                                        outbuff,

                                                        maxbytesoutput);

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

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


FAAC和FAAD的下载地址  http://www.audiocoding.com/downloads.html

0
1
查看评论

Faac 编码实时pcm流到aac流 并用mp4v2打包成mp4文件

由于项目需要,   需要将g711实时音频流
  • machh
  • machh
  • 2014-10-30 17:24
  • 3759

faac库编码PCM数据

简介AAC(Advanced Audio Coding),一种音频编码技术。具体有哪些特点和优点,自行去百度或google吧。函数简介faac是一个成熟的AAC编码库。其提供的主要接口函数如下:faacEncOpenfaacEncHandle FAACAPI faacEncOpen ( ...
  • liyang051
  • liyang051
  • 2015-07-08 10:41
  • 1573

开源Faac实现PCM编码AAC

目的:Faac实现PCM编码AAC环境:系统:Windows 环境:VS2015 64bit步骤:1. 下载及编译Faac1. 从官网(http://www.audiocoding.com/downloads.html)下载Faac最新版本。 2. 解压zip文件以后直接进入文件夹libfaac,...
  • Alger_magic
  • Alger_magic
  • 2016-10-27 17:34
  • 2864

FAAC转换PCM为AAC

FAAC的代码抠出来,直接加到我们的工程中去,或者抠出来编译一个静态库,需要的代码是libfaac和include两个目录下的所有文件(不包括子目录文件)。 目录文件列表如下所示: aacquant.c aacquant.h backpred.c backpred.h bitstream.c ...
  • zjqlovell
  • zjqlovell
  • 2015-08-25 00:38
  • 960

使用FAAC转换PCM为AAC

FAAC是一个MPEG-4和MPEG-2的AAC编码器,其特性是:可移植性好,快速,支持LC/Main/LTP,通过Dream支持DRM,代码小相对于FFMPEG的AAC转码,FAAC实在是微乎其微,而且可以直接把代码加到工程里面编译,也可使用静态库,而没有巨大的动态库的烦恼。
  • u014161864
  • u014161864
  • 2015-01-26 15:23
  • 5242

android 实时PCM数据编码成AAC

获取PCM流 package com.ff.aac.audio; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; imp...
  • qq_24551315
  • qq_24551315
  • 2016-04-12 18:01
  • 2527

海思arm平台AAC音频转码cpu占用高、效率低的问题解决

问题背景目前市面上的大部分IPC摄像机音频输出基本都是G711、G726编码格式,而在类似于《基于EasyNVR实现RTSP/Onvif监控摄像头Web无插件化直播监控》这种业务中,都是在类似于EasyNVR这样的适配服务中进行音频的转码,也有在类似于《EasyDarwin开源流媒体云平台支持Eas...
  • xiejiashu
  • xiejiashu
  • 2017-07-22 16:47
  • 942

ffmpeg学习十:将pcm格式的音频编码为aac格式

上一节,我们使用alsa库编写了音频的采集和播放的程序。这一节,我们将在采集到的pcm格式的音频数据的基础上,进一步将其编码为aac格式。音频编码概述pcm是最原始的音频编码格式,这种编码是无损的。同时意味着存储这种数据的文件将会很庞大,因此必须进行压缩。pcm是音频的编码格式,它不是文件的封装格式...
  • u011913612
  • u011913612
  • 2016-12-23 15:35
  • 2811

FAAC源码阅读(1)——AAC和音频编码的介绍

1、介绍      AAC也叫高级音频编码,是基于MPEG-2的音频编码技术;MPEG-4出现后,AAC添加了一些新特性,重新集成到MPEG-4中 2、AAC的编码流程 2.1、滤波器组(Filter bank)      主要完成信号...
  • NB_vol_1
  • NB_vol_1
  • 2017-02-09 20:32
  • 817

android 实时PCM数据编码成AAC【转】

获取PCM流 [java] view plain copy   package com.ff.aac.audio;   import java.io.File;   import ...
  • chenyefei
  • chenyefei
  • 2016-08-30 10:29
  • 1663
    个人资料
    • 访问:4179700次
    • 积分:44773
    • 等级:
    • 排名:第87名
    • 原创:525篇
    • 转载:410篇
    • 译文:0篇
    • 评论:1127条
    文章存档
    最新评论
    BShare