我尝试在谷歌上搜索一种方法,用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。
- 使用上述两种方法(俚语与元数据)有什么区别
- 为什么我的俚语命令会出错?我用错了吗
选项
-元数据: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的在线文档有时在代码更改方面是不正确的。