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);
}
}
相关推荐
三品吉他手会点灯31 分钟前
STM32F103学习笔记-16-RCC(第3节)-使用HSE配置系统时钟并使用MCO输出监控系统时钟
c语言·笔记·stm32·单片机·嵌入式硬件·学习
jzhwolp1 小时前
从nginx角度看数据读写,阻塞和非阻塞
c语言·nginx·性能优化
oioihoii4 小时前
《C语言点滴》——笑着入门,扎实成长
c语言·开发语言
王道长服务器 | 亚马逊云5 小时前
AWS + 发财CMS:高效采集站的新形态
服务器·网络·云计算·音视频·aws
EasyDSS6 小时前
无人机RTMP推流平台EasyDSS:构建新一代智能交通视频监控系统
音视频·无人机
say_fall6 小时前
C语言容易忽略的小知识点(1)
c语言·开发语言
Vue10247 小时前
uniapp 使用renderjs 封装 video-player 视频播放器, html5视频播放器-解决视频层级、覆盖、播放卡顿
uni-app·音视频·html5
程序员东岸9 小时前
数据结构精讲:从栈的定义到链式实现,再到LeetCode实战
c语言·数据结构·leetcode
say_fall9 小时前
C语言容易被忽略的易错点(2)
c语言·开发语言
下午见。9 小时前
深入理解C语言共用体/联合体(union):大小计算与大小端判断实战
c语言·笔记·学习