faac库编码PCM数据
来源:互联网 发布:芜湖java招聘 编辑:程序博客网 时间:2024/06/01 10:24
简介
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/MPEG4aacObjectType:MAIN/LOW/LTPallowMidside:mid/side codinguseLfe:低频增强useTns:瞬时噪声定形(temporal noise shaping,TNS)滤波器bitRate :码率bandWidth:占用的带宽outputFormat:输出格式,0 = Raw, 1 = ADTSinputFormat:输入格式,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: aacaac: aac_encode.c Makefile gcc -O3 -Wall -Werror -Wno-unused aac_encode.c -lfaac -o aac_encclean: rm -rf aac_enc
最后编译,运行即可
make./aac_enc /tmp/北京北京8k16bits单声道.pcm /tmp/output.aac
使用播放器打开output.aac即可
注意:以上代码在MacOS 10.10.4 上编译并运行通过
0 0
- faac库编码PCM数据
- 开源Faac实现PCM编码AAC
- Faac 编码实时pcm流到aac流
- Faac 编码实时pcm流到aac流
- Faac 编码实时pcm流到aac流
- FAAC转换PCM为AAC
- Faac 编码实时pcm流到aac流 并用mp4v2打包成mp4文件
- 音频FAAC开源编码库调用
- faac AAC编码参数
- 使用FAAC转换PCM为AAC
- android 实时PCM数据编码成AAC
- AAC音频编码库FAAC和解码库FAAD移植
- PCM编码
- PCM编码
- PCM编码
- FFmepg 音频编码(PCM数据编码成AAC android)
- 使用FAAC进行AAC编码
- 使用FAAC进行AAC编码
- java使用默认线程池踩过的坑(三)
- C++继承的函数实现
- oracle索引原理
- WCDMA中码片速率、符号速率、bit速率
- 二维码小程序
- faac库编码PCM数据
- Android 将View转化为Bitmap,getDrawingCache为空解决办法
- x264编码-码率控制
- java web项目用cookie记住用户名、密码
- 阅读underscore源码笔记
- 杂事 游泳记事
- 搭建基于注解方式的SSH项目框架
- maven教程三之maven命令
- Difference between enabled and userInteractionEnabled properties