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);
}
}
相关推荐
another heaven7 小时前
【C/C++ 第一次跨越(上):用 C++11/14 停止制造新的旧代码】
c语言·c++·制造
zhanlang02177 小时前
HTML 零基础入门到企业实战【第五章 5.4】内嵌网页 iframe 标签:嵌入网页、视频、地图实战
前端·html·音视频
TengTaiTech8 小时前
头戴耳机做运动相机外接麦:一颗麦克风同时服务蓝牙通话与 3.5mm 录音的底层重构
数码相机·音视频·蓝牙·qcc
another heaven1 天前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
Code_Solitude1 天前
C语言动态内存 + 柔性数组 + 数组名退化
c语言·算法·柔性数组
2301_790355971 天前
【技术拆解】短视频配音自动化流程:从文案预处理到 SRT 字幕的 9 个环节
自然语言处理·音视频
Zwawa1 天前
让屏幕动起来:OLED动画效果,丝滑光标、帧动画和一只贪吃蛇
c语言·单片机·嵌入式
大飞哥软件自习室1 天前
视频批量截图并自动拼图是怎么做的:从四步向导、三种截帧模式到等距抽样与日志兜底的实现拆解,附 FFmpeg 调用与线程模型说明
ffmpeg·音视频·批量截图
꧁细听勿语情꧂1 天前
直接选择排序,堆排序,冒泡排序,递归快速排序、hoare版本、挖坑法、lomuto前后指针,非递归快速排序
c语言·开发语言·数据结构·算法
§ꦿCFོ༉2 天前
嵌入式八股文—C语言入门学习(四)
c语言·开发语言·学习