Ich mache einige ffmpeg (4.1.3) Transkodierungen, indem ich bestimmte Frames aus der Quelle extrahiere, in diesem Fall kann die Quelle entweder ein Film oder eine Bildsequenz sein, alles funktioniert gut mit dem folgenden Befehl:
ffmpeg -i source.mov -vf select='eq(n\,2)+eq(n\,80)+eq(n\,150)' -vsync 0 -frame_pts 1 frames_%04d.jpeg
Bei einer Quellbildsequenz muss ich nur die Startnummer angeben (da meine Frames normalerweise bei 100 oder höher beginnen):
ffmpeg -start_number 94 -i source.%04d.png -vf select='eq(n\,2)+eq(n\,80)+eq(n\,150)' -vsync 0 -frame_pts 1 frames_%04d.jpeg
Das Problem ist jedoch, dass die Frame-Nummern, die ich erhalte, genau mit den Nummern übereinstimmen, die ich angefordert habe, die vom Auswahlfilter benötigt werden, und bei 0 beginnen. Im Beispiel der Bildsequenz können Sie sehen, dass sie tatsächlich bei Frame beginnt 94, und technisch replizieren die Filme dasselbe, ihr erster Frame ist derselbe wie 94 in der Bildsequenz, und ich würde es lieben, eine Möglichkeit zu haben, die Ausgabenummern um eine bestimmte Zahl zu verschieben, damit sie mit dem entsprechenden "Quell" -Frame übereinstimmen .
Ich habe bereits versucht, am Ende vor der Ausgabe eine -start_number hinzuzufügen, die mit normalen Transcodes funktioniert, aber es scheint nicht in Kombination mit -frame_pts zu funktionieren
Ich würde es lieben, so etwas tun zu können:
ffmpeg -start_number 94 -i source.%04d.png -vf select='eq(n\,2)+eq(n\,80)+eq(n\,150)' -vsync 0 -start_number 94 -frame_pts 1 frames_%04d.jpeg
Und erhalten Sie die Frames 96, 174 und 244 anstelle von 2, 80 und 150.
Gibt es eine Möglichkeit, das zu tun?
Danke im Voraus!
start_number
wird bei frame_pts ignoriert, daher ist eine Problemumgehung erforderlich. Eine generische Option output_ts_offset
ist verfügbar, aber sie benötigt eher einen Zeitstempel als eine Bildnummer, also setzen wir zuerst die Bildrate der eingegebenen Bilder auf 1.
Verwenden
ffmpeg -start_number 94 -framerate 1 -i source.%04d.png -vf select='eq(n\,2)+eq(n\,80)+eq(n\,150)' -vsync 0 -output_ts_offset 94 -frame_pts 1 frames_%04d.jpeg
Sie müssen wahrscheinlich nur die Punkte anpassen mit: setpts=PTS+(94*TB)
. Sie müssten diese 94 für jede andere Startnummer anpassen.
Also:
ffmpeg -start_number 94 -i source.%04d.png -filter_complex select='eq(n\,2)+eq(n\,80)+eq(n\,150)';setpts=PTS+(94*TB) frames_%04d.jpeg
Ist auch vsync
etwas unnötig bei der Ausgabe in jpg.
EDIT: Den -Ausdruck korrigiert setpts
, weil ich beim ersten Mal dumm war. EDIT2: Ich kann die Frage nicht einmal richtig lesen, wie es scheint ... Der setpts
-Ausdruck wurde erneut korrigiert
Gyan