无法理解 ffmpeg -map 命令

无法理解 ffmpeg -map 命令

我正在尝试将视频/音频从 mkv 容器复制到 mp4。运行时,ffmpeg -i input.mkv -c:v copy -c:a copy output.mp4没有显示带有波兰音频的视频。只有一个视频流,即流 #0:0。流 #0:1 是波兰音频,#0:2 是英语,#0:3 - #0:5 是字幕。

我读FFmpeg Wiki:地图但真的不明白。为什么-map 0:1在示例 1 中写了两次?它有什么-c:s作用?将 #0:0 复制到视频并将 #0:2 复制到音频的命令是什么样的?

答案1

-map <inputNo>:<streamNo>告诉 ffmpeg 获取流流号从输入输入编号并将其添加到<inputNo>以 0 开始的输出中。

有时,您可能希望两次采用相同的输入流(例如-map 0:1 -map 0:1示例中的输入流),因为您可以使用不同的编解码器/参数对每个输入流进行编码。在示例中,输出包含两次相同的音频流,一次是 MP3,另一次是 AAC。

默认情况下(即根本没有-map命令),会从输入中获取一个视频、一个音频和一个字幕流。如果要映射一个输入中的所有流,请使用-map <inputNo>

您无法通过命令获取视频只能说明一件事:您的视频轨道使用可以在 MKV 中复用但不能在 MP4 中复用的编解码器进行编码。因此它被自动丢弃。您能否发布日志ffmpeg -i input.mkv以便我们检查轨道使用哪种编解码器进行编码?

最后,-c:s用于字幕编解码器(而-c:a用于音频和-c:v用于视频)

答案2

这个例子让我明白了。想象一下以下命令:

ffmpeg -i tears_of_steel.mkv -map 0:0 -map 0:2 -map 0:1 -map 0:4 -map 0:3 -c copy tears_of_steel-v2.mkv 

以下是 ffmpeg 进行映射的方式:

Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:2 -> #0:1 (copy)
Stream #0:1 -> #0:2 (copy)
Stream #0:4 -> #0:3 (copy)
Stream #0:3 -> #0:4 (copy)

发生了什么?

在命令中,我们只有一个输入:tears_of_steel.mkv。这就是为什么我们所有的地图都以 #0 开头:...

然后我们写一个第一个映射选项:-map 0:0,它指的是我们输入的第一个流(tears_of_steel.mkv),它可能是一个视频流,但这并不重要。

因为它是第一个映射选项,所以它将被映射到我们的输出文件(tears_of_steel-v2.mkv)中的第一个流。

然后我们写入第二个映射选项:-map 0:2,它引用我们输入的第三个流。因为它是第二个映射选项,所以它映射到我们输出中的第二个流。

等等...

我在我的 github 上写道:https://github.com/lingtalfi/ffmpeg-notes/blob/master/ffmpeg-map.md

答案3

-c(选择编解码器) 和-map(选择流) 选项的工作方式如下:

-c:a -> select first or best supported audio (transcoded)
-c:a copy -> best supported audio (copied)
-map 0:a -> all audio from 1st input file (transcoded)
-map 1:a:0 -> 1st audio stream from 2nd input file (transcoded)
-map 1:a:1 -c:a copy -> 2nd audio stream from 2nd input file (copied)

要从第一个输入文件复制所有字幕流而不进行转码:

-map 0:s -c:s copy 

您的输出文件是 mp4,输入文件是 mkv,并且您选择将视频输出而不进行转码(-c:v copy)为与 mp4 兼容的格式,因此您最终得到一个没有(可播放)视频的 mp4 文件。

要么指定与 mp4 兼容的视频编码器,例如,-c:v libx264而不是,-c:v copy或者将其留空(即不要提及编码器和 ffmpeg所选编码器将是每个输出格式注册的默认编码器

如果您不想转码视频(因为这可能需要相当长的时间),请将视频流复制到同一容器,但选择您想要的音频,例如 mkv。要获取带有转码视频和选定音频的 mp4 文件:

ffmpeg -i input.mkv -map 0:0 -c:v libx264 -map 0:2 -c:a copy output.mp4

答案4

对于像我这样喜欢简单实用解释的人来说,这是一个简单的答案。当您将 mkv 复制到 mp4 并想要选择音频流

你必须写-map 0:流数减一在-c:a 副本前面

假设视频有 3 个流(您可以在 mediainfo 中看到)。第一个流是视频,第二个是默认音频,第三个是您想要的语言的非默认音频。因此您必须写入 -map 0:2 而不是 -map 0:3

另外,你必须写-map 0:0 在 -c:v 前面复制因为如果你不这样做,ffmpeg 将不会复制视频流,而你只会得到音频流(如果视频有两个视频流并且你想复制第二个,你必须写 -map 0:1)

所以最终命令行看起来像这样:

ffmpeg -i "inputpath\input.mkv" -map 0:0 -c:v copy -map 0:2 -c:a copy "outputpath\output.mp4"

在这种情况下,您将获得第一个视频流和第三个音频流

另一个例子:

ffmpeg -i "inputpath\input.mkv" -map 0:1 -c:v copy -map 0:6 -c:a copy "outputpath\output.mp4"

在这种情况下,你应该得到第二个视频流和第七个音频流

我希望这有帮助

相关内容