解析具有多个流的音频文件时出错-ffmpeg

时间:2018-09-15 11:09:30

标签: c++ ffmpeg libav

我正在cpp中开发一个小型应用程序,该应用程序将转换音频,应用滤波器并使用ffmpeg生成波形。我正在使用ffmpeg作为库,而不是使用ffmpeg二进制文件。

我的参考来自这里。 https://ffmpeg.org/doxygen/4.0/transcode_aac_8c-example.html

我已注释掉它们退出方法的部分,并抛出以下异常。

Expected one audio input stream, but found 2

我正在使用ffmpeg的示例进行转码。但是,在尝试对包含多个流的音频文件进行转码时出现错误。通常,音频将是带有图像文件的mp3音频作为第二个流。我得到的错误是

[mp3 @ 0x1d487a0] Header missing
Could not decode frame (error 'Invalid data found when processing input')

但是,当我以大胆的方式打开音频文件并在没有图像文件的情况下将其导出时,它将起作用。要处理1个以上的流,需要进行哪些更改?

1 个答案:

答案 0 :(得分:0)

我找到了问题的根源。请参考此链接的示例。 https://ffmpeg.org/doxygen/4.0/transcode_aac_8c-example.html

经过更多调试后,似乎decode_audio_frame必须进行修改以忽略或跳过非音频流。我跳过它们如下。我不是直接调用avcodec_decode_audio4方法,而是要验证数据包的流索引并根据需要忽略。 audio_index是全局声明的字段,将在打开输入文件时设置。

int strm_index = input_packet.stream_index;
    av_log(NULL, AV_LOG_INFO, "Stream index %i\n",
                           strm_index);
    if(strm_index!=audio_index){
        *data_present=0;
    }else{
        if ((error = avcodec_decode_audio4(input_codec_context, frame,
                                               data_present, &input_packet)) < 0) {
                av_log(NULL, AV_LOG_ERROR, "Could not decode frame (error '%s')\n",
                        av_err2str(error));
                av_packet_unref(&input_packet);
                return error;
        }
    }