【发布时间】:2016-11-04 19:51:03
【问题描述】:
如何使用 ffmpeg 从视频文件容器(.vob 或 .mkv)中只删除一个轨道(不是全部)?
我知道我可以将视频 (-c:v copy -an) 和特定音轨从容器复制到两个单独的文件中,然后加入它们。
但是有没有更简单的方法?我可以从容器中删除特定的音轨吗? ffmpeg 命令?
【问题讨论】:
如何使用 ffmpeg 从视频文件容器(.vob 或 .mkv)中只删除一个轨道(不是全部)?
我知道我可以将视频 (-c:v copy -an) 和特定音轨从容器复制到两个单独的文件中,然后加入它们。
但是有没有更简单的方法?我可以从容器中删除特定的音轨吗? ffmpeg 命令?
【问题讨论】:
洛根在https://stackoverflow.com/a/38162168/2238126 的回答可能主要是回答它。但是,如果他的回答对您不起作用(就像我的情况一样),请使用-map_chapters -1。对我来说,-map_chapters -1 删除了一个我无法删除的数据流。
使用以下代码:ffmpeg -i in.mp4 -c:v copy -c:a copy -map_chapters -1 out.mp4 -y
(-map -0:d 也可能有效)
【讨论】:
最有效的方法是在-map 选项中使用negative mapping 来排除特定流(“轨道”),同时保留所有其他流。
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
使用立体声输入和channelsplit 过滤器。仅获取正确通道并输出单声道音频文件的示例:
ffmpeg -i stereo.wav -filter_complex "[0:a]channelsplit=channel_layout=stereo:channels=FR[right]" -map "[right]" front_right.wav
channel_layout 是输入流的通道布局。默认为stereo。
channels 列出要作为单独输出流提取的通道。默认值为all,它将每个输入通道提取为单独的单独流。
请参阅ffmpeg -layouts,了解接受的频道布局(channel_layout 选项)和频道名称(channels 选项)列表。
更多示例请参见FFmpeg Wiki: Audio Channels。
【讨论】:
ffmpeg -i input -map 0 -map -0:a -c copy output 同样,删除所有视频:ffmpeg -i input -map 0 -map -0:v -c copy output
你刚刚解决了我的 av1 muxing 问题,它需要 -map 0 来包含 original-video.mkv 中的字幕字体。
ffmpeg.exe -i original-video.mkv -i svt-av1.ivf -map 0 -map -0:v:0 -map 1:v:0 -c copy output.mkv
-map 0 选择所有内容,包括错误地位于输入文件的错误流中的字幕字体。 -map -0:v:0 删除所有视频。 -map 1:v:0 从第二个输入重新添加视频,这是 original-video.mkv 重新编码的 AV1。
【讨论】:
您正在寻找-map。
我已经改为使用avconv,但应该差不多。
假设您有一个名为“input.vob”的文件,其中包含一个视频和两个音轨;并且您希望视频和最后一个音频具有“output.vob”。
你会这样做:
avconv -i input.vob -map 0:0 -c:v copy -map 0:2 -c:a copy output.vob
你应该注意到:
-map 0:1
-an,因为有音轨。但是,如果根本没有音轨,您可能需要使用这样的属性。您不能“就地”处理文件,您需要保存到不同的文件中。
附:下次你可能想在video.stackexchange.com问这样的问题。
【讨论】: