如何使用 ffmpeg 从视频文件容器(.vob 或 .mkv)中只删除一个轨道(不是全部)?
我知道我可以将容器中的视频 (-c:v copy -an
) 和特定音轨复制到两个单独的文件中,然后将它们合并。
但是有没有更简单的方法呢?我可以只从容器中删除特定的音轨吗? ffmpeg 命令?
最佳答案
最有效的方法是使用 negative mapping在 -map
选项中排除特定流(“轨道”),同时保留所有其他流。
删除特定的音频流/轨道
ffmpeg -i input -map 0 -map -0:a:2 -c copy output
-map 0
从输入中选择所有流。-map -0:a:2
然后取消选择音频流 3。流索引从 0 开始计数,因此音频流 10 将是0:a:9
.
删除所有音频流/轨道
ffmpeg -i input -map 0 -map -0:a -c copy output
-map 0
从输入中选择所有流。-map -0:a
然后从输入中取消选择所有音频流。
删除特定的音频流/轨道
保留除音频流#4(偏移量 3)和#7(偏移量 6)之外的所有内容:
ffmpeg -i input -map 0 -map -0:a:3 -map -0:a:6 -c copy output
删除所有字幕和数据
ffmpeg -i input -map 0 -map -0:s -map -0:d -c copy output
仅包含视频和音频
这个例子不需要使用任何负映射。
ffmpeg -i input -map 0:v -map 0:a -c copy output
删除其他流/轨道类型
如果您想删除其他流类型,您可以使用适当的 stream specifier .
v
- 视频,例如-map -0:v
a
- 音频,如-map -0:a
(如上图)s
- 字幕,例如-map -0:s
d
- 数据,例如-map -0:d
t
- 附件,例如-map -0:t
提取或删除特定音频 channel
使用立体声输入和 channelsplit筛选。仅获取正确 channel 并输出单声道音频文件的示例:
ffmpeg -i stereo.wav -filter_complex "[0:a]channelsplit=channel_layout=stereo:channels=FR[right]" -map "[right]" front_right.wav
channel_layout
是输入流的 channel 布局。默认为立体声
。channels
列出要提取为单独输出流的 channel 。默认值为all
,它将每个输入 channel 提取为单独的单独流。请参阅
ffmpeg -layouts
以获取可接受的 channel 布局列表(对于channel_layout
选项)和 channel 名称(对于channels
选项) ).参见 FFmpeg Wiki: Audio Channels更多示例。
更多信息
关于video - 如何使用 ffmpeg 从视频文件中删除一首轨道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38161697/