faac库编码PCM数据

原创 2015年07月08日 10:41:00

简介

AAC(Advanced Audio Coding),一种音频编码技术。具体有哪些特点和优点,自行去百度或google吧。

函数简介

faac是一个成熟的AAC编码库。其提供的主要接口函数如下:

faacEncOpen

faacEncHandle FAACAPI faacEncOpen 
    (
        unsigned long sampleRate,
        unsigned int numChannels,
        unsigned long *inputSamples,
        unsigned long *maxOutputBytes      
     );

* sampleRate *:采样率
* numChannels *:声道数
* inputSamples * :编码时每次需要输入的字节数
* maxOutputBytes * : 编码时输出的最大字节数

该函数主要是创建一个编码器,并且返回需要输入的字节及编码返回的最大字节数

faacEncClose

void FAACAPI faacEncClose( faccEncHandle hEncoder);

与上述接口相对应,关闭编码器。

faacEncGetCurrentConfiguration

faacEncConfigurationPtr FAACAPI faacEncGetCurrentConfiguration( faccEncHandle hEncoder);

该函数获取当前编码器的配置

faacEncGetCurrentConfiguration

faacEncConfigurationPtr FAACAPI faacEncSetCurrentConfiguration
( 
    faccEncHandle hEncoder,
    faacEncConfigurationPtr config
);

该函数设置当前编码器的配置

faacEncEncode

int FAACAPI faacEncEncode
(
    faacEncHandle hEncoder,
   int32_t *inputBuffer,
    unsigned int samplesInput,
    unsigned char *outputBuffer,
    unsigned int bufferSize
);

* hEncoder *:编码器,通过faacEncOpen函数创建的
* inputBuffer *:输入数据
* sampleInput *:输入数据大小,如果为0,则编码器会把换成的数据都给输出
* outputBuffer *:存放输出数据
* bufferSize *:存放输出数据的缓存区大小,至少是和maxOutputBytes一样的大小

该函数进行编码

faacEncConfigurationPtr 结构

typedef struct faacEncConfiguration
{
    unsigned int mpegVersion;
    unsigned int aacObjectType;
    unsigned int allowMidside;
    unsigned int useLfe;
    unsigned int useTns;
    unsigned long bitRate;
    unsigned int bandWidth;
    ...
}
faacEncConfiguration, *faacEncConfigurationPtr;

简单的介绍其中的几个参数

mpegVersion :mpeg版本, MPEG2/MPEG4
aacObjectType:MAIN/LOW/LTP
allowMidside:mid/side coding
useLfe:低频增强
useTns:瞬时噪声定形(temporal noise shaping,TNS)滤波器
bitRate :码率
bandWidth:占用的带宽
outputFormat:输出格式,0 = Raw, 1 = ADTS
inputFormat:输入格式,FAAC_INPUT_NULL/FAAC_INPUT_16BIT/FAAC_INPUT_24BIT/FAAC_INPUT_32BIT/FAAC_INPUT_FLOAT

代码如下

/* aac_encode.c */
#include <stdio.h>
#include <faac.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

int main (int argc, char **argv)
{
    unsigned long sampleRate = 8000;
    unsigned int numChannels = 1;
    unsigned long inputSample = 0;
    unsigned long maxOutputBytes = 0;
    faacEncHandle encoder;
    faacEncConfigurationPtr config;
    FILE *rfile = NULL;
    FILE *wfile = NULL;
    int16_t *pcm_input = NULL;
    uint8_t *aac_output = NULL;
    int readcount = 0;
    int writecount = 0;

    encoder = faacEncOpen(sampleRate, numChannels, &inputSample, &maxOutputBytes);
    config = faacEncGetCurrentConfiguration(encoder);
    config->aacObjectType = MAIN;
    config->mpegVersion = MPEG4;
    //config->useLfe = 1;
    config->useTns = 1;
    config->allowMidside = 1;
    config->outputFormat = 1;  // RAW_STREAM = 0, ADTS_STREAM 1
    //config->bitRate = ;
    config->inputFormat = FAAC_INPUT_16BIT;
    faacEncSetConfiguration(encoder, config);

    printf("sampleRate:%ld, numChannels:%d, inputSample:%ld, maxOutputBytes:%ld\n", 
            sampleRate, numChannels, inputSample, maxOutputBytes);

    if (argv[1]) {
        rfile = fopen(argv[1], "rb");
    } else {
        printf("try to open /tmp/input.pcm\n");
        rfile = fopen("/tmp/input.pcm", "rb");
    }

    if (!rfile) {
        printf("open error\n");
        goto end;
    }

    if (argv[2]) {
        wfile = fopen(argv[2], "wb");
    } else {
        printf("try to open /tmp/output.aac\n");
        wfile = fopen("/tmp/output.aac", "wb");
    }

    if (!wfile) {
        printf("open error\n");
        goto end;
    }

    pcm_input = (int16_t *)malloc(inputSample * sizeof(int16_t));
    aac_output = (uint8_t *)malloc(maxOutputBytes * sizeof(uint8_t));

    /* encode */
    while (1) {
        int readlen = 0;
        int ret = 0;

        readlen = fread(pcm_input, sizeof(int16_t), inputSample, rfile);

        //printf("====================read %d\n", readlen);
        ret = faacEncEncode(encoder, (int32_t *)pcm_input, readlen, aac_output, maxOutputBytes);

        if (ret > 0) {
            //printf("encode success! ret %d\n", ret);
            fwrite(aac_output, sizeof(uint8_t), ret, wfile);
        } else if (ret < 0) {
            printf("encode error\n");
            break;
        }

        readcount += readlen * 2;
        writecount += ret;

        if (!readlen && !ret) {
            printf("encode complete, from %d bytes to %d bytes\n", readcount, writecount);
            break;
        }
    }

    free(pcm_input);
    free(aac_output);

  end:
    if (wfile) fclose(wfile);
    if (rfile) fclose(rfile);
    faacEncClose(encoder);
    return 0;
}
/* Makefile */
all: aac

aac: aac_encode.c Makefile
    gcc -O3 -Wall -Werror -Wno-unused aac_encode.c -lfaac -o aac_enc

clean:
    rm -rf aac_enc

最后编译,运行即可

make
./aac_enc /tmp/北京北京8k16bits单声道.pcm /tmp/output.aac

使用播放器打开output.aac即可

注意:以上代码在MacOS 10.10.4 上编译并运行通过

版权声明:本文为博主原创文章,未经博主允许不得转载。

音频编解码·实战篇(1)PCM转至AAC(AAC编码)

音频编解码·实战篇(1)PCM转至AAC(AAC编码)作者:柳大·Poechant博客:blog.csdn.net/poechant邮箱:zhongchao.ustc@gmail.com日期:Apri...
  • Poechant
  • Poechant
  • 2012年04月07日 14:15
  • 21462

开源Faac实现PCM编码AAC

目的:Faac实现PCM编码AAC环境:系统:Windows 环境:VS2015 64bit步骤:1. 下载及编译Faac1. 从官网(http://www.audiocoding.com/down...
  • Alger_magic
  • Alger_magic
  • 2016年10月27日 17:34
  • 2634

音频压缩:FAAC编码实例

音频编解码·实战篇(1)WAV转至AAC(AAC编码) 这里利用FAAC来实现AAC编码。另外,WAV的数据段是PCM,代码会出现很多PCM缩写。 1 下载安装 FAAC 这里的安装...
  • ssdsafsdsd
  • ssdsafsdsd
  • 2014年01月02日 15:41
  • 6586

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

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

Faac 编码实时pcm流到aac流

我的程序是根据faac 1.28 库中的frontend目录下的faac的例子改的。 下面是程序的运行流程: 首先调用faacEncHandle hEncoder=faacEncOpen(samp...
  • jwzhangjie
  • jwzhangjie
  • 2013年04月10日 14:09
  • 8361

使用FAAC进行AAC编码

首先FAAC和FAAD的下载地址在前面的博文里有。 FAAC和FAAD有win32的编译工程,相对其他开源项目来说,win32的编译很简单了 FAAC,FAAD的编码和解码也封装的非常好,使用上很...
  • table
  • table
  • 2012年10月20日 00:08
  • 12741

DirectShow音频采集pcm,实时编码AAC,附源码

定期送福利,今天给大家送上Windows中利用DirectShow采集microphone音频,并将采集到的pcm数据,利用FAAC库编码成AAC,进行本地存储或者网络传输。 直接贴代码,解析看注...
  • xiejiashu
  • xiejiashu
  • 2014年07月30日 08:56
  • 9312

FAAC转换PCM为AAC

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

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

由于项目需要,   需要将g711实时音频流
  • machh
  • machh
  • 2014年10月30日 17:24
  • 3612

faac库的编译与移植

Advanced Audio Coding。一种专为声音数据设计的文件压缩格式,与Mp3不同,它采用了全新的算法进行编码,更加高效,具有更高的“性价比”。利用AAC格式,可使人感觉声音质量没有明显降低...
  • keepingstudying
  • keepingstudying
  • 2014年07月29日 16:28
  • 4557
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:faac库编码PCM数据
举报原因:
原因补充:

(最多只允许输入30个字)