Konvertieren Sie variable Frameraten von ~60 FPS verlustfrei in konstante 60 FPS

Ich habe Gameplay-Aufnahmen, die mit ShadowPlay („GeForce Experience“) mit 60 FPS aufgenommen wurden, was meines Wissens zu einer variablen Framerate führt, da das Spiel manchmal Frames auslässt. Der Versuch, dieses Video in Adobe Premiere zu verwenden, führt jedoch dazu, dass der Ton des Spiels stark hinter der Grafik zurückbleibt, da Premiere es so behandelt, als ob jeder Frame dieselbe Länge hätte.

Ich habe HandBrake mit diesen Einstellungen ausprobiert:

Qualität: konstant, RF 0 (verlustfrei)
FPS: 60, konstant
Detelecine: Aus
Decomb: Aus
Denoise: Aus
Deblock: Aus

Aber das Ausgabevideo ist nicht nur viel kleiner als das Quellvideo, sondern auch in Bezug auf die visuelle Qualität massiv schlechter. Warum ist es nicht verlustfrei, wenn ich es so eingestellt habe, dass es angeblich verlustfrei ist?

Eingabevideoinfo : http://pastebin.com/7Tss4brj
Ausgabevideoinfo : http://pastebin.com/DKFEzDKk (von Mediainfo)

Wie kann ich ein Video mit variabler Framerate verlustfrei in ein Video mit konstanter Framerate konvertieren?

