c语言使用fdk_aac库对aac音频解码为pcm

//示例为adts的aac流数据(adts数据可以每一包都可以独立解析不需要拼凑)

//解码数据的采样率同解码前的采样率,如果不满足需求,需要对数据进行重采样

c 复制代码
#include <aacdecoder_lib.h>

int m_fd = -1;
int m_fd2 = -1;

void aac2pcm(){
		HANDLE_AACDECODER decoder = aacDecoder_Open(TT_MP4_ADTS , 1);
	if (!decoder) {
		printf("Failed to open AAC decoder");			
		return;
	}	
	m_fd = fopen("./send.aac", "rb");
	m_fd2 = fopen("./recv.pcm", "wb");
	unsigned int size=1024;
	unsigned int valid;
	unsigned char* data=(unsigned char*)malloc(size);
	unsigned int decsize=8* 2048 * sizeof(INT_PCM);
	unsigned char* decdata=(unsigned char*)malloc(decsize);
	int frameCnt=0;
	do{		
		int len = fread(data, 1,size, m_fd);
		valid=len;
		AAC_DECODER_ERROR err=aacDecoder_Fill(decoder, &data, &size, &valid);//往aac内部缓存中填数据
		if (err != AAC_DEC_OK) {
            printf("Failed to fill AAC decoder: %d\n", err);
            break;
        }
		while(1){ //一定要加循环,一次有可能解码不完导致数据丢失
			err = aacDecoder_DecodeFrame(decoder, (INT_PCM *)decdata,decsize / sizeof(INT_PCM), 0);
			if(err != AAC_DEC_OK){
				printf("Failed to DecodeFrame: %d\n", err);
				break;
			}
			//获取解码后码流的信息
			CStreamInfo *info = aacDecoder_GetStreamInfo(decoder);
			printf("--------------------frameSize:%d ",info->frameSize );//输出解码数据大小
			printf("-------------------- sampleRate:%d ", info->sampleRate);//输出解码后采样率
			printf("-------------------- numChannels:%d ", info->numChannels);//通道数
			printf("-------------------- aacSampleRate:%d ", info->aacSampleRate);//输入aac数据采样率
			//int flen = convert_16khz_to_8khz(tmp,decdata,info->frameSize*2); 重采样需要可以到其他链接中获取
			fwrite(decdata,info->frameSize*2,1,m_fd2);
			frameCnt++;
		}

	}while(1);
	aacDecoder_Close(decoder);
	if(data)
		free(data);
	if(decdata)
		free(decdata);
	if(m_fd)
		fclose(m_fd);
	if(m_fd2)
		fclose(m_fd2);
}
}
相关推荐
Dovis(誓平步青云)32 分钟前
《QT学习第四篇:常见事件与UDP、TCP、文件系统、(锁、信号量、条件变量》
c语言·开发语言·汇编·qt
.千余14 小时前
【C++】C++类与对象2:C++构造函数、运算符重载与流输入输出全面解析
c语言·开发语言·前端·c++·经验分享
QiLinkOS15 小时前
【用呼吸重构创造价值关系——QiLink生态】
c语言·数据结构·c++·人工智能·单片机·嵌入式硬件·算法
水无痕simon15 小时前
8 判断,分支,循环语句
c语言
朔北之忘 Clancy15 小时前
2026 年 3 月青少年软编等考 C 语言二级真题解析
c语言·开发语言·c++·学习·青少年编程·题解·考级
CCC:CarCrazeCurator16 小时前
Diffusion Transformer(DiT):原理、与 U-Net 对比及在视频生成中的深度应用
人工智能·音视频·transformer
万法若空16 小时前
Libevent C语言开发完全教程:从入门到实战
c语言·网络
kkeeper~17 小时前
0基础C语言积跬步之自定义类型结构体
c语言·开发语言
小何code18 小时前
C语言【初阶】第1节,初识C语言
c语言·开发语言
莫陌尛.19 小时前
Fuzzy C-Mean Clustering (FCM)
c语言·开发语言