【问题标题】:Mapping streams by language in FFmpeg在 FFmpeg 中按语言映射流
【发布时间】:2016-12-02 16:48:14
【问题描述】:

我有很多包含多种音频和字幕语言的文件,但是曲目编号不一致(英文音频流并不总是第一个)所以使用如下命令:

ffmpeg -i "input.mkv" -map 0 -map -0:a:1 -c:v copy -c:a copy "output.mkv"

不会产生预期的结果。在四处搜索后,我发现可以使用以下命令根据语言映射流:

ffmpeg -i "input.mkv" -map 0 -map -0:m:language:eng -c:v copy -c:a copy "output.mkv"

但是-map -0:m:language:eng 将删除所有带有英语标志的曲目。要保留字幕轨道,您可以使用-map 0:s 这是一个很好的解决方案,但是我想知道是否可以仅根据语言映射音频流。即,

我想删除英文音频,同时保留所有其他流而不使用流 ID。

【问题讨论】:

    标签: audio video ffmpeg


    【解决方案1】:

    -0:m:language:eng 将删除英文音轨并保留所有其他音轨。

    要仅保留英文音轨并删除所有其他音轨,请删除开头的破折号:0:m:language:eng 开头的破折号创建了一个负映射,它告诉 ffmpeg“删除这个并且只删除与这个匹配的东西”

    我知道这是 8 个月后的事了,但我认为这对那些像我一样因为谷歌搜索而来到这里的人会有所帮助。

    【讨论】:

    • 一个小警告:如果你使用相反的地图(没有“-”),如果有多个相同语言的流(例如,相同的不同类型的字幕)可能会导致问题语)。这可能会破坏需要单个流的命令,例如提取 .srt 字幕的命令。
    【解决方案2】:

    以下将复制视频和仅英语的音频流。

    ffmpeg -i "G:\VIDEO_TS\VTS_01_1.VOB" -map i:0x1e0 -map i:0x80 "THE STRANGERS 1.mp4"

    【讨论】:

      【解决方案3】:

      编辑:忽略初始回复。目前不可能。在顶部使用解决方法。

      ffmpeg -i "in.mkv" -map 0:a -map -0:m:language:eng -map 0:v -map 0:s -map 0:d? -map 0:t? -c copy "out.mkv"
      

      这达到了预期的结果,因为 ffmpeg 以给定的顺序实现地图选项。


      您需要将元数据选择器添加到流类型选择器的后缀,即

      ffmpeg.exe -i "%f" -map 0 -map -0:a:m:language:eng -c:v copy -c:a copy "../%f"
      

      【讨论】:

      • 起初这似乎可行,但我遇到了一些问题。我的视频有两个音轨 #0 英语 #1 日语,音频是 ogg vorbis,他们必须更正语言标志。运行上面的命令会输出一个仅包含英文音频的文件。即使我尝试将 -0:a:m:language:eng 更改为 -0:a:m:language:jpn 我也会得到相同的结果。无论我做什么,它似乎都只是删除了第二首曲目。
      • 这可行但不是很简单: ffmpeg -i "input,mkv" -map 0:v -map 0:s -map 0:a:m:language:jpn -c:v复制 -c:a 复制“output.mkv” 我不明白为什么“-map 0 -map -0:a:m:language:eng” 在“-map 0 -map -0:m:语言:eng" 可以。
      • 实际上,我的回答和您的解决方法都不起作用。您的解决方法“有效”,因为 ffmpeg 将 -map 0:a:m:language:jpn 评估为 -map 0:a:1,在您的情况下恰好是 jpn 音频。目前,这不是直接可能的,但我已经用解决方法替换了我的答案。
      • 您好 Gyan,我不太明白您所说的 “我的回答和您的解决方法都不起作用...目前不可能。请在上面使用解决方法”。即,您的答案是否有效?谢谢
      • 我原来的命令,在底部,现在应该可以工作了。在撰写本文时,解析器实际上无法评估 -map -0:a:m:language:eng
      【解决方案4】:

      更新据我所知,这是删除英语音频同时保留所有其他流而不使用流 ID 的最佳方法,我发现流 ID 与语言标志更不一致。通常人们使用正确的语言标志,但音频语言不太可能保持相同的 ID。

      ffmpeg -i "in.mkv" -map a -map -m:language:eng -map v -map s -map d? -map t -c:v copy -c:a copy "out.mkv"

      该命令将映射每个音频流,然后删除带有English 语言标志的音频。然后它将映射所有视频、字幕和附件流。如果需要,您可以添加 -disposition:a:0 default 为第一个音频流提供 [default] 标志。注意:仅在删除已具有默认标志的音频时使用。将-disposition:a:0 更改为-disposition:a:1 等等,如果您想将不同的音轨设置为默认值。

      【讨论】:

      • 此命令将复制视频流*和非英文字幕流。 *除非视频被标记为英语,通常不是。我的解决方法避免了这种情况。
      • 嗯,您的解决方案不会映射附件,但如何在不使用 -map 0 或提供每个附件流的 ID 的情况下做到这一点?您发布的第一个解决方法是制作一个临时文件,这使得该过程需要更长的时间。此外,如果您在删除英文流后不使用-map 0:v,如果视频有英文标志,视频不会被删除吗? ?
      • 修改了解决方法以保留数据和附件流。您最初的目的,IIRC,是只删除英语音频流。我的解决方法就是这样做并让其他所有事情都通过。
      • 您编辑的命令仍然会删除带有英文标志的视频,不应该是ffmpeg -i "in.mkv" -map 0:a -map -0:m:language:eng -map 0:v -map 0:s -map 0:d? -map 0:t -c:v copy -c:a copy "out.mkv"
      猜你喜欢
      • 1970-01-01
      • 2018-08-11
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 2021-12-07
      相关资源
      最近更新 更多