video - 如何使用 ffmpeg 从视频文件中删除一首轨道?

标签 video ffmpeg

如何使用 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/

相关文章:

audio - 在mp4文件中只延迟一个 channel 的音频流

ffmpeg - 使用 video.js 播放直播

ffmpeg - 将多个ffmpeg命令转换为一行(刻录字幕和水印)

android - 在 Android 的 WebView 中播放本地视频

ios - 视频层上的CALayer位置动画

video - jwplayer 从播放列表中的第 n 个视频开始?

android - 在不写入文件的情况下将视频录制到字节数组

c++ - 使用 videowriter opencv 的视频大小为 0 字节

ffmpeg 不接受 "%d"格式?

amazon-web-services - 带有视频缩略图的 Lambda node.js 函数