我正在研究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')
但是,当我以audacity打开音频文件并导出而没有图像文件时,它可以工作。处理1个以上的流需要进行哪些更改?
我找到了问题的根源。请参考此链接。 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;
}
}