2013-07-29 47 views
8

我試着用谷歌搜索的方式用ffmpeg設置小標題流的語言並找到-slang選項。所以,我想下面的命令,而是立即收到一條錯誤:使用ffmpeg設置小標題語言

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

Unrecognized option 'slang'.

Error splitting the argument list: Option not found

更google搜索,我發現另一種方式來做到這一點使用 - 元數據命令後:

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命令給出錯誤?我用錯了嗎?
+1

您應該包括每個ffmpeg的命令的競爭ffmpeg的控制檯輸出。 – LordNeckbeard

回答

3

經過一番研究,發現-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

感謝您解決這個問題。任何想法爲什麼這個元數據命令似乎從1開始索引流,而當映射流和執行其他操作時,流是從零開始索引的?我原以爲'-metadata:s:1 language = eng'會將第二個流設置爲英文,並設置第一個要使用'-metadata:s:0 language = eng'的流。有什麼想法嗎? – Sam

+0

不知道奇怪的元數據索引從1開始。 – alexbuisson

+1

此索引*與*其餘索引一致。一切從0開始(程序員,嘆了口氣......)。在這種情況下,流0是視頻流(這對於MP4來說總是如此)。因此,您可以將第一個音頻指定爲「-metadata:s:1」(文件中的第二個流),或者更正確地指定爲「-metadata:s:a:0」(文件中的第一個* audio *流) 。 – jimtut

6

選項

-metadata:s:1 language=eng

元數據集合的語言來承攬關於流ID 1(其是,在典型的情況下,第一音頻 流)。而選項

-metadata:s:s:0 language=eng
將元數據語言設置爲 第一個字幕流。

從FFmpeg的手冊頁:

-metadata[:metadata_specifier] key=value (output,per-metadata) Set a metadata key/value pair. An optional metadata_specifier may be given to set metadata on streams or chapters. See "-map_metadata" documentation for details.
s[:stream_spec] per-stream metadata. stream_spec is a stream specifier as described in the Stream specifiers chapter. In an input metadata specifier, the first matching stream is copied from. In an output metadata specifier, all matching streams are copied to.

最後,來自流符的柱頭,我們看到

Possible forms of stream specifiers are: stream_index Matches the stream with this index. E.g. "-threads:1 4" would set the thread count for the second stream to 4. stream_type[:stream_index] stream_type is one of: 'v' for video, 'a' for audio, 's' for subtitle, 'd' for data and 't' for attachments. If stream_index is given, then matches stream number stream_index of this type. Otherwise matches all streams of this type.