
Ich kenne mich mit FFmpeg nicht so gut aus und habe es selbst schon oft versucht, aber ich bin nicht einmal mit der Syntax klargekommen. Ich frage also Leute, die viel schlauer sind als ich. Ich möchte FFmpeg verwenden, um alle nicht-englischen Optionen zu entfernen und sie anschließend zu löschen.
Danach löschte ich alle englischen Optionen außer der ersten indizierten. Ich konnte das nicht herausfinden, egal was ich versuchte, und zerbrach mir etwa drei Stunden lang den Kopf, bis mein letzter Versuch war:
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"
Das war das einzige, für das ich die richtige Syntax hatte … und es hat trotzdem nicht richtig funktioniert. Kann mir jemand helfen, der schlauer ist als ich? Außerdem würde ich lieber alle Videos beibehalten und sicherstellen, dass es sich um Soft-Subs statt um eingebrannte handelt.
Antwort1
Die Syntax lautet -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"
Das Problem besteht darin, dass alle englischen Untertitel zugeordnet werden (nicht nur der erste Stream). Wir können FFmpeg ein zweites Mal ausführen, um nur den ersten englischen Untertitel-Stream beizubehalten, und zwar mit -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"
(Ich weiß nicht, ob es möglich ist, nur den ersten englischen Stream in einem Befehl zu behalten).
Die folgendePost, zeigt, dass die Syntax zum Zuordnen eines englischen Audiostreams lautet -map 0:a:m:language:eng
.
0:a
bezieht sich auf den Audiostream.
Wir können es durch ersetzen, um 0:s
auf den Untertitelstream zu verweisen.
Testen:
Erstellen Sie eine synthetische Videodatei mit mehreren Video-, Audio- und Untertitel-Streams (zum Testen):
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
Inhalt von in.srt
(zu Testzwecken verwendet):
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
Überprüfen der Streams input.mkv
mit dem MediaInfo-Tool:
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
Ausführen des Befehls zum Beibehalten ausschließlich englischer Untertitel:
ffmpeg -y -i input.mkv -map 0:v -map 0:a? -map 0:s:m:language:eng -codec copy tmp_output.mkv
Wenn wir MediaInfo verwenden, tmp_output.mkv
sehen wir möglicherweise, dass es zwei englische Untertitel gibt.
Führen Sie FFmpeg noch einmal aus mit -map 0:s:0
:
ffmpeg -y -i tmp_output.mkv -map 0:v -map 0:a? -map 0:s:0 -codec copy output.mkv
Beim Überprüfen der Streams von output.mkv mit dem Tool MediaInfo wird nur ein Stream mit englischen Untertiteln angezeigt:
Text
ID : 5
Language : English
Default : Yes
Forced : No