Ich arbeite an einem Python-Skript zur Massentranscodierung von Videodateien. Diese Dateien haben unterschiedliche Frameraten, und eines der Ziele besteht darin, sie alle auf die gleiche Framerate zu bringen, indem einige intelligente Entscheidungen getroffen werden, ob die Wiedergabe verlangsamt oder beschleunigt oder Frames dezimiert oder dupliziert werden sollen. So wie ich es verstehe, wird die Framerate als zwei 32-Bit-Ganzzahlen gespeichert, zum Beispiel werden 29,97 fps tatsächlich als 30000/1001 gespeichert, und ich muss mit diesen Werten arbeiten. Ich werde diese Werte auch verwenden, um zu berechnen, wie stark das Audio gedehnt und die Tonhöhe verschoben werden muss. Die Frameraten der Quelldateien sind nicht unbedingt Standard, aber sie können alles von etwas abweichend von PAL oder NTSC bis hin zu völlig vermasselt sein, und die Verwendung der Werte, die tatsächlich in den Dateien enthalten sind, macht es einfacher, die Berechnungen durchzuführen.
Wie kann ich sie also extrahieren und im Falle einer Verlangsamung oder Beschleunigung des Videos geänderte Werte zurückschreiben?
Vorzugsweise ein Kommandozeilentool (muss auf FreeBSD laufen).
Ich bin auch offen dafür, die Header direkt aus dem Skript zu analysieren, aber leider weiß ich nicht, wo ich sie finden kann.
Die Spezifikationen, die ich gefunden habe, listen mehr oder weniger die verschiedenen Strukturen (wie in C definiert) für die verschiedenen Header auf, und ein erfahrener Programmierer kann dies möglicherweise verwenden, aber ich brauche eine einfachere Erklärung. Ich brauche keine Hilfe beim eigentlichen Scripting, ich brauche nur Hilfe, um zu verstehen, wo sich die Informationen befinden.
ffprobe kann die Framerate als rationalen Wert liefern
ffprobe in.avi -show_entries stream=r_frame_rate,avg_frame_rate -select_streams v -v 0 -of compact=p=0:nk=1
Der erste rationale Wert stammt aus dem Stream-Header; der zweite ist der berechnete Wert, der sich für einen Stream mit variabler Bildrate unterscheidet
ffmpeg -i in.avi -r 24000/1001 filter:v "setpts=1001/960*PTS" out.avi
. Ich hatte Angst, dass dies zuerst einige Frames löschen und dann einige der verbleibenden duplizieren würde, aber in den Tests, die ich durchgeführt habe, scheint es nur die fps zu ändern und dann die ursprünglichen Frames zu transcodieren.r
Wert: PTS*2002/960
Dann sehen Sie zB, dass Frames hinzugefügt werden.
Gyan
Benutzer17556
Gyan
-r N
und ffmpeg wird nach Bedarf duplizieren oder dezimieren. In jedem Fall können Sie die Framerate von ffprobe abrufen.Benutzer17556
Gyan
ffprobe in.avi -show_entries stream=r_frame_rate,avg_frame_rate -select_streams v -v 0 -of compact=p=0:nk=1
der erste rationale Wert stammt aus dem Stream-Header; der zweite ist der berechnete Wert, der sich für einen Stream mit variabler Bildrate unterscheidet.Gyan
-r N
, kümmert sich ffmpeg um das Duplizieren oder Löschen von Frames. Wenn die Eingabe VFR ist. Es wird dupliziert, wo die Rate des Segments niedriger ist, und fällt, wenn sie höher ist.Benutzer17556