
Ich extrahiere ein 1-minütiges Fragment einer Videodatei, beginnend 30 Minuten vor dem Anfang, und füge mit dem folgenden Befehl Untertitel aus einer externen Datei hinzu:
ffmpeg -ss 1800 -i input_video.m4v -ss 1800 -i input_subtitle.srt -map 1:0 -c:a aac -c:v libx264 -c:s mov_text -crf 35 -preset slow -t 60 -avoid_negative_ts 1 output_video.mp4
Das Problem, das ich habe, ist, dass das transkodierte Video eine andere Dauer hat 00:01:03.50
als erwartet 00:01:00.00
. Und wenn ich ein solches Video mit VLC abspiele, stoppt die Wiedergabe, bevor der Fortschrittsbalken das Ende erreicht.
Die Dauer beträgt nur dann genau 1 Minute, wenn ich den Untertitel-Eingang entferne. Es sieht so aus, als ob die Dauer der Ausgabedatei verlängert wird, um die letzte Phrase des Untertitels einzufügen, die innerhalb des definierten 1-Minuten-Bereichs beginnt.
Gibt es eine Möglichkeit, die Ausgabedauer genau auf den im -d
Flag festgelegten Wert zu erzwingen?
Antwort1
Aufgrund der Art und Weise, wie ffmpeg Untertiteldateien analysiert, stehen Ihnen zwei Optionen zur Verfügung:
Ausgabe im MP4-Format, aber ggf. Überspringen eines Untertitels:
ffmpeg -i input_video.m4v -i input_subtitle.srt -ss 1800 -c:a aac -c:v libx264 -c:s mov_text -crf 35 -preset slow -t 60 output_video.mp4
Dadurch sollte eine 60 Sekunden lange Datei entstehen, jedoch werden alle Untertitel übersprungen, die vor 1800 beginnen, aber darüber hinausgehen.
Ausgabe in MKV:
ffmpeg -i input_video.m4v -i input_subtitle.srt -ss 1800 -c:a aac -c:v libx264 -c:s ass -crf 35 -preset slow -t 60 output_video.mkv
Hier sind alle Untertitel vorhanden und entsprechend lang, die vor 1800 beginnen oder darüber hinausgehen. Wenn also ein Untertitel bei 1795 beginnt und bei 1802 endet, ist er in der Ausgabe 2 Sekunden lang.
2-Stufen-Methode
ffmpeg -i subfile -ss 1800 -t 60 sub.ass
Und
ffmpeg -ss 1800 -i video.mp4 -i sub.ass -c:s mov_text out.mp4
Dadurch werden die Untertitel extrahiert, die dem gewünschten Videosegment entsprechen, und diese werden dann mit dem Video multiplexiert.