Exportieren Sie Frames einer 10-BPC-Videodatei mit ffmpeg

Ich habe mehrere hundert 1080p 59,94 fps 10-Bit-pro-Kanal (bpc) AVC-Intra Class 100 MXF-codierte Videodateien. Ich möchte die Frames dieser Videodatei extrahieren und sie in einem verlustfreien 16-Bit-Bildformat auf die Festplatte exportieren. Ich bin kürzlich auf diese Frage gestoßen: Video in 10-Bit-Bilder konvertieren

Also habe ich das versucht:

ffmpeg -i "testinput.mxf" -pix_fmt rgb48 _Frames/out%05d.tiff

Aber bin auf ein ziemlich unglückliches Problem gestoßen, bei dem ich nicht sicher bin, wie ich es lösen soll. Obwohl es technisch funktioniert hat und alle Videoframes in ein 16-bpc-Format exportiert wurden, erscheint die Farbe dieser Frames verwaschen. Hier ist, was ich meine:

Das erste Bild der Originalvideodatei (MXF):

Geben Sie hier die Bildbeschreibung ein

Der erste mit ffmpeg exportierte Frame:Geben Sie hier die Bildbeschreibung ein

Wie Sie sehen können, scheint die Farbe verblasst zu sein und stimmt nicht perfekt mit dem Einzelbild im Originalvideo überein. Ich weiß nicht, warum das so ist, aber es ist ein ernstes Problem, das so schnell wie möglich gelöst werden muss. Vielleicht verwende ich ffmpeg nicht richtig, oder vielleicht ist dies ein Fehler in ffmpeg. Was muss ich tun, um die Frames aus diesem bestimmten Codec korrekt zu extrahieren? Bitte helfen Sie.

Ich habe die ursprüngliche MXF-Datei hier für Ihre eigenen Testzwecke eingefügt: https://drive.google.com/open?id=1HtCmPGkIZMMMEOAVKMlLksov7QyKzqRE Hier ist ein Link zur Ausgabe des Befehls, den ich zuvor angegeben habe. Ich verwende die neueste Version von ffmpeg für Windows, ffmpeg-Version N-94150-g231d0c819f Copyright (c) 2000-2019. https://pastebin.com/8UrxJJpY

Was verwenden Sie, um Video und TIFF anzuzeigen? Frage, weil mpv es hier fast exakt anzeigt. Auf der anderen Seite könnten Sie den Zscale-Filter verwenden, um die Farbraumkonvertierung anstelle des Skalierungsfilters durchzuführen. Skalierst du auch beim Konvertieren in tiff? Wenn ja, könnte das verwaschene Farben erklären.
@PaulB.Mahol Ob in Windows Photo Viewer, VLC Media Player, Adobe After Effects oder Adobe Premiere Pro, die Frames unterscheiden sich deutlich. Ich habe nichts verkleinert.
Dann empfehle ich Ihnen, den zscale-Filter für die Pixelkonvertierung in FFmpeg auszuprobieren.

Antworten (1)

Versuchen Sie es mit:

ffmpeg -i "testinput.mxf" -vf scale=in_range=limited:out_range=full -pix_fmt rgba64 path/to/output/out%05d.tiff

stattdessen.

Aus einem Grund, der etwas außerhalb meines Verständnisses der Farbwissenschaft liegt (oder vielleicht nur etwas Seltsames bei ffmpeg), erstellte die Ausgabe des ursprünglichen Befehls .tiff-Dateien in den "eingeschränkten" (15-235) statt "vollen" (0 -255) RGB-Farbbereich. Ich habe die Scopes in Premiere Pro und DaVinci Resolve auf AB zwischen dem ersten Frame der erstellten .tiff-Sequenz und der ursprünglichen .mxf-Datei verwendet, und die Unterschiede wurden deutlich.

Wenn Sie nicht fest entschlossen sind, ffmpeg zu verwenden, konnte ich auch ein vergleichbares Ergebnis erzielen, indem ich die .mxf-Datei in eine Resolve-Timeline (in meinem Fall Version 15) importierte und dann den Arbeitsbereich „Deliver“ verwendete und 16 Bit auswählte. RGB- und .tiff-Optionen als Ausgabe und Verwendung der Bereichseinstellung „Auto“ oder „Vollständig“. Wenn Sie sich für die Lösungsroute entscheiden, können Sie jede .mxf-Datei in eine Warteschlange stellen und sie einfach exportieren lassen, bis alles abgeschlossen ist.

Es gibt geringfügige Abweichungen zwischen der ffmpeg-.tiff-Datei, der Resolve-.tiff-Datei und der ursprünglichen .mxf-Datei, aber nach meinem Verständnis ist der Prozess der Konvertierung von YUV (der ursprünglichen .mxf-Datei) in RGB (die .tiff-Sequenz) im Allgemeinen mathematisch nicht perfekt. Die Dateien bestehen jedoch den "Augapfel"-Test und sollten gut funktionieren, es sei denn, die Leute, für die Sie arbeiten, haben wirklich strenge Lieferanforderungen.

Wenn Sie wirklich tief in die Materie einsteigen wollen, können Sie die netten (und schlauen!) Leute in den Doom9-Foren für sehr fortgeschrittene Konvertierungen in AVISynth (das wirklich cool und leistungsfähig, aber auch ziemlich kompliziert ist) einführen.

Hoffe das hilft!

Die Eingabe ist YUV mit vollem Farbbereich (yuv422p10le (pc, bt709, progressiv)), während der von Ihnen bereitgestellte Befehl sie zwingt, sie als begrenzt/tv zu interpretieren.
@PaulB.Mahol Ich freue mich über Ihr Feedback. Theoretisch hast du vollkommen recht. In der Praxis war das nicht der Fall. Vielleicht stimmt etwas mit den Header-Informationen der ursprünglichen .mxf-Datei nicht? Ich habe auch scale=in_range=full und scale nur mit dem Parameter out_range=full (ohne in_range) ausprobiert, und die obige Kombination war die einzige, die richtig funktionierte. Zusätzlich habe ich eine zweite Option zur Erfüllung der Aufgabe angegeben. Danke!
Ihr ffmpeg-Code ist keine Lösung; das Ergebnis ist nicht anders als vorher. Aus Geschwindigkeitsgründen muss dies unbedingt mit ffmpeg erfolgen. Ich verstehe immer noch nicht, wie man diese Videodatei richtig dekodiert.
OK. Viel Glück für Sie