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);
}
}
相关推荐
松涛和鸣1 小时前
DAY20 Optimizing VS Code for C/C++ Development on Ubuntu
linux·c语言·开发语言·c++·嵌入式硬件·ubuntu
unclecss1 小时前
从 0 到 1 手写 Linux 调试器:ptrace 系统调用与断点原理
linux·运维·服务器·c语言·ptrace
fashion 道格2 小时前
从地图导航到数据结构:解锁带权有向图的邻接链表奥秘
c语言·数据结构·链表
猿大叔~3 小时前
面试必问!Linux 下 C/C++ 内存对齐深度解析:从底层原理到实战避坑
linux·c语言·面试
组合缺一3 小时前
Solon AI 开发学习8 - chat - Vision(理解)图片、声音、视频
java·人工智能·学习·ai·音视频·solon
C++ 老炮儿的技术栈4 小时前
用密码学安全随机数生成256位密钥
c语言·开发语言·c++·windows·安全·密码学·visual studio
swibyn4 小时前
【无标题】
c语言·素数
口袋物联4 小时前
设计模式之单例模式在 C 语言中的应用(含 Linux 内核实例)
c语言·单例模式·设计模式
Yeats_Liao4 小时前
CANN Samples(七):视频与流媒体:RTSP与多路输入实战
人工智能·机器学习·音视频
zore_c5 小时前
【C语言】数据在内存中的存储(超详解)
c语言·开发语言·数据结构·经验分享·笔记