使用FAAC转换PCM为AAC

关于FAAC

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

下载安装

  • 直接按照官方文档所示,编译静态库以供我们程序使用。(我没这么做,个中曲折错误不细数)
  • 把FAAC的代码抠出来,直接加到我们的工程中去,或者抠出来编译一个静态库,简单暴力有效,需要的代码是libfaac和include两个目录下的所有文件(不包括子目录文件)。 目录文件列表如下所示:
    aacquant.c
    aacquant.h
    backpred.c
    backpred.h
    bitstream.c
    bitstream.h
    channels.c
    channels.h
    coder.h
    faac.h
    faaccfg.h
    fft.c
    fft.h
    filtbank.c
    filtbank.h
    frame.c
    frame.h
    huffman.c
    huffman.h
    hufftab.h
    ltp.c
    ltp.h
    midside.c
    midside.h
    psych.h
    psychkni.c
    tns.c
    tns.h
    util.c
    util.h
    version.h

    强烈推荐使用第二种方法

主要的函数介绍

faacEncHandle FAACAPI faacEncOpen(unsigned long sampleRate,
	unsigned int numChannels,
	unsigned long *inputSamples,
	unsigned long *maxOutputBytes);
//	描述 : 打开并初始化编码器
//	sampleRate : 编码输入信息的采样率
//	numChannels : 编码输入信息的通道数量,1-单声道 2-立体声
//	inputSamples : 编码后的数据长度
//	maxOutputBytes : 编码后的信息最大长度
int FAACAPI faacEncClose(faacEncHandle hEncoder);
//	描述:关闭编码器
//	hEncoder : faacEncOpen返回的编码器句柄
faacEncConfigurationPtr FAACAPI faacEncGetCurrentConfiguration(faacEncHandle hEncoder);
//	描述 :获取当前编码器的配置信息
//	hEncoder : faacEncOpen返回的编码器句柄
int FAACAPI faacEncSetConfiguration(faacEncHandle hEncoder, faacEncConfigurationPtr config);
//	描述 : 配置解码器的参数
//	hEncoder : faacEncOpen返回的编码器句柄
//	config : 编码器的配置信息
int FAACAPI faacEncEncode(faacEncHandle hEncoder,
	int32_t * inputBuffer,
	unsigned int samplesInput,
	unsigned char *outputBuffer,
	unsigned int bufferSize);
//	描述 : 编码一桢信息
//	hEncoder : faacEncOpen返回的编码器句柄
//	inputBuffer : 输入信息缓冲区
//	samplesInput : faacEncOpen编码后的数据长度,即缓冲区长度
//	outputBuffer : 编码后输出信息缓冲区
//	bufferSize : 输出信息长度
int FAACAPI faacEncGetVersion(char **faac_id_string, char **faac_copyright_string);
//	描述 : 获取FAAC的版本信息,用以参考作用,非必须API
//	faac_id_string : faac的版本号
//	faac_copyright_string : 版权信息

代码示例

代码的工作流程是:

  1. 打开输入输出文件
  2. 使用faacEncOpen打开编码器引擎
  3. 使用faacEncGetCurrentConfiguratio获取编码器配置
  4. 配置编码器参数
  5. 使用faacEncSetConfiguration设置编码器配置
  6. 读取一桢输入数据
  7. 使用faacEncEncode编码帧数据
  8. 写入编码数据到输出文件
  9. 使用faacEncClose关闭编码引擎
//
//  faac example code
//  PCM to ACC
//
//  Created by arbboter on 15/1/26.
//  Copyright (c) 2015年 arbboter. All rights reserved.
//
#include "faac.h"
#include <stdio.h>

int main()
{
	// 定义别名
	typedef unsigned char   BYTE;

	unsigned long	nSampleRate = 44100;
	unsigned int	nChannels = 2;
	unsigned int	nPCMBitSize = 16;
	unsigned long	nInputSamples = 0;
	unsigned long	nMaxOutputBytes = 0;
	faacEncHandle	hEncoder = {0};

	// 设置输入输出文件
	FILE* fpIn = fopen("Beyond.pcm", "rb");
	FILE* fpOut = fopen("Beyond.aac", "wb");

	if(fpIn==NULL || fpOut==NULL)
	{
		printf("打开文件失败!\n");
		return -1;
	}

	// 打开faac编码器引擎
	hEncoder = faacEncOpen(nSampleRate, nChannels, &nInputSamples, &nMaxOutputBytes);
	if(hEncoder == NULL)
	{
		printf("打开faac编码器引擎失败!\n");
		return -1;
	}

	// 分配内存信息
	int		nPCMBufferSize = nInputSamples*nPCMBitSize/8;
	BYTE*	pbPCMBuffer = new BYTE[nPCMBufferSize];
	BYTE*	pbAACBuffer = new BYTE[nMaxOutputBytes];

	// 获取当前编码器信息
	faacEncConfigurationPtr pConfiguration = {0};
	pConfiguration = faacEncGetCurrentConfiguration(hEncoder);

	// 设置编码配置信息
	/*
		PCM Sample Input Format
		0	FAAC_INPUT_NULL			invalid, signifies a misconfigured config
		1	FAAC_INPUT_16BIT		native endian 16bit
		2	FAAC_INPUT_24BIT		native endian 24bit in 24 bits		(not implemented)
		3	FAAC_INPUT_32BIT		native endian 24bit in 32 bits		(DEFAULT)
		4	FAAC_INPUT_FLOAT		32bit floating point
    */
	pConfiguration->inputFormat = FAAC_INPUT_16BIT;

	// 0 = Raw; 1 = ADTS
	pConfiguration->outputFormat = 1;

	// AAC object types
	//#define MAIN 1
	//#define LOW  2
	//#define SSR  3
	//#define LTP  4
	pConfiguration->aacObjectType = LOW;
	pConfiguration->allowMidside = 0;
	pConfiguration->useLfe = 0;
	pConfiguration->bitRate = 48000;
	pConfiguration->bandWidth = 32000;

	// 其他的参数不知道怎么配置,毕竟对音频不熟
	// 不过当前的设置可以实现转换,不过声音好像有一丢丢怪异
	// 这一块的配置信息很重要,错了会导致转码失败,然后你以为代码其他地方错了

	// 重置编码器的配置信息
	faacEncSetConfiguration(hEncoder, pConfiguration);

	size_t nRet = 0;

	printf("数据转换中:        ");
	int i = 0;
	while( (nRet = fread(pbPCMBuffer, 1, nPCMBufferSize, fpIn)) > 0)
	{
		printf("\b\b\b\b\b\b\b\b%-8d", ++i);
		nInputSamples = nRet / (nPCMBitSize/8);

		// 编码
		nRet = faacEncEncode(hEncoder, (int*) pbPCMBuffer, nInputSamples, pbAACBuffer, nMaxOutputBytes);

		// 写入转码后的数据
		fwrite(pbAACBuffer, 1, nRet, fpOut);
	}

	// 扫尾工作
	faacEncClose(hEncoder);
	fclose(fpOut);
	fclose(fpIn);

	delete[] pbAACBuffer;
	delete[] pbPCMBuffer;

	return 0;
}

编码器的参数设置,可以找正确的解码例子照例修改或者问专业人士吧,如果出错了的话。

时间: 2024-07-29 21:17:16

使用FAAC转换PCM为AAC的相关文章

使用ffmpeg转码pcm至aac格式

准备工作 去官网下载源码自己编译所需要的库,或者直接从官网下载已经编写好的库,由于本例是Window平台下的开发,而官网已经有了编译好的库,所以直接下载编译所需要的库文件即可.下载地址:需要下载两个压缩包,Dev版本和Shared版本,其中Dev版本是头文件和lib库文件,Shared是包含运行所需要的dll文件. 下载完成后,需要把这些头文件.静态库.动态链接库引入到我们的工程里面,不过在Windows下面,头文件除了要用到FFMPEG提供的,还要使用另外三个文件:inttypes.h,std

多媒体开发(13):iOS上音频编码成aac

如前面我所说,对于音频的解码,一般你都不用考虑硬解,用软解就足够了,这时可以选择faad或FFmpeg等.但是,如果是音频的编码呢?这可不一样,编码比解码明显耗时,为了快跟低功耗(特别对于低端机器),要优先考虑硬编码(不能再使用fdk-aac或faac之类的软编码),硬编码的优势是可以用硬件芯片集成的功能,高速且低功耗地完成编码任务. iOS平台,也提供了硬编码的能力,APP开发时只需要调用相应的SDK接口就能达成目标,这个SDK接口就是AudioConverter. 本文介绍iOS平台上,如何

解码aac,并生成wav文件

小程在讲多媒体的编码格式时,详细介绍过pcm跟aac等概念.简单来说,pcm是没有压缩的数字信号,可以直接用于音频输出,而aac则是一种音频编码格式,需要解码后才能用于音频输出. aac编码格式,已经是一种很常见的音频编码格式,硬件设备(比如电脑芯片.手机.其它终端设备)都集成了aac的解码功能,而且有些系统还提供了调用硬件解码的接口,比如iOS上的AudioConverterRef接口.Android上的MediaCodec接口等. 从性能的角度,使用硬件解码是最佳选择,但如果从通用的角度,使

iOS平台上音频编码成aac

小程之前介绍解码aac时,曾经使用了fadd,并且有提到,如果想编码成aac格式,可以使用facc.fdk-aac等,但使用fdk-aac等编码方式,都是软编码,在cpu的消耗上会明显大于硬件编码. 硬编码的优势是可以用硬件芯片集成的功能,高速且低功耗地完成编码任务. 在iOS平台,也提供了硬编码的能力,APP开发时只需要调用相应的SDK接口就可以了. 这个SDK接口就是AudioConverter. 本文介绍iOS平台上,如何调用AudioConverter来完成aac的硬编码. 从名字来看,

LanSoEditor_common ---android平台的视频编辑SDK

当前版本是LanSoEditor-v1.4 主要使用在音视频的: 裁剪,剪切,分离,合并,转换,拼接,水印,叠加,混合,转码等场合; 我们是针对android平台对ffmpeg做了硬件加速优化,经过多款手机的测试,优化性能大概提升4倍左右 我们在项目中提供了大约30个常用的方法并写了详细的说明注释,基本满足一般视频编辑的需求 我们另外提供了扩展接口,您完全可以根据强大的ffmpeg命令来扩展您需要的功能 此SDK采用低价收费授权,公司性质的合作,为了您项目更好的进行,欢迎和我们联系.谢谢! 下载

(九十五)音效播放方法和工具类的制作

音效通过AVFoundation框架实现,是通过函数而不是方法,因此需要进行桥接等操作,具体步骤如下. 进行音效播放,首先要得到音效的URL(只能是本地音频),然后转换为音效ID(唯一),通过ID播放音效. [音效播放方法] ①导入框架主头文件 #import <AVFoundation/AVFoundation.h> ②通过Bundle拿到本地音效,然后调用AudioServicesCreateSystemSoundID函数得到音效ID,ID为0代表无效,以此为依据可进行懒加载 @inter

ffmpeg 有用命令 (转载)

转自:http://blog.csdn.net/simongyley/article/details/9984167 1.将h264文件解码为yuv文件 ffmpeg -i file.h264 file.yuv ffmpeg 转换 D:\ffmpeg\bin>ffmpeg.exe -i C:\Users\pc\Desktop\sp.mp4 -vf scale=500:-1 -t 100 ss.flv C:\Users\pc\Desttop\sp.mp4 是所需要转换的文件地址 scale=500

MP4介绍与基本AVC编码(x264)教程

MP4介绍与基本AVC编码(x264)教程(最后更新: 2006.03.25)为日益增加的对MP4 H264/AVC编码的需求,本人做了一个简单的MP4介绍与基本AVC编码(使用x264)教程最后更新日期:2006年3月25日注×:这是本人第一次写这样的教程,知道的也不是很多,所以里面肯定会有很多错误,请内行多多指正,我好及时更新省得误人子弟. 首先简单介绍一下MPEG是什么: MPEG是Motion Picture Expert Group的缩写,简单讲就是个行业里的组织,专门对数字内容做出业

libfaac个个参数说明

https://blog.csdn.net/qinglongzhan/article/details/81315532?utm_source=blogxgwz0 1. 打开faac编码器引擎.   faacEncHandle FAACAPI faacEncOpen(           unsigned long sampleRate,      // pcm音频采样率,8k,16k,44100等        unsigned int numChannels,      // pcm音频通道,