解决方案
- 检查输入媒体文件是否有音频通道
- 参考采纳答案
运行环境
- Windows 10 家庭版 x64,版本号:21H1
FFmpeg N-105350-g3c804fdd4a-20220125
- 这个版本是提问前从 GitHub 下载的最新发行版
- Node.js v16.13.1
- 在 ConEmu 210912 中使用命令行执行
问题发现流程
- 遇到需求,需要用 Node.js 把一段视频转换为音频
使用 Node.js 模块
fluent-ffmpeg
转换,失败- 失败原因:
Output file #0 does not contain any stream
- 失败原因:
使用 Node.js 模块
ffmpeg
转换为 MP3,失败- 失败原因:
Output file #0 does not contain any stream
- 失败原因:
手动拼接命令行,最终拼接结果为
ffmpeg -i "test.mp4" -vn -acodec -c:v copy -c:a alac "a.wav"
失败- 失败原因:
Output file #0 does not contain any stream
- 失败原因:
尝试交换参数顺序,失败
- 失败命令行:
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
是输入文件
- 失败命令行:
修改上面的
-f
修改为-i
,失败- 失败原因:
Output file #0 does not contain any stream
- 失败原因:
这个问题搜索到的其他答案,大多数结果都无法使用,或者会出现上述的新问题,或者没有办法解决,唯一成功过的命令行是 ffmpeg -i test.mp4 a.mov
,但是我仍然无法从 mov 文件中提取音频。
你使用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参数应该放的尽可能靠前。综上:
正确能跑起来的命令是:
你可以用Mediainfo看下你的mp4文件,如果音频流本来就是mp3的,也不需要转换,直接分离出来就行了: