使用ffmpeg设置字幕语言

Sam*_*Sam 9 ffmpeg subtitle

我尝试用谷歌搜索一种方法来设置字幕流的语言与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)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

这非常好.但是在ffmpeg手册页中没有提到这一点,而-slang是,这让我觉得-metadata命令可能已经过时或者其他方式不如-slang.

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

小智 10

选项

-metadata:s:1 language = eng

将元数据语言设置为引入流id 1(在典型情况下,是第一音频流).而选择

-metadata:s:s:0 language = eng
将元数据语言设置为第一个字幕流.

来自ffmpeg手册页:

-metadata [:metadata_specifier] key = value(输出,每元数据)设置元数据键/值对.可以给出可选的metadata_specifier以在流或章节上设置元数据.有关详细信息,请参阅"-map_metadata"文档.
s [:stream_spec]每个流的元数据.stream_spec是Stream说明符章节中描述的流说明符.在输入元数据说明符中,复制第一个匹配流.在输出元数据说明符中,将所有匹配的流复制到.

最后从流说明符的章节中我们看到了

流说明符的可能形式为:stream_index使用此索引匹配流.例如"-threads:1 4"会将第二个流的线程数设置为4. stream_type [:stream_index] stream_type是以下之一:视频为'v',音频为'a',副标题为's','d '用于数据,'t'用于附件.如果给出stream_index,则匹配此类型的流编号stream_index.否则匹配此类型的所有流.


ale*_*son 5

经过研究后,找到了-slang无效的原因。实际上,您使用的是ffmpeg的最新版本,这是一件好事,但是如果文档中仍然描述了该选项,则可以在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.
Run Code Online (Sandbox Code Playgroud)

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

 ffmpeg --help >> ffmpeg-doc.txt
Run Code Online (Sandbox Code Playgroud)

-slang选项不在。

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

  • 感谢您解决这个问题。知道为什么这个元数据命令似乎从 1 开始索引流,而在映射流和执行其他操作时,流从 0 开始索引吗?我原以为 `-metadata:s:1 language=eng` 会将第二个流设置为英语,而将第一个流设置为使用 `-metadata:s:0 language=eng`。有什么想法吗? (2认同)
  • 此索引*与索引的其余部分*一致。一切从0开始(程序员啊,唉……)。在这种情况下,流 0 是视频流(MP4 总是这样?)。因此,您将第一个音频指定为“-metadata:s:1”(文件中的第二个流)或更正确地指定为“-metadata:s:a:0”(文件中的第一个*音频*流) 。 (2认同)
  • 我找不到任何有关该语言使用哪种命名约定的文档(在我的例子中,尝试指定芬兰语)。从“eng”示例开始,我假设[ISO 639-3](https://en.wikipedia.org/wiki/List_of_ISO_639-2_codes)(例如芬兰语的“fin”)? (2认同)