使用FFmpeg将流混合成MKV格式的Remux操作

8

我正在尝试自动化FFmpeg将给定目录中的所有视频文件重新混流为MKV格式。我目前正在使用

ffmpeg -i $INPUT -c copy $OUTPUT.mkv

然而,这种方式会忽略一些流——例如,如果只有两个音频流,则只有一个流被输出。

如何指定要将输入中的所有流复制到输出中?

由于我正在尝试自动化FFmpeg,最好的方法是命令对每个文件不进行更改,即手动使用-map指定所有流需要我首先解析每个文件。 如果需要,我可以这样做,但如果有更好的解决方案,我宁愿选择那个。


1
根据你自己的Meta讨论上的协议,这个问题应该被发送到Super User。我投票支持迁移。 - slhck
1
从http://meta.stackexchange.com/a/168743/170007 - 使用FFmpeg.exe开发应用程序并编写脚本以自动化其使用→适用于两者,但更适用于SU。我正在尝试自动化ffmpeg,所以这里是适合的,对吧?哦,谢谢你的回答 :) - sashoalm
随你喜欢——我认为这是个边界问题,因为它涉及不到编程语言,而且如果它是$INPUT或者input.mp4其实并没有什么区别。只是我在这里看到过许多这样的问题被错误地关闭了,所以我宁愿在它们最终被删除之前将它们迁移走:) 不客气。 - slhck
1个回答

22
我应该如何指定将输入的所有流都复制到输出中?
使用选项 -map,可以使用快捷方式 -map 0 来实现。
例如:
ffmpeg -i input.mkv -c copy -map 0:0 -map 0:2 output.mkv

将流0:0和0:2复制到output.mkv中。

ffmpeg -i input.mkv -c copy -map 0 output.mkv

将来自输入0 (input.mkv) 的所有输入流复制到输出中,即使有多个视频、音频或字幕流。

-map 值对应于输入编号(0 是第一个输入,1 是第二个输入,以此类推):如果您添加了一个额外的输入(-> 输入1),并且还想复制所有内容,则需要添加 -map 1

您可以使用 ffprobe 分析文件并查看哪个流被映射到哪里。如果出现未知时间戳错误,请尝试使用 -fflags +genpts。有关详细教程,请参见FFmpeg Wiki页面上的-map选项


8
如果你遇到了“无法写入未知时间戳的数据包”错误,需要在ffmpeg命令后加上“-fflags +genpts”。请参考这个错误和这里提到的解决方法:http://askubuntu.com/a/413968/135671。 - erik
如果有人找到了这个答案,但找不到 ffmpeg,那么需要知道 ffmpeg 已经不存在于Ubuntu 14.04的软件源中了。但它的分支 avconv 可以实现同样的功能(可以通过 sudo apt-get install libav-tools 命令安装)。 - JeroenHoek
另外,可以从http://ffmpeg.org/download.html下载FFmpeg构建。@JeroenHoek - slhck
维基链接现在重定向到此处:https://trac.ffmpeg.org/wiki/Map 最好更新一下。 - Nulano
@Nulano 谢谢。下次您可以直接对帖子提出修改建议! - slhck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接