120 fps 720p-Material mit Echtzeitwiedergabe auf Ubuntu? + Bearbeitung?

Ich habe einen Laptop mit einer i7-CPU, 1,73 GHz, 8 GB RAM, Ubuntu 10.04 mit einer Grafikkarte "ATI Mobility Radeon HD 5800 Series". Ich habe compiz aktiviert (was möglicherweise einer der Schuldigen bei dem folgenden Problem ist).

Ich habe ein paar kurze Videos in 720p-Auflösung bei 120 fps (GoPro Hero 3) aufgenommen und auf meiner lokalen HD gespeichert. Die mp4-Videos reichen von 30 MB bis 500 MB, also ziemlich klein.

Ich habe eine Vielzahl von Playern ausprobiert, von denen keiner in Echtzeit zu reagieren scheint. Tatsächlich ist die Reaktionszeit so schlecht, dass ich am Anfang ein paar Frames ziemlich schnell bekomme, aber dann nur noch die ungeraden Frames jede Sekunde bis zu 5 Sekunden und der Ton scheint gespleißt zu sein! Einer meiner 8 Kerne läuft in den Boden (100%), die anderen sind im Wesentlichen ungenutzt, wobei der Videoplayer-Prozess zu 98% läuft. Das ist also offensichtlich mein begrenzender Faktor (kann kein Multi-Thread sein?).

(mplayer, xine versuchen beide, in Echtzeit zu spielen, lassen aber viele Frames fallen; vlc spielt den Ton, zeigt aber impressionistisches Rendering und bleibt dann ziemlich früh auf einem Frame hängen; avidemux spielt jeden Frame, aber etwa 1/6 der Echtzeitgeschwindigkeit ; cinelerra spielt einige der Frames nur und ziemlich langsam ab; kdenlive erlaubt mir nicht, ein 120-fps-Projekt zu erstellen; Kino konvertiert und downsampelt; Lives kann nicht folgen; OpenShot spielt den Ton ab Ok, bleibt aber beim ersten Frame hängen)

Das Abspielen von Standard-1080p-30fps-Filmmaterial verwendet etwa 65 % eines Kerns. Ich hatte erwartet, dass beim Spielen von 120 fps Frames ausfallen würden, aber nicht in dem Maße, dass ich nur alle paar Sekunden einen sehe. Tatsächlich dachte ich, dass es ungefähr 1 zu 4 spielen würde, was für meinen Zweck großartig wäre.

Ich würde mich also sehr freuen, wenn jemand von Ihnen einen Hinweis hätte, wie ich meine Grafikkarte, mein System oder was auch immer konfigurieren sollte, um eine bessere Wiedergabefähigkeit zu erhalten, dh Echtzeitwiedergabe mit meinem Rohmaterial (ohne Konvertierung oder Downsampling vor ansehen).

Dies wirkt sich auch auf meine Fähigkeit aus, die Videos zu bearbeiten, da ich nicht in Echtzeit erkennen kann, was ich mir ansehe, was beim Bearbeiten sehr unpraktisch ist. Ich möchte für die erste Phase der Bearbeitung kein Downsampling durchführen, da ich zuerst ein Gefühl für das gesamte Video bekommen und auswählen möchte, welche Abschnitte für Zeitlupe und welche Abschnitte für die normale Echtzeitwiedergabe verlangsamt werden sollen .

Haben Sie sich angesehen, was Ihre Maschine tut, zB nach oben laufen, um die Last zu sehen? Sie müssen herausfinden, wo der Engpass ist – ist es IO, CPU oder etwas anderes.

Antworten (4)

Es stimmt zwar, dass 720p-Video nur etwa die Hälfte der Daten eines 1080p-Feeds enthält, Sie müssen sich jedoch darüber im Klaren sein, dass es viel Zeit damit verbringen kann, Frames zu verarbeiten, wenn Sie das System über seine Grenzen hinaus treiben nicht rechtzeitig fertig. Je nachdem, wie der Player konfiguriert ist, kann er aufgeben und versuchen, aufzuholen, anstatt den Frame fertig zu rendern und weiter zurückzukommen.

