【问题标题】:How to remove one track from video file using ffmpeg?如何使用 ffmpeg 从视频文件中删除一首曲目?
【发布时间】:2016-11-04 19:51:03
【问题描述】:

如何使用 ffmpeg 从视频文件容器(.vob 或 .mkv)中只删除一个轨道(不是全部)?

我知道我可以将视频 (-c:v copy -an) 和特定音轨从容器复制到两个单独的文件中,然后加入它们。

但是有没有更简单的方法?我可以从容器中删除特定的音轨吗? ffmpeg 命令?

【问题讨论】:

标签: video ffmpeg


【解决方案1】:

洛根在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 也可能有效)

感谢Discard data stream from container using ffmpeg的hamidi

【讨论】:

    【解决方案2】:

    最有效的方法是在-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

    更多信息

    【讨论】:

    • 哇,我不知道负映射功能,太棒了!
    • 代替 -0:a:1 ,删除其他音频可以使用 -0:a:0
    • 删除所有音频(并保留视频、数据等):ffmpeg -i input -map 0 -map -0:a -c copy output 同样,删除所有视频:ffmpeg -i input -map 0 -map -0:v -c copy output
    • @Synchro 我将添加一个“删除频道”部分。我不认为用户在找到这个答案时会想要这样做。
    • @AlekDavis 查看更新的答案以获取更多示例。流索引可以是全局的,也可以是基于类型的,具体取决于您要使用的语法,但所有这些示例都使用基于类型的索引。请参阅 FFmpeg Wiki: Map 了解显示差异的示例。
    【解决方案3】:

    你刚刚解决了我的 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。

    【讨论】:

      【解决方案4】:

      您正在寻找-map

      我已经改为使用avconv,但应该差不多。

      假设您有一个名为“input.vob”的文件,其中包含一个视频和两个音轨;并且您希望视频和最后一个音频具有“output.vob”。

      你会这样做:

      avconv -i input.vob -map 0:0 -c:v copy -map 0:2 -c:a copy output.vob
      

      你应该注意到:

      1. 我没有复制-map 0:1
      2. 我不需要做-an,因为有音轨。但是,如果根本没有音轨,您可能需要使用这样的属性。
      3. 有时流没有按照我描述的方式编号,例如音频可以先于视频。
      4. 如果那里有字幕流,您还需要弄清楚如何处理它们。

      您不能“就地”处理文件,您需要保存到不同的文件中。

      附:下次你可能想在video.stackexchange.com问这样的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-04
        • 2021-11-14
        • 2017-04-19
        • 1970-01-01
        • 1970-01-01
        • 2014-01-10
        相关资源
        最近更新 更多