在使用 FFmpeg 将视频转换为音频时报错,提示没有对应输出流

解决方案

  • 检查输入媒体文件是否有音频通道
  • 参考采纳答案

运行环境

  • Windows 10 家庭版 x64,版本号:21H1
  • FFmpeg N-105350-g3c804fdd4a-20220125

    • 这个版本是提问前从 GitHub 下载的最新发行版
  • Node.js v16.13.1
  • 在 ConEmu 210912 中使用命令行执行

问题发现流程

  1. 遇到需求,需要用 Node.js 把一段视频转换为音频
  2. 使用 Node.js 模块 fluent-ffmpeg 转换,失败

    • 失败原因:Output file #0 does not contain any stream
  3. 使用 Node.js 模块 ffmpeg 转换为 MP3,失败

    • 失败原因:Output file #0 does not contain any stream
  4. 手动拼接命令行,最终拼接结果为 ffmpeg -i "test.mp4" -vn -acodec -c:v copy -c:a alac "a.wav" 失败

    • 失败原因:Output file #0 does not contain any stream
  5. 尝试交换参数顺序,失败

    • 失败命令行:ffmpeg -c:v copy -c:a alac -f test.mp4 a.wav
    • 失败原因:Requested output format 'test.mp4' is not a suitable output format
    • 但是 test.mp4 是输入文件
  6. 修改上面的 -f 修改为 -i ,失败

    • 失败原因:Output file #0 does not contain any stream

这个问题搜索到的其他答案,大多数结果都无法使用,或者会出现上述的新问题,或者没有办法解决,唯一成功过的命令行是 ffmpeg -i test.mp4 a.mov ,但是我仍然无法从 mov 文件中提取音频。

阅读 13.4k
1 个回答

你使用ffmpeg纯靠猜的?你需要花点时间研究下ffmpeg命令行的参数,而不是东拼西凑瞎抄一堆,肯定跑不起来。

第一个报错: 你都-vn(video no)了再-c:v copy你自己觉得能成功?必然报错does not contain any stream

第二个报错:ffmpeg参数有顺序的,不能乱交换,output参数位置是放最后的,而-f参数在ffmpeg中代表filter,你的test.mp4肯定不是filter。

第三个报错:-i参数前面如果还有参数会被当作input的filter,所以顺序也不能乱,通常ffmpeg的input参数应该放的尽可能靠前。

综上:

正确能跑起来的命令是:

# 这个会调用ffmpeg默认的mp3编码器liblame对音频流进行编码
ffmpeg -i "test.mp4" -vn "tmp.mp3"

你可以用Mediainfo看下你的mp4文件,如果音频流本来就是mp3的,也不需要转换,直接分离出来就行了:

# 确保音频流就是mp3的才可以这么干
ffmpeg -i "test.mp4" -vn -c:a copy "tmp.mp3"
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题