Aus diesem Grund können Sie feststellen, dass es viel schwieriger ist, aufzuholen, sobald Sie in Rückstand geraten. Sie haben auch Probleme damit, die Daten schnell genug fließen zu lassen, da der Komprimierungsgrad höher klingt (schwieriger zu decodieren) und die CPU so ausgelastet ist, dass sie nicht daran arbeiten kann, Daten zu verschieben, um bereit zu sein lesen.

Sie sollten das Video wahrscheinlich auf eine niedrigere Bildrate umcodieren und mit der umcodierten Kopie arbeiten, um Bearbeitungsentscheidungen zu treffen, und dann erst am Ende das Video mit hoher Bildrate einwechseln. Schließlich ist der einzige Unterschied, den ein 120-fps-Video bei der endgültigen Ausgabe macht, überall dort, wo Sie am Ende einen Zeitlupeneffekt erzielen, da Sie kein Display (einschließlich Ihres Computerbildschirms) haben werden, das tatsächlich 120 Bilder pro Sekunde laden kann der Bildspeicher. Selbst 240-Hz-Bildschirme zeigen nicht so viele Frames von einer Quelle an.

Es gibt ein paar Dinge zu beachten. Die MP4-Spezifikation wurde nicht für die Wiedergabe von Dateien mit hoher Bildrate entwickelt, da die Dateien stark komprimiert und auf die Verwendung eines einzelnen Kerns für die Dekomprimierung beschränkt sind. Selbst wenn Sie 12 Kerne hätten, würde die Datei nicht schneller dekomprimieren.

Der einfachste Weg, Ihr Problem zu lösen, besteht darin, die MP4 entweder in einen anderen Codec zu codieren oder Ihre Bearbeitung vorzunehmen und Samples nach Bedarf auszusenden.

Wie @mivk oben sagte, können Sie MP4 in Animationscodec, Foto-JPEG oder Cineform codieren, wenn dies hauptsächlich für Zeitlupenzwecke dient. Diese Codecs haben eine bessere Chance, die Datei näher an der Echtzeit abzuspielen, aber selbst dann haben sie immer noch Schwierigkeiten.

Das könnte Ihnen jedoch genug Echtzeit-Wiedergabe geben, um in Ihren Editor zu wechseln, Ihre Zeitlupeneffekte zu machen und dann die Datei in 24/30/60 FPS zu exportieren, die Sie problemlos auf Ihrem Computer abspielen können.

Wenn Sie mit 120 Bildern pro Sekunde aufgenommen haben, soll dies vermutlich einen Zeitlupeneffekt erzielen. Die Wiedergabe muss also tatsächlich mit Ihrer normalen Geschwindigkeit von 24/25/30 fps erfolgen, um den Effekt zu erzielen.

Es gibt keine 120-fps-Wiedergabe. Das Maximum, das ich kenne, wäre 60p.

Was melden ffmpeg oder mediainfo als Framerate für diese Videos. Wenn sie 120 fps oder einen anderen seltsamen Wert melden, könnten Sie die Videos wahrscheinlich in einen Container umpacken, der die richtigen fps ankündigt. So etwas wie ffmpeg -r 30 -i INFILE .... -r 30 OUTFILE.

Update zur Klärung nach dem Lesen der Kommentare:

Beim Betrachten von Filmmaterial in Zeitlupe gibt es keine Transformation oder Verluste. (Wahrscheinlich ganz im Gegenteil, da Sie eine bessere Chance haben, jeden einzelnen Frame zu sehen).

Ein Frame ist ein Frame, unabhängig von Ihrer Wiedergabegeschwindigkeit.

Transformationen kommen erst ins Spiel, wenn Sie sich entscheiden, Frames wegzulassen, um eine schnellere (nicht so langsame) Geschwindigkeit zu erreichen, oder einige Frames zu verdoppeln, um den Zeitlupeneffekt weiter zu verstärken. Ihr 120-fps-Filmmaterial soll entweder mit der normalen Geschwindigkeit Ihres Films abgespielt werden (24p, 60i, ... was auch immer die richtige Geschwindigkeit für Ihr Medium ist) oder durch Verdoppeln/Auslassen von Bildern verarbeitet werden, um genau die Geschwindigkeit zu erreichen, die Sie haben will.

Sie haben das Richtige getan, indem Sie mit sehr hoher Geschwindigkeit aufgenommen haben, um einen Zeitlupeneffekt zu erzielen, und gleichzeitig genügend Bilder hatten, um die Endgeschwindigkeit bei Bedarf genauer anzupassen.

Ihr Player macht das Richtige, indem er Ihnen den von Ihnen aufgenommenen Zeitlupeneffekt genau so zeigt, wie Sie ihn aufgenommen haben.

Sehr lange (seit Ende der 1920er Jahre) gab es nur eine mögliche Wiedergabegeschwindigkeit: 24 fps und sonst nichts. Später wurden beim Fernsehen einige weitere Geschwindigkeiten für den technischen Komfort hinzugefügt: 25/50i und 30/60i (für 50-Hz- und 60-Hz-Länder). Jetzt wurde das auf 48p, 50p und 60p erweitert, aber das war's. Es gibt keine 120-fps-Wiedergabe.

Ich halte es für "normal", dass ein Videorecorder mit 120fps versucht, mit 120fps abzuspielen. Es ist nicht sehr nützlich (da Bildschirme oft 60 Mal pro Sekunde aktualisiert werden), aber darum geht es nicht. Es wäre seltsam, wenn ein Video, das mit einer bestimmten Framerate aufgenommen wurde, versuchen würde, es mit einer anderen wiederzugeben. Wenn das OP Zeitlupe möchte, muss es die 120 fps durch ein Bearbeitungsprogramm schicken, wo es als 30 fps interpretiert wird. Das ist aber Stoff für eine andere Frage.
@ Bart & alle, genau. Ich dachte, das habe ich in meinem ursprünglichen Beitrag erklärt. Der ganze Zweck besteht darin, das Rohmaterial für Slomo-Effekte oder Downsampling zu bearbeiten. Aber um auszuwählen, was ich brauche, muss ich es zuerst ohne Transformationen sehen können, damit ich keine Qualität verliere.

Wenn ich das richtig gelesen habe, möchten Sie Ihre 120-fps-Videos mit 0,25 ihrer tatsächlichen Geschwindigkeit ansehen und jeden einzelnen Frame sehen, aber mit 30 fps. Das mache ich (GoPro 3+, 720p, 120 fps), aber es ist ein bisschen kompliziert.

Ich verwende den Videosequenzeditor von Blender. Es ist nicht intuitiv, aber ein gutes Tutorial kann den Unterschied in der Welt ausmachen, das habe ich mit dem Tutorial von Mikeycal Meyers gelernt:

Sobald Sie die Grundlagen durchgegangen sind, ist es so einfach wie

  • füge deine MP4 direkt aus der GoPro hinzu
  • Entfernen Sie die Audiospur (an dieser Stelle unbrauchbar)
  • Stellen Sie "Frame Range" so ein, dass es beim letzten Frame in Ihrem Video endet
  • Stellen Sie "Auflösung" auf 1280 x 720 ein
  • Stellen Sie "Bildrate" je nach Kamera auf 30 fps oder 29,97 fps ein (meine verwendet 29,97, keine Ahnung warum)
  • setze "Output" auf // (schreibt eine Datei wie 00000-59829.???) wähle deine Wahl der "Encoding"-Einstellungen (siehe Tutorial)
  • Klicken Sie auf Animation und warten Sie eine Weile, das Ausgabevideo wird langsam mit 30 fps sein

Außerdem verwende ich zum Bearbeiten der realen Geschwindigkeit HandBrake, um die Videos neu zu sampeln, da ich nicht herausgefunden habe, wie ich Blender dazu anweisen soll. Hier ist ein Skript, das ich verwendet habe, um dies für alle Videos in einem Verzeichnis zu tun:

time for f in *.MP4; do HandBrakeCLI -i $f -o ${f}_30.mkv -f mkv -q 4 -r 29.97 --cfr; HandBrakeCLI -i $f -o ${f}_60.mkv -f mkv -q 4 -r 59.940 --cfr; HandBrakeCLI -i $f -o ${f}_120.mkv -f mkv -q 4 -r 119.88 --cfr; done

BEARBEITEN : Einen schnelleren Weg gefunden, indem ffmpeg verwendet wird, wie in https://trac.ffmpeg.org/wiki/How%20to%20speed%20up%20/%20slow%20down%20a%20video beschrieben

ffmpeg -i GOPR0604.MP4_120.mkv -q 4 -filter:v "setpts=4.0*PTS" GOPR0604.MP4_120_slowmo.mkv