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);
}
}
相关推荐
猫猫的小茶馆44 分钟前
【STM32】预分频因子(Prescaler)和重装载值(Reload Value)
c语言·stm32·单片机·嵌入式硬件·mcu·51单片机
JeffersonZU1 小时前
Linux/Unix文件IO(文件描述符、原子操作、文件数据结构、open、read、write、fcntl、dup)
linux·c语言·unix·gnu
智者知已应修善业4 小时前
【51单片机用数码管显示流水灯的种类是按钮控制数码管加一和流水灯】2022-6-14
c语言·经验分享·笔记·单片机·嵌入式硬件·51单片机
美狐美颜sdk7 小时前
跨平台直播美颜SDK集成实录:Android/iOS如何适配贴纸功能
android·人工智能·ios·架构·音视频·美颜sdk·第三方美颜sdk
melonbo11 小时前
使用FFmpeg将H.264码流封装为MP4
ffmpeg·音视频·h.264
aqi0013 小时前
FFmpeg开发笔记(七十七)Android的开源音视频剪辑框架RxFFmpeg
android·ffmpeg·音视频·流媒体
森焱森14 小时前
无人机三轴稳定控制(2)____根据目标俯仰角,实现俯仰稳定化控制,计算出升降舵输出
c语言·单片机·算法·架构·无人机
慢行的骑兵15 小时前
Android音视频探索之旅 | CMake基础语法 && 创建支持Ffmpeg的Android项目
ffmpeg·音视频
Just_Paranoid15 小时前
华为云Flexus+DeepSeek征文|基于Dify构建音视频内容转录工作流
华为云·音视频·dify·maas·deepseek·flexusx
go546315846516 小时前
修改Spatial-MLLM项目,使其专注于无人机航拍视频的空间理解
人工智能·算法·机器学习·架构·音视频·无人机