本文主要讲解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