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

Android FFmpeg-如何获取打开ALAC编解码器所需的额外数据?,android,c++,ffmpeg,Android,C++,Ffmpeg,我想知道如何使用FFmpeg库从ALAC媒体文件中获取额外数据,而不必手动解析文件 我最初设置为: 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

我想知道如何使用FFmpeg库从ALAC媒体文件中获取额外数据,而不必手动解析文件

我最初设置为:

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的编解码器,AVERROR_INVALIDDATA来自未设置的外部数据和外部数据大小

avcodec_open2(codecContext, codec, NULL);

FFmpeg文档说明,某些编解码器需要将外部数据外部数据大小设置为编解码器的规格。但是该数据不应该由avformat\u find\u stream\u info设置吗?

是的,
extradata
avformat\u open\u input()
avformat\u find\u stream\u 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\u copy\u context()
,它将
libavformat
解复用器(在
formatContext->streams[]
中)中的数据复制到该上下文的副本(
codecContext
)中,您将使用
libavcodec
中的解码器进行解码,
extradata
avformat\u open\u input()
avformat\u find\u stream\u 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\u copy\u context()
,它将
libavformat
解复用器(在
formatContext->streams[]
中)中的数据复制到该上下文(
codecContext
)的副本,您将使用
libavcodec
中的解码器进行解码,谢谢,我现在可以打开编解码器,但解码后我得到:V/FFMPEG:无效零块大小33 4096 4065 V/FFMPEG:未知预测类型:3 V/FFMPEG:无效零块大小26 4096 4094 V/FFMPEG:语法元素不支持:5。可能的原因?你能在某处发布完整的代码和一个示例输入文件吗?设法解决了它。这又是执行中的一个问题。在使用avcodec_decode_audio4解码之前,我没有调用av_read_frame(formatContext和packet)。谢谢,我现在可以打开编解码器,但解码后我得到:V/FFMPEG:无效零块大小33 4096 4065 V/FFMPEG:未知预测类型:3 V/FFMPEG:无效零块大小26 4096 4094 V/FFMPEG:语法元素不支持:5。可能的原因?你能在某处发布完整的代码和一个示例输入文件吗?设法解决了它。这又是执行中的一个问题。在使用avcodec\U decode\U audio4解码之前,我没有调用av\U read\U帧(formatContext和packet)。