FAAC库实现PCM编码

技术在于交流、沟通,转载请注明出处并保持作品的完整性。

原文:https://blog.csdn.net/hiwubihe/article/details/81260931

 

[音频编解码系列文章]

  1. 音频编解码基础
  2. FFMPEG实现音频重采样
  3. FFMPEG实现PCM编码(采用封装格式实现)
  4. FFMPEG实现PCM编码(不采用封装格式实现)
  5. FAAC库实现PCM编码
  6. FAAD库实现RAW格式AAC解码
  7. FAAD库实现RAW格式AAC封装成ADTS格式
  8. FAAD库实现ADTS格式解码
  9. FFMPEG实现对AAC解码(采用封装格式实现)
  10. FFMPEG实现对AAC解码(不采用封装格式实现)

faac对pcm编码很简单,测试一下31bit样本深度,编码后没有声音,16bit编码没问题,估计是faac不支持这种样本格式,实际中如果需要对32bit采用aac编码,可能需要重采样。

faac调用流程:

demo代码如下:

/*******************************************************************************
Copyright (c) wubihe Tech. Co., Ltd. All rights reserved.
--------------------------------------------------------------------------------

Date Created:	2014-10-25
Author:			wubihe QQ:1269122125 Email:1269122125@qq.com
Description:	使用aac库把PCM编码成aac 测试时 源文件是f32le格式 转换的AAC文件听不见声音 
				估计是faac不支持这种格式,如果需要编码可能要重新采样。
--------------------------------------------------------------------------------
Modification History
DATE          AUTHOR          DESCRIPTION
--------------------------------------------------------------------------------

********************************************************************************/
  
#include <stdio.h> 
#include "faac.h"
 
#ifndef BYTE
typedef unsigned char BYTE;
#endif



int main()
{ 	
	//设置PCM 参数
	unsigned long   nSampleRate = 48000;
	unsigned int    nChannels	= 2;
	unsigned int    nPCMBitSize = 16;
	//编码时一帧一帧送入编码器编码的 音频帧的概念是各个编码器自己定义的 AAC定义为1024个样本数
	//MP3定义为1152个样本数,双通道此值要*2
	unsigned long   nInputSamples   = 0;
	unsigned long   nMaxOutputBytes = 0;
	//faac操作句柄
	faacEncHandle   hEncoder = { 0 };

	// 设置输入输出文件  
	FILE* fpIn  = NULL;
	FILE* fpOut = NULL;
	fopen_s(&fpIn, "huangdun_r48000_s16le_c2.pcm","rb");
	fopen_s(&fpOut, "huangdun.aac", "wb");

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

	// 打开faac编码器引擎   nInputSamples 返回2048 双通道,nMaxOutputBytes每次编码后最大返回值
	hEncoder = faacEncOpen(nSampleRate, nChannels, &nInputSamples, &nMaxOutputBytes);


	if (hEncoder == NULL)
	{
		printf("faacEncOpen失败!\n");
		return -1;
	}

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

	// 获取当前编码器信息  -- 不能缺少,只有获取以后才可以Set
	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;

	//AAC编码等级
	// AAC object types   
	//#define MAIN 1  
	//#define LOW  2  
	//#define SSR  3  
	//#define LTP  4  
	pConfiguration->aacObjectType = LOW;

	//设定AAC单通道比特率 
	pConfiguration->bitRate   = 48000;    // or 0
	pConfiguration->bandWidth = 64000;  //or 0 or 32000

	/*下面可以选择设置*/
	pConfiguration->allowMidside = 1;
	pConfiguration->useLfe = 0;
	pConfiguration->useTns = 0;   
	//AAC品质
	pConfiguration->quantqual = 100;
	//outputformat 0 = Raw; 1 = ADTS  
	pConfiguration->outputFormat = 0;
	pConfiguration->shortctl = SHORTCTL_NORMAL;  

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

	size_t nRet = 0;

	int i = 0;
	while ((nRet = fread(pbPCMBuffer, 1, nPCMBufferSize, fpIn)) > 0)
	{
		//实际读取的样本数 两个通道总样本数
		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;

	printf("faac complete aac encode!!\n");
	getchar();

	return 0;
}

 

实现PCM转换为AAC的C代码,可以使用FAAC。首先,需要使用FAAC的API接口来进行编码。以下是一个简单的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <faac.h> #define INPUT_FILE "input.pcm" #define OUTPUT_FILE "output.aac" int main() { FILE *inputFile = fopen(INPUT_FILE, "rb"); if (!inputFile) { printf("Failed to open input file\n"); return -1; } FILE *outputFile = fopen(OUTPUT_FILE, "wb"); if (!outputFile) { printf("Failed to open output file\n"); fclose(inputFile); return -1; } // 设置编码参数 faacEncConfigurationPtr config = faacEncGetCurrentConfiguration(); config->mpegVersion = MPEG4; config->aacObjectType = LOW; config->inputFormat = FAAC_INPUT_16BIT; config->outputFormat = 0; // 0表示输出原始AAC数据 faacEncSetConfiguration(config); // 创建编码器句柄 faacEncHandle encoder = faacEncOpen(44100, 2, &inputSamples, &maxOutputBytes); if (!encoder) { printf("Failed to open FAAC encoder\n"); fclose(inputFile); fclose(outputFile); return -1; } // 读取PCM数据并进行编码 int inputBufferSize = 4096; int16_t *inputBuffer = (int16_t *)malloc(inputBufferSize); unsigned char *outputBuffer = (unsigned char *)malloc(maxOutputBytes); while (1) { int bytesRead = fread(inputBuffer, sizeof(int16_t), inputBufferSize / sizeof(int16_t), inputFile); if (bytesRead <= 0) { break; } int outputBytes = faacEncEncode(encoder, inputBuffer, bytesRead, outputBuffer, maxOutputBytes); fwrite(outputBuffer, 1, outputBytes, outputFile); } // 清理资源 free(inputBuffer); free(outputBuffer); faacEncClose(encoder); fclose(inputFile); fclose(outputFile); return 0; } ``` 上述代码使用了FAAC的API接口来进行PCMAAC编码。首先,需要设置编码参数,然后创建编码器句柄。接下来,循环读取PCM数据并进行编码,将编码后的数据写入输出文件。最后,清理资源并关闭编码器和文件。 请注意,上述代码仅为示例,实际使用时需要根据具体情况进行适当修改和错误处理。另外,还需要确保已正确安装和配置FAAC。 #### 引用[.reference_title] - *1* [使用FAAC转换PCMAAC](https://blog.csdn.net/u014161864/article/details/43152967)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [使用FAAC转码ACC](https://blog.csdn.net/weixin_41836671/article/details/126442307)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值