FFmpeg - 如何获得打开ALAC编解码器所需的额外数据?

时间:2016-02-02 02:32:54

标签: android c++ ffmpeg

我想知道如何使用FFmpeg库从ALAC媒体文件中获取extradata,而无需手动解析文件?

我最初设置为:

avformat_open_input(&formatContext, pszFileName, 0, 0);
avformat_find_stream_info(formatContext, NULL);
av_find_best_stream(formatContext, AVMEDIA_TYPE_AUDIO, -1, -1, &codec, 0);
codecContext = avcodec_alloc_context3(codec);

目前我能够检测并找到ALAC编解码器,但无法打开返回AVERROR_INVALIDDATA的编解码器,该编解码器来自 extradata extradata_size 未设置。< / p>

avcodec_open2(codecContext, codec, NULL);

FFmpeg文档指出,某些编解码器需要将 extradata extradata_size 设置为编解码器的规范。但是这个数据不应该由 avformat_find_stream_info 设置吗?

1 个答案:

答案 0 :(得分:2)

是的,在extradataavformat_open_input()期间填充了avformat_find_stream_info()。但是,它会在您未使用的字段中填充它。您需要以下代码:

avformat_open_input(&formatContext, pszFileName, 0, 0);
avformat_find_stream_info(formatContext, NULL);
int audioStreamIndex = av_find_best_stream(formatContext, AVMEDIA_TYPE_AUDIO, -1, -1, &codec, 0);
codecContext = avcodec_alloc_context3(codec);
avcodec_copy_context(codecContext, formatContext->streams[audioStreamIndex]->codec);
avcodec_open2(codecContext, codec, NULL);

相关额外行是avcodec_copy_context(),它会将libavformat解复用程序(formatContext->streams[])中的数据复制到该上下文(codecContext)的副本中用于使用libavcodec中的解码器进行解码。