Wenn Sie mediainfo haben , können Sie die Anzeige für Ihre Ausgabe posten. Verwenden Sie Ansicht->Textmodus.
Hoffe, das hilft: Videoinfo eingeben: pastebin.com/7Tss4brj Videoinfo ausgeben: pastebin.com/DKFEzDKk
Technisch gesehen nicht verlustfrei, da RF als 1 und nicht als 0 aufgezeichnet wird. Trotzdem sollte es nicht " massiv schlechter in Bezug auf die visuelle Qualität " sein. Wie testen Sie die Wiedergabe?
Abspielen in VLC oder Vorschau in Premiere. Es hat überall riesige Kompressionsartefakte, besonders bei schnellen Bewegungen.
Hm, habe gerade Screenshots von den beiden Videos in VLC verglichen und es scheint ungefähr gleich zu sein. Die Vorschau in Premiere ist weitaus schlechter. Lassen Sie mich nachforschen. Es könnte ein Problem mit Premiere sein. Warum ist es jedoch RF 1, wenn ich es auf 0 gesetzt habe, und warum ist die Ausgabedatei so viel kleiner?
Okay, ein anderes Video in VLC verglichen und die Qualität ist definitiv schlechter. Eingabe: imgur.com/AKYhyuC pastebin.com/4vwJi8Vj Ausgabe : imgur.com/m5TKr0L pastebin.com/49knbRiH
Versuche es mal mit ffmpeg .ffmpeg -i in.mp4 -r 60 -crf 0 -profile:v main -c:a copy out.mp4
Sagt: x264 [error]: main profile does not support lossless [libx264 @ 00000000031c3280] Fehler beim Einstellen des Profils main. Das einzige Profil, das verlustfrei akzeptierte, war high444, das aus den 7,17 GB eine 43,2-GB-Datei erzeugte, die in VLC oder Premiere nicht abspielbar zu sein scheint (es werden seltsame Farben angezeigt). pastebin.com/MwtMPj8Q
Hoppla. Überspringen Sie das Profil, aber fügen Sie es hinzu-pix_fmt yuv420p
Das scheint funktioniert zu haben, aber die resultierende Datei ist so riesig, dass weder VLC noch Premiere sie richtig abspielen können. (Extrem niedrige Framerate und Artefakte in VLC, seltsame Farben in Premiere) Premiere scheint es exportieren zu können, aber es ist für die Bearbeitung unbrauchbar. :-( pastebin.com/7U60c0GU Wäre es möglich, die Streamdaten zu kopieren, anstatt die Pixeldaten verlustfrei zu kopieren?

Antworten (2)

Zunächst einmal: Ihre Version von Handbrake ist alt. Version 1.0.3 kam vor kurzem heraus, sie hat einige Verbesserungen gegenüber dieser älteren Version.

Zweitens ist CQ0 nicht wirklich „verlustfrei“. Es strebt eine „verlustfreie“ Qualität an, wird aber auf die Datenratenbeschränkungen des H.264-Levels stoßen , sodass Level 4.0 möglicherweise an einem bestimmten Punkt beispielsweise 100 MbPS benötigt, um eine „verlustfreie“ Komprimierung zu erreichen Begrenzen Sie es auf 20 MbPS oder so ähnlich. Beachten Sie, dass in der Ausgabe der Codierungseinstellungen in Ihrer Exportdatei „vbv_maxrate=20000“ aufgeführt ist, wo Ihre Bitrate begrenzt ist. Um also so nah wie möglich an verlustfrei zu kommen, benötigen Sie so etwas wie Level 5.2.

Wenn Sie also Ihren H.264-Pegel erhöhen, wird die Qualität verbessert, aber Premiere kann am Ende sehr hart daran tuckern. H.264 ist wirklich schlecht für die Bearbeitung. Es ist sehr rechnerisch komplex, vor allem, weil es nicht jeden Frame separat speichert (sogenannte Intraframe-Komprimierung), sondern Batches von Frames (als Group of Pictures oder GOP bezeichnet) nimmt und sie so zusammenkomprimiert, dass jeder einzelne Frame darin enthalten ist Eine GOP hängt von den umgebenden Frames ab, um ein vollständiges Bild zu reproduzieren. Dies wird als Interframe-Komprimierung bezeichnet, und die Anzahl der Frames in einer GOP hängt von den Parametern ab, die zum Zeitpunkt der Codierung festgelegt wurden, und kann sogar variabel sein (nicht typisch), aber Sie können sehen, was diese Parameter in MediaInfo sind, indem Sie die Zeile mit der Aufschrift „Format Einstellungen, GOP" ("N=30" bedeutet 30 Frames pro GOP), oder schauen Sie sich die Codierungseinstellungen an, wo "keyint" (Keyframe Interval) vermerkt ist. Sie müssen also alle 30 Frames decodieren, um Ihnen einen beliebigen Frame anzuzeigensehr CPU- und RAM-intensiv.

Wenn Sie den Speicher haben, würde ich empfehlen, die Verwendung von DNxHD in Betracht zu ziehen, einem "Mezzanine" (bearbeitungsfreundlichen) Codec, der die Qualität bewahrt, als "praktisch verlustfrei" gilt, aber nur geringe Auswirkungen auf CPU/RAM hat. Der Haken sind sehr hohe Bitraten. Wir sprechen also von ~130-200 GB/h bei 1080p59,94. Der andere Haken ist, dass DNxHD sehr begrenzte unterstützte Auflösungen und Bildraten hat . Es gibt auch CineForm, das eine ebenso hohe Qualität hat, aber viel flexibler ist, und sowohl CineForm als auch DNxHD werden von Premiere nativ unterstützt (CineForm in 2015 und höher), aber zuletzt habe ich überprüft, ob die CineForm-Unterstützung in anderen Tools wie ffmpeg fehlt.

Eine bearbeitungsfreundlichere Lösung wäre also, ffmpeg zu verwenden, um DNxHD mit einer Befehlszeile wie folgt zu erstellen:

ffmpeg -i (input file).mp4 -c:v dnxhd -b:v 290M -c:a pcm_s16le -r 60 (output).mxf

Das würde DNxHD mit unkomprimiertem Audio in einer MXF-Op1a-Datei machen. Sie könnten dort auch .mov an das Ende hacken und stattdessen genauso einfach eine Quicktime-Datei erstellen. Beachten Sie, dass -r die Ausgabebildrate festlegt. Sie könnten versuchen, H.264 in ffmpeg zu verwenden, indem Sie den Video-Codec (-c:v) ändern, aber Sie werden auf die gleichen Einschränkungen stoßen wie bei der Arbeit mit Handbrake, daher weiß ich nicht, ob es sich wirklich lohnt, zu gehen in das hier.

CQ0 ist eigentlich verlustfrei. Wenn Sie einen SSIM-Vergleich mit der Quelle durchführen, lautet das metrische Ergebnis 1,0, dh perfekte Wiedergabetreue. H.264-Pegel sind für Hardware-Decoder gedacht, sodass sie es elegant ablehnen können, einen Stream zu decodieren, der über ihre Fähigkeiten hinausgeht, anstatt eine stotternde Wiedergabe zu rendern. Aber sie schränken x264 nicht ein. Es wird sich beschweren, wenn Ihre Auflösung/Bitrate ein explizit festgelegtes Niveau überschreitet, aber trotzdem fortfahren.
Um den Dekodierungsaufwand zu reduzieren, können Sie jederzeit eine niedrige GOP-Größe festlegen und B-Frames deaktivieren. Ich benutze Handbrake nicht, aber mit ffmpeg geht das ganz einfach. DNxHD verwendet mehr Bandbreite als nötig.
Ich bin mir nicht sicher, ob h264 cq0 in Bezug auf die Bittiefe verlustfrei ist. Ich meine, wenn Sie von 8 Bit auf 8 Bit wechseln, ist dies in Ordnung von h264 crf 0 ist verfügbar. @Mulvya gibt es eine 16-Bit-Option pro Komponente + Alpha?
Alpha ist nicht verfügbar und x264 unterstützt nur 8 und 10 Bit.

Ich nehme meine Shadowplay-Inhalte mit den folgenden Einstellungen auf:

  • 1440p
  • 50 MBit/s
  • 60 FPS
  • Mikrofon und Desktop-Audio auf separaten Kanälen

Es ist also nicht mit dem erwähnten DNxHD kompatibel. Die Audiokanäle liegen ebenfalls in variablen Frameraten vor und müssen synchronisiert werden.

Im Folgenden werden Video und Audio in 60 FPS CFR neu codiert und es treten keine Probleme mit der Audiosynchronisierung in Adobe Premier auf. Sie speichern es in einer Batchdatei (.bat) und führen es dann über die Befehlszeile mit der Videodatei als erstem Argument aus.

@echo off
set inputFile=%1
set outputFile=%inputFile:.mp4=_cbr.mp4%
ffmpeg  ^
-i %inputFile% ^
-vsync 1 -async 1 ^
-map 0:v:0 ^
    -c:v libx264 ^
    -preset veryfast ^
    -x264-params "nal-hrd=cbr" ^
    -b:v 50M ^
    -framerate 60 ^
-map 0:a:0 ^
    -c:a:0 aac ^
    -b:a 384k ^
-map 0:a:1  ^
    -c:a:1 aac ^
    -b:a 384k ^
%outputFile%

Beim Vergleich einzelner Frames ist mir kein Qualitätsunterschied zwischen dieser und der Originalaufnahme aufgefallen. Sie können einige der Optionen wie die Framerate ändern, um sie an Ihren Inhalt anzupassen, oder die Bitrate erhöhen, wenn Sie glauben, dass es zu Verlusten kommt.