当前位置: 首页 > 工具软件 > faac > 使用案例 >

使用FAAC转码ACC

令狐运珧
2023-12-01


FAAC简介

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


一、部分重要参数解释说明

static uint8_t* inputBuffer = NULL;	//输入信息缓冲区

static faacEncHandle hEncoder;		// PCM 音频 FAAC 编码器

//目前声道数上限默认为1,除非去修改 MAX_CHANNELS 参数,不过修改该参数会极大限度增高内存消耗
static unsigned long nSampleRate = 8000;   // 采样率
static uint8_t nChannels = 1;        		// 声道数
static uint8_t nPCMBitSize = 16;     	 	// 单样本位数


//以下3个参数由FAAC初始化API接口自动赋值
static unsigned long nInputSamples = 0; //输入样本个数, 需要进行编码的 PCM 音频样本个数
static unsigned long nMaxOutputBytes = 0;  // FAAC 编码器最多一次可以接收的样本个数	

static int inputBufferSize = 0;	//输入缓存区的大小
// inputBufferSize = nInputSamples * nPCMBitSize / 8;
//输入缓存区的大小=输入样本个数*单样本位数/8

二、库API接口使用说明

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

faacEncHandle FAACAPI faacEncOpen(unsigned long sampleRate,
                                  unsigned int numChannels,
                                  unsigned long *inputSamples,
                                  unsigned long *maxOutputBytes)
//faacEncHandle 返回值 : FAAC 音频编码器
//unsigned long sampleRate 参数 : 音频采样率
//unsigned int numChannels 参数 : 音频通道参数
//unsigned long *mInputSamples 参数 : 输入样本个数, 需要进行编码的 PCM 音频样本个数(FAAC 编码器最多一次可以接收的样本个数)
//unsigned long *mMaxOutputBytes 参数 : 输出数据最大字节数

2.获取当前编码器的配置信息

faacEncConfigurationPtr FAACAPI faacEncGetCurrentConfiguration(faacEncHandle hEncoder)
//	hEncoder : faacEncOpen返回的编码器句柄

3.设置编码配置信息

注:下面只对部分参数进行说明解释,具体其他设置参数详细可以参考:
https://blog.csdn.net/qinglongzhan/article/details/81315532

/*
        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;

	/*
		设置 AAC 编码规格, 有 9 种
		MPEG-2 AAC LC低复杂度规格(Low Complexity), MPEG-2 AAC Main主规格, MPEG-2 AAC SSR可变采样率规格(Scaleable Sample Rate)
		MPEG-4 AAC LC低复杂度规格(Low Complexity), MPEG-4 AAC Main主规格, MPEG-4 AAC SSR可变采样率规格(Scaleable Sample Rate)
		MPEG-4 AAC LTP长时期预测规格(Long Term Predicition), MPEG-4 AAC LD低延迟规格(Low Delay), MPEG-4 AAC HE高效率规格(High Efficiency)
		这里选择低复杂度规格, 可选参数有 4 种
		MPEG-4 AAC LC低复杂度规格(Low Complexity) 是最常用的 AAC 编码规格, 即兼顾了编码效率, 有保证了音质;
		使用更高音质, 极大降低编码效率, 音质提升效果有限
		再提升编码效率, 会使音质降低很多
	*/
	pConfiguration->aacObjectType = LOW;

	//AAC品质(50-100:影响大小,50以下:基本都差不多)
	pConfiguration->quantqual = 100;

	/*
		AAC 音频文件有两种格式 ADIF 和 ADTS
		AAC 文件解码时 : 音频解码信息定义在头部, 后续音频数据解码按照音频数据长度

		音频数据交换格式 ( Audio Data Interchange Format ) , 只有一份音频解码信息 , 存储在文件开头
		这种格式适合存储音频文件 , 节省空间 , 但是必须从开始播放才可以 , 从中间位置无法播放 ;

		音频数据传输流格式 ( Audio Data Transport Stream ) , 每隔一段音频数据
		就会有一份音频解码信息 , 这种格式适合音频流传输 , 可以在任何位置开始解码播放 ;

		RTMP 推流时, 不使用上述两种格式
		推流视频时, 先将 SPS, PPS 解码数据包的信息推流到服务器上
		推流音频时, 也是将解码相关的数据先推流到服务器中

		AAC 编码时, 会编码成 ADTS 数据
		但是推流音频时, 推流的是 AAC 裸数据, 需要将 ADTS 音频格式中的头信息去掉

		这里设置输出格式 0, 就是 FAAC 将 PCM 采样进行编码, 编码出的格式是 AAC 原始数据
		即没有解码信息的 ADIF 和 ADTS 的 AAC 纯样本裸数据
	*/
	//注:这里配置最好为1,带上ADTS头,否则无法播放
	pConfiguration->outputFormat = 1;

4.配置解码器的参数

int FAACAPI faacEncSetConfiguration(faacEncHandle hEncoder,
                                    faacEncConfigurationPtr config)
//	hEncoder : faacEncOpen返回的编码器句柄
//	config : 编码器的配置信息

三、采集、转码、推流音频说明

基本流程说明:从驱动线程采集录音数据—》推送至主线程进行打包—》推送至网络线程进行网络推流—》通过FFPLAY进行拉流播放

1.从驱动线程采集录音数据

修改相应的录音配置参数,采集足够的PCM纯裸流数据,进行FAAC转换为AAC数据。

2.推送至主线程进行打包

将录音数据推送至主线程进行数据处理打包。

3.推送至网络线程进行网络推流

在主线程将已经打包好的数据发到网络线程,进行网络数据推流到服务器后,即可通过FFPLAY到服务器进行拉流播放了。
注意:需要加上推流异常处理机制和对应的缓存空间进行缓存,避免当网络链接出现短暂异常后,数据丢失的情况。

4.通过FFPLAY进行拉流播放

ffplay播放器的操作步骤:

  1. 打开doc,进入ffplay.exe的目录中
    ffplay.exe的目录路径:ffmpeg-2021-03-28-git-8b2bde0494-full_build\ffmpeg-2021-03-28-git-8b2bde0494-full_build\bin
  2. 输入命令:ffplay http://服务器IP:IP端口/服务器保存的资源文件路径

具体操作方法可参考链接:https://www.jianshu.com/p/c7d644be780e

补充一下:如果没有对应的服务器协助联调的话,可以尝试以下流程也能在本地进行调试

  1. 在设备上把已经转码好的音频数据使用RTP协议进行封包,并将设备连接的IP和端口都设置为本地电脑的IP和端口。
  2. 在本地电脑上装一个VLC media player的软件。
  3. 创建一个文件"rtp_aac.sdp",里面的内容如下
m=audio "本地电脑的端口" RTP/AVP 97
a=rtpmap:97 mpeg4-generic/8000/1
a=fmtp:97 SizeLength=13;
c=IN IP4 "本地电脑的IP"
  1. 在设备将音频数据推流到本地电脑的端口后,直接打开上面的"rtp_aac.sdp"文件,就能听到设备推流的声音了。

具体的RTP协议包格式这里就不做描述了,具体可以参考以下链接:
RTP协议连接


参考链接:

  1. https://blog.csdn.net/arbboter/article/details/43152967?utm_medium=distribute.pc_relevant_download.none-task-blog-baidujs-2.nonecase&depth_1-utm_source=distribute.pc_relevant_download.none-task-blog-baidujs-2.nonecase
  2. https://blog.csdn.net/qq_40834030/article/details/104070708
  3. https://hanshuliang.blog.csdn.net/article/details/106802700
  4. https://blog.csdn.net/shulianghan/article/details/106817750?utm_medium=distribute.pc_relevant_bbs_down.none-task–2allfirst_rank_v2rank_v29-1.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task–2allfirst_rank_v2rank_v29-1.nonecase
  5. https://blog.csdn.net/qinglongzhan/article/details/81315532
  6. https://www.jianshu.com/p/c7d644be780e
 类似资料: