c++ - 解析具有多个流的音频文件时出错 - ffmpeg
问题描述
我正在 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 个流需要进行哪些更改?
解决方案
我找到了问题的根源。例如,请参考此链接。 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;
}
}
推荐阅读
- android - 获取 AppBarLayout 并调用 setFitsSystemWindows() 时出现 NullPointerException
- list - 在表格的每一列中拆分列表数据
- c# - 如何区分外部类和嵌套类
- java - Kafka Consumer 没有通过 Java 读取主题数据
- javascript - Vue模板中的数组未更新
- php - 如果用户使用 php 登录,如何仅使页面可访问
- powershell - powershell foreach 名称执行调用命令
- php - 具有高级自定义字段的嵌套 Wordpress 帖子对象循环
- angular - 带有输出参数的 Angular 2 降级组件到 Angular 1
- c# - 如何在双击时将可观察的集合数据网格与文本框绑定?