Mar*_*tty 6 ffmpeg video-conversion
我正在尝试将视频/音频从 mkv 容器复制到 mp4。当我跑步时,ffmpeg -i input.mkv -c:v copy -c:a copy output.mp4我没有看到带有波兰语音频的视频。只有一个视频流,流#0:0。Stream #0:1 是波兰语音频,#0:2 英语,#0:3 - #0:5 是字幕。
我阅读了FFmpeg Wiki: Map但并不真正理解它。为什么-map 0:1在示例 1 中写了两次?有什么作用-c:s?将 #0:0 复制到视频并将 #0:2 复制到音频的命令是什么样的?
-map <inputNo>:<streamNo>告诉 ffmpeg从输入inputNo 中获取流streamNo并将其添加到输出中,其中以 0 开头。<inputNo>
有时,您可能想要两次使用相同的输入流(例如-map 0:1 -map 0:1在示例中),因为您可以使用不同的编解码器/参数对每个流进行编码。在示例中,输出包含两次相同的音频流,一个是 MP3,另一个是 AAC。
默认情况下(即根本没有-map命令),从输入中获取一个视频、一个音频和一个字幕流。如果要从一个输入映射所有流,请使用-map <inputNo>.
您没有通过命令获取视频仅意味着一件事:您的视频轨道是用编解码器编码的,该编解码器可以在 MKV 中混合,但不能在 MP4 中混合。所以它会被自动丢弃。你能发布一个日志,ffmpeg -i input.mkv以便我们可以检查轨道是用哪些编解码器编码的吗?
最后,-c:s用于字幕编解码器(而-c:a用于音频和-c:v视频)
这个例子让我明白了。想象一下以下命令:
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
Run Code Online (Sandbox Code Playgroud)
以下是 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)
Run Code Online (Sandbox Code Playgroud)
发生了什么?
在命令中,我们只有一个输入: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
小智 0
这应该可行,无法在本机上测试:
ffmpeg -i input.mkv
-map 0:0 -map 0:2 \
-c:v copy \
-c:a aac \
-b:a 128k \
output.mp4
Run Code Online (Sandbox Code Playgroud)
或者
ffmpeg -i input.mkv -map 0:0 -map 0:2 -c:v copy -c:a aac -b:a 128k output.mp4
Run Code Online (Sandbox Code Playgroud)
说明
c:s是 -scodec codec 的别名,指定字幕编解码器。
-map 0:1出现两次,因为该示例有 aac 和 mp3 输出。
| 归档时间: |
|
| 查看次数: |
15804 次 |
| 最近记录: |