【第22期】观点:IT 行业加班,到底有没有价值?

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 上编译并运行通过

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

相关文章推荐

Faac 编码实时pcm流到aac流

我的程序是根据faac 1.28 库中的frontend目录下的faac的例子改的。 下面是程序的运行流程: 首先调用faacEncHandle hEncoder=faacEncOpen(samp...

音频压缩:FAAC编码实例

音频编解码·实战篇(1)WAV转至AAC(AAC编码) 这里利用FAAC来实现AAC编码。另外,WAV的数据段是PCM,代码会出现很多PCM缩写。 1 下载安装 FAAC 这里的安装...

FAAC源码分析之faacEncEncode

FAAC编码代码流程图 通用的AAC编码系统框图(偷来的图) 对比可以发现,其实FAAC的编码和一般的AAC编码大致一致,主要包括心理声学模型处理部分和量化处理两部分,还包括一些优...

Android使用FAAC进行AAC编码详解必看以及注意事项

打开FAAC编码器  m_faacHandle = faacEncOpen(isamplerate, ichannels, &m_uSampleInput, &m_uOutputBytes);  if...

libfaac使用实例

本文对采集的未压缩声音装换为aac格式 对应录制篇:http://blog.163.com/zhujiatc@126/blog/static/183463820130208928612/ ...

faac编译

faac可以到这里获取: http://www.audiocoding.com/downloads.html 工程中默认保护vs的编译; 在Windows上比较方法; 在Android上...

ffmpeg mplayer x264 代码重点详解 详细分析

ffmpeg和mplayer中求平均值得方法 1 ordinary c language level #define avg2(a,b) ((a+b+1)&gt;&gt;1) #define avg4(a,b,c,d) ((a+b+c+d+2)&gt;&gt;2) 显而易见...
  • mmdev
  • mmdev
  • 2012-02-06 09:19
  • 4039

Faac 编码实时pcm流到aac流

Faac 编码实时pcm流到aac流        我的程序是根据faac 1.28 库中的frontend目录下的faac的例子改的。 下面是程序的运行流程: 首先调用faacEncHandl...

ffmpeg mplayer x264 代码重点详解 详细分析

ffmpeg和mplayer中求平均值得方法 1 ordinary c language level #define avg2(a,b) ((a+b+1)&gt;&gt;1) #define avg4(a,b,c,d) ((a+b+c+d+2)&gt;&gt;2) 显而易见...

开源Faac实现PCM编码AAC

目的:Faac实现PCM编码AAC环境:系统:Windows 环境:VS2015 64bit步骤:1. 下载及编译Faac1. 从官网(http://www.audiocoding.com/down...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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