FFmpeg音频解码流程详解及简单demo参考

        本文主要讲解FFmpeg的音频解码具体流程,API使用。最后再以一个非常简单的demo演示将一个mp3格式的音频文件解码为原始数据pcm文件。 本文主要基于FFmpeg音频解码新接口。

一、FFmpeg音频解码API调用流程图      

   API接口简单大体讲解如下:

av_register_all():注册FFmpeg所有编解码器。
 
avformat_open_input():打开音频地址并获取里面的内容(解封装)
 
avformat_find_stream_info():获取内容
 
avcodec_find_decoder():寻找解码器
 
avcodec_alloc_context3():申请解码器相关上下文
 
avcodec_open2():打开解码器
 
av_read_frame():从原始有格式文件中一帧一帧读取出来
 
avcodec_send_packet():解码核心接口新接口,发送一帧音频给解码器。即是AVPacket(存储AAC等音频格式码流数据)。
 
avcodec_receive_frame():解码核心接口新接口,接收解码器解码后的一帧视频,AVFrame(PCM原始数据)。
 

二、音频解码过程API调用流程

1、注册各大组件

        这一步是ffmpeg的任何程序的第一步都是需要先注册ffmpeg相关的各大组件的:

    //注册各大组件
    av_register_all();
    LOGE("注册成功")

2、打开音频文件并获取相关上下文

        在解码之前我们得获取里面的内容,这一步就是打开地址并且获取里面的内容。其中avFormatContext是内容的一个上下文。

        并使用avformat_open_input打开播放源,inputPath为输入的地址,也就是音频文件,然后使用avformat_find_stream_info从获取的内容中寻找相关流。

//打开音频地址并获取里面的内容(解封装)
error = avformat_open_input(&avFormatContext, inputPath, NULL, NULL);
if (error < 0){
	LOGE("打开音频文件失败\n");
	return false;
}
if (avformat_find_stream_info(avFormatContext, NULL) < 0){
	LOGE("获取内容失败")
	return false;
}

3、寻找音频流

        我们在上面已经获取了内容,我们再从中找出相对应的音频流。

//获取音频的编码信息
AVCodecParameters *origin_par = NULL;
int mAudioStreamIdx = -1;
mAudioStreamIdx = av_find_best_stream(avFormatContext, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);
if (mAudioStreamIdx < 0) {
	av_log(NULL, AV_LOG_ERROR, "Can't find audio stream in input file
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值