如何用FFmpeg刪除第一個英文頻道以外的所有字幕頻道?

如何用FFmpeg刪除第一個英文頻道以外的所有字幕頻道?

我對 FFmpeg 不太熟悉,我自己也嘗試過很多次,但我什至無法弄清楚語法 所以我要向外詢問比我聰明得多的人。我希望使用 FFmpeg 刪除所有非英語選項,然後刪除它們。

之後,刪除除第一個索引選項之外的所有英文選項。無論我如何嘗試,我都無法弄清楚這一點,並將我的頭撞到牆上大約三個小時,我最後的嘗試是:

ffmpeg -i "Episode 01 - Yaha-kui zaShunina.mkv" -map 0:v -map 0:s -map 0:m:language:eng -map:0:a:1? -codec copy "copy Episode 01 - Yaha-kui zaShunina.mkv"

這是我獲得正確語法的唯一一個......但它仍然不太有效。有比我更聰明的人可以幫忙嗎?另外,我更願意保留所有視頻,並確保它們是軟字幕而不是燒錄視頻。

答案1

語法是-map 0:s:m:language:eng

ffmpeg -y -i "Episode 01 - Yaha-kui zaShunina.mkv" -map 0:v -map 0:a? -map 0:s:m:language:eng -codec copy "copy Episode 01 - Yaha-kui zaShunina.mkv"

問題是它正在映射所有英文字幕(不僅僅是第一個流)。我們可以使用以下命令第二次執行 FFmpeg 以僅保留第一個英文字幕流-map 0:s:0

ffmpeg -y -i "Episode 01 - Yaha-kui zaShunina.mkv" -map 0:v -map 0:a? -map 0:s:0 -codec copy "copy copy Episode 01 - Yaha-kui zaShunina.mkv"

(我不知道是否可以在一個命令中僅保留第一個英語流)。


下列郵政,表示映射英語音訊串流的語法是-map 0:a:m:language:eng
0:a指的是音訊串流。
我們可以將其替換0:s為引用字幕流。


測試:

建立具有多個視訊、音訊和字幕串流的合成視訊檔案(用於測試):

ffmpeg -y -f lavfi -i testsrc=size=384x206:rate=1 -f lavfi -i sine=frequency=300 -f lavfi -i sine=frequency=400 -f lavfi -i sine=frequency=500 -i in.srt -i in.srt -i in.srt -i in.srt -i in.srt -map:v 0 -map:a 1 -map:a 2 -map:a 3 -map:s 4 -map:s 5 -map:s 6 -map:s 7 -map:s 8 -c:v libx264 -c:a:0 ac3 -ar:0 44100 -c:a:1 ac3 -ar:1 44100 -strict -2 -c:a:2 dca -ar:2 44100 -c:s ass -metadata:s:a:0 language=fra -metadata:s:a:1 language=ger -metadata:s:a:2 language=eng -metadata:s:s:0 language=fra -metadata:s:s:1 language=ger -metadata:s:s:2 language=ger -metadata:s:s:3 language=ger -metadata:s:s:4 language=eng -t 10 input.mkv

內容in.srt(用於測試):

1
00:00:00,0 --> 00:00:01,0
Sec 0 to 1

2
00:00:01,0 --> 00:00:02,0
Sec 1 to 2

3
00:00:02,0 --> 00:00:03,0
Sec 2 to 3

4
00:00:03,0 --> 00:00:04,0
Sec 3 to 4

input.mkv使用MediaInfo工具檢查流程:

Video
ID                                       : 1
Format                                   : AVC
...
Audio #1
ID                                       : 2
Language                                 : French
...
Audio #2
ID                                       : 3
Language                                 : German
...
Audio #3
ID                                       : 4
Language                                 : English
...
Text #1
ID                                       : 5
Language                                 : French
...
Text #2
ID                                       : 6
Language                                 : German
...
Text #3
Language                                 : English
...
Text #4
Language                                 : German
...
Text #5
ID                                       : 9
Language                                 : English

執行只保留英文字幕的命令:
ffmpeg -y -i input.mkv -map 0:v -map 0:a? -map 0:s:m:language:eng -codec copy tmp_output.mkv

使用MediaInfotmp_output.mkv我們可以看到有兩個英文字幕。

再次執行 FFmpeg -map 0:s:0
ffmpeg -y -i tmp_output.mkv -map 0:v -map 0:a? -map 0:s:0 -codec copy output.mkv

使用MediaInfo工具檢查output.mkv的串流只顯示一個英文字幕串流:

Text
ID                                       : 5
Language                                 : English
Default                                  : Yes
Forced                                   : No

相關內容