使用ffmpeg设置字幕语言

21

我尝试在谷歌上搜索如何使用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

未识别选项“slang”。

在分割参数列表时出错:未找到选项

通过更多的搜索,我发现另一种使用元数据命令来完成的方法:

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手册中没有提到-metadata命令,而有关-slang的内容,这使我想到-metadata命令可能已经过时或者在某些方面不如-slang命令。

  1. -slang和-metadata的使用方法有何不同?
  2. 为什么我的-slang命令会出错?我使用不正确吗?

1
你应该为每个ffmpeg命令包含完整的控制台输出。 - llogan
2个回答

37

选项

-metadata:s:1 language=eng

将流ID为1的元数据语言设置为eng(通常是第一个音频流)。而选项

-metadata:s:s:0 language=eng

在第一个字幕流上将元数据语言设置为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的流。否则匹配该类型的所有流。


10

经过一些研究,发现-slang无法正常工作的原因。如果您使用最新版本的ffmpeg,那么这是一件好事,但是如果文档仍然描述该选项,则可以在更改日志中找到:

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
< p > -slang 选项不存在。

但它也证明在线文档关于ffmpeg的代码变更有时是不正确的。


3
谢谢你澄清这一点。不知道为什么 metadata 命令似乎从 1 开始索引流,而在映射流和执行其他操作时,流是从零开始索引的。我本以为 -metadata:s:1 language=eng 应该将第二个流设置为英语,而要设置第一个流,则可以使用 -metadata:s:0 language=eng。你有什么想法吗? - sion
2
这种索引方式与其他索引方式一致。所有东西都从0开始(程序员叹气...)。在这种情况下,流0是视频流(这在MP4中总是如此?)。因此,您可以将第一个音频指定为-metadata:s:1(文件中的第二个流)或更正确地指定为-metadata:s:a:0(文件中的第一个音频流)。 - jimtut
2
我找不到任何关于在这种语言(在我的情况下是芬兰语)中使用哪种命名约定的文档。根据“eng”的示例,我会假设使用ISO 639-3(例如,用于芬兰语的代码是fin)? - dsample

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接