我想知道如何使用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 设置吗?
答案 0 :(得分:2)
是的,在extradata
或avformat_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
中的解码器进行解码。