使用ffmpeg设置字幕语言



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

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。54年2月3日。3.102

libavfilter 3。32.100/3。32.100

libswscale 2。1.103/2。1.103

libswresample 0。17.102/0。17.102

libpostdoc 52。2.100/52。2.100

无法识别的选项"slash"。

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

经过更多的谷歌搜索,我找到了另一种使用-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手册页中没有提到这一点,而-slack是,这让我认为-metadata命令可能已经过时,或者在其他方面不如-slack。

  1. 使用上述两种方法(俚语与元数据)有什么区别
  2. 为什么我的俚语命令会出错?我用错了吗

选项

-元数据:s:1语言=eng

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

-元数据:s:s:0语言=eng

在第一字幕流上将元数据语言设置为CCD_ 2。

来自ffmpeg手册页:

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

可以给出可选的CCD_ 3来设置流或章节上的元数据。有关详细信息,请参阅"-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。否则匹配此类型的所有流。

经过一些研究,找到了俚语不起作用的原因。事实上,您使用的是最新版本的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.

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

 ffmpeg --help >> ffmpeg-doc.txt

-slang选项不在.中

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

最新更新