【问题标题】:Set a subtitle language using ffmpeg使用 ffmpeg 设置字幕语言
【发布时间】:2013-07-29 11:43:07
【问题描述】:

我尝试在谷歌上搜索一种使用 ffmpeg 设置字幕流语言的方法,并找到了 -slang 选项。于是我尝试了以下命令,但立即收到错误:

ffmpeg -i input.avi -i subs.srt -c:a copy -c:s mov_text -slang eng -c:v libx264 -profile:v high -level:v 4.0 output.mp4
ffmpeg version 1.1 Copyright (c) 2000-2013 the FFmpeg developers
built on Jul 18 2013 23:00:53 with Apple clang version 4.0 (tags/Apple/clang-421.0.60) (based on LLVM 3.1svn)

libavutil 52. 13.100 / 52. 13.100

libavcodec 54. 86.100 / 54. 86.100

libavformat 54. 59.106 / 54. 59.106

libavdevice 54. 3.102 / 54. 3.102

libavfilter 3. 32.100 / 3. 32.100

libswscale 2. 1.103 / 2. 1.103

libswresample 0. 17.102 / 0. 17.102

libpostproc 52. 2.100 / 52. 2.100

无法识别的选项“俚语”。

拆分参数列表时出错:找不到选项

经过更多谷歌搜索后,我找到了另一种使用 -metadata 命令的方法:

ffmpeg -i input.mp4 -i subs.srt -c:a copy -c:v copy -c:s mov_text -metadata:s:s:0 language=eng output.mp4

这绝对没问题。但这在 ffmpeg 手册页中没有提到,而 -slang 是,这让我认为 -metadata 命令可能已经过时或者在其他方面不如 -slang。

  1. 使用上述两种方法(-slang vs -metadata)有什么区别?
  2. 为什么我的 -slang 命令出错了?我用错了吗?

【问题讨论】:

  • 您应该为每个 ffmpeg 命令包含完整的 ffmpeg 控制台输出。

标签: ffmpeg subtitle


【解决方案1】:

选项

-metadata:s:1 语言=eng​​p>

在流 id 1 上将元数据语言设置为 eng(在典型情况下,即第一个音频流)。而选项

-metadata:s:s:0 语言=eng​​p>

在第一个字幕流上将元数据语言设置为eng

来自 ffmpeg 手册页:

-metadata[:metadata_specifier] key=value(输出,每个元数据)
设置元数据键/值对。

可以提供可选的metadata_specifier 来设置流或章节的元数据。有关详细信息,请参阅“-map_metadata”文档。

s[:stream_spec]
每个流元数据。 stream_spec 是流说明符,如流说明符一章中所述。在输入元数据说明符中,复制第一个匹配流。在输出元数据说明符中,所有匹配的流都被复制到。

最后从流说明符一章中,我们看到

流说明符的可能形式有:
stream_index
将流与此索引匹配。例如。 “-threads:1 4”会将第二个流的线程数设置为 4。

stream_type[:stream_index]
stream_type 是以下之一:“v”表示视频,“a”表示音频,“s”表示字幕,“d”表示数据,“t”表示附件。如果给定了stream_index,则匹配此类型的流号stream_index。否则匹配此类型的所有流。

【讨论】:

    【解决方案2】:

    经过一番研究,找到了 -slang 不起作用的原因。事实上,您使用的是最新版本的 ffmpeg,这是一件好事,但如果 the documentation 仍然描述该选项,您可以在 ChangeLog 中找到:

    version 0.9:
    ...
     * -metadata can now be used to set metadata on streams and chapters, e.g.
          -metadata:s:1 language=eng sets the language of the first stream to 'eng'.
          This made -vlang/-alang/-slang options redundant, so they were removed.
    

    当你找到一个命令行示例时,检查使用的选项是否在你的 ffmpeg 版本中。

     ffmpeg --help >> ffmpeg-doc.txt
    

    -slang 选项不在。

    但这也证明了关于 ffmpeg 的在线文档在代码更改方面有时是不正确的。

    【讨论】:

    • 感谢您解决这个问题。知道为什么这个元数据命令似乎从 1 开始索引流,而在映射流和执行其他操作时,流从 0 开始索引?我原以为-metadata:s:1 language=eng 会将第二个流设置为英语,并将第一个流设置为您将使用-metadata:s:0 language=eng。有什么想法吗?
    • 这个索引与索引的其余部分一致。一切都从 0 开始(程序员,叹息……)。在这种情况下,流 0 是视频流(MP4 总是如此?)。因此,您将第一个音频指定为 -metadata:s:1(文件中的第二个流)或更正确地指定为 -metadata:s:a:0(文件中的第一个 audio 流)。
    • 我找不到任何有关该语言使用哪种命名约定的文档(在我的情况下,尝试指定芬兰语)。从eng 示例出发,我假设ISO 639-3(例如,fin 代表芬兰语)?
    猜你喜欢
    • 2017-11-05
    • 1970-01-01
    • 2013-09-28
    • 2015-01-13
    • 2014-11-10
    • 2021-04-07
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多