FFMPEG: Ist es möglich, Ausgangsframes von einer Auswahl bestimmter Frames zu versetzen?

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!

Antworten (2)

start_numberwird bei frame_pts ignoriert, daher ist eine Problemumgehung erforderlich. Eine generische Option output_ts_offsetist 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 vsyncetwas 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

Standard-vsync für Bilder ist CFR, und daher dupliziert ffmpeg Frames, wenn die Zeitstempel zwischen Ausgabeframes größer sind als die für benachbarte Frames erwarteten. vsync 0 wird benötigt, um das zu deaktivieren.