如何使用 ffmpeg 复制 MKV 中的视频和多个字幕流并将多个音频流重新编码为 AC3?

如何使用 ffmpeg 复制 MKV 中的视频和多个字幕流并将多个音频流重新编码为 AC3?

我有一个 MKV 格式的视频文件。我喜欢这个视频的质量,但我不喜欢 FLAC 格式的音频,因为我觉得它占用了太多空间。

它是一个双音频文件——一部带有日语和英语音频的动漫——并且里面还有几个字幕流。

这是我使用的命令:

ffmpeg -i "01.mkv" -c:v copy -c:a ac3 -c:s copy "test.mkv"

但是它只获取第一个音频和第一个字幕字符串。我需要有关多个流的映射选项的帮助。

答案1

在输入后添加-map 0,输出中包含所有类型的所有流:

ffmpeg -i "01.mkv" -map 0 -c:v copy -c:a ac3 -c:s copy "test.mkv"

您还可以告诉地图命令仅包含一些流类型

-map 0:a将复制所有音频流并且-map 0:a:1仅复制第一个音频流。

如果您的输入可能有或可能没有该类型的流,请将其附加?到末尾(即-map 0:a?)。

类型 火柴
视频
视频(不包括附加图片、视频缩略图、封面艺术)
A 声音的
s 字幕
d 数据
附件

答案2

我相信您需要指定音频和字幕流的映射以确保全部复制其中的一部分,而不是第一个。为此,您需要-map 0:a? -map 0:s? -map 0:v-c:v

这应该使你的命令

ffmpeg -i "01.mkv" -map 0:a? -map 0:s? -map 0:v -c:v copy -c:a ac3 -c:s copy "test.mkv"

map 命令用于告诉它您确实希望将那些内容拉到输出。-map 0:a:1将指定仅复制音频流编号 1,同时-map 0:a?应该有效地对其进行通配符处理并复制它们全部。

答案3

只需使用“-map 0 -scodec copy”,而不必使用所有这些选项手动指定 [v]ideo、[a]udio 和 [s]ubtitles。对我来说很管用。

来自文档:

例如,将第一个输入文件中的所有流映射到输出

ffmpeg -i INPUT -map 0 输出

我用来将 H.265 视频转换为 H.264(保留音频和字幕)的命令是:

ffmpeg -i 源.mkv -vcodec h264 -acodec 复制 -scodec 复制 -map 0 输出.mkv

尝试一下!

答案4

代码

ffmpeg -i "01.mkv" -map 0:a? -map 0:s? -map 0:v -c:v copy -c:a ac3 -c:s copy "test.mkv"

只在我只有一个源时才有效!如果我的视频在一个文件“01.mkv”中,音频在另一个文件“02.ac3”中,2 个字幕在另一个文件“subs.mkv”中,我需要做类似的事情

ffmpeg -i "01.mkv" -i "02.ac3" -i "subs.mkv" -i "subs.mkv" -map 0:v -map 1:a -map 2:s:0 -map 3:s:1 -c:v copy -c:a copy -c:s copy "test.mkv"

否则文件会损坏。请注意,“subs.mkv”被故意列为输入 2 次,因为列出 1 次然后使用

-map 2:s:0 -map 2:s:1

损坏文件!

相关内容