我们首先明确一点aac是编码后的数据,pcm是原始数据。所以我们也就是要对aac进行解码操作。
我们先上解码的流程图,然后一步一步进行解析。

第一步创建输入文件AVFormatContext
fmt_ctx = avformat_alloc_context();
if (fmt_ctx == NULL)
{
ret = -1;
printf("alloc fail");
goto __ERROR;
}
if (avformat_open_input(&fmt_ctx, in_file, NULL, NULL) != 0)
{
ret = -1;
printf("open fail");
goto __ERROR;
}
第二步 查找文件相关流,并初始化AVFormatContext中的流信息
if (avformat_find_stream_info(fmt_ctx, NULL) < 0)
{
ret = -1;
printf("find stream fail");
goto __ERROR;
}
av_dump_format(fmt_ctx, 0, in_file, 0);
avformat_find_stream_info这一步很重要,不然AVFormatContext中的流信息是空的。
第三步查找音频流索引和解码器
int stream_index = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, &cod, -1);
这一步我们就可以获得音频流的索引和解码所需要的解码器
第四步设置解码器上下文并打开解码器
AVCodecParameters *codecpar = fmt_ctx->streams[stream_index]->codecpar;
if (!cod)
{
ret = -1;
printf("find codec fail");
goto __ERROR;
}
cod_ctx = avcodec_alloc_context3(cod);
avcodec_parameters_to_context(cod_ctx, codecpar);
ret = avcodec_open2(cod_ctx, cod, NULL);
if (ret < 0)
{
printf("can't open codec");
goto __ERROR;
}
打开解码器需要解码上下文,解码器上下文的参数我们通过avcodec_parameters_to_context从AVFormatContext对应流的codecpar参数获取

本文详细介绍使用FFmpeg从AAC编码格式解码为PCM原始音频数据的过程。文章按步骤解析了创建输入文件、查找音频流、设置解码器、重采样等关键环节,并提供了完整的代码实现。

1417

被折叠的 条评论
为什么被折叠?



