Wie kann ich aus einer DPX-Sequenz mit ffmpeg ein farbkorrektes h264/MP4 erzeugen?

Wir konvertieren eine Folge von DPX-Dateien in eine MP4. Wenn der Künstler Adobe Media Encoder CC zum Generieren des Videos verwendet, stimmen die Farben mit dem ursprünglichen DPX überein. Wenn wir ffmpeg verwenden, hat das Video einen rötlichen Hinweis. Der verwendete Befehl lautet:

ffmpeg -y -start_number 0101 -i \\path\to\filename.%04d.dpx -pix_fmt yuv420p sample.mp4

Wie können wir ein Video erstellen, das der Farbe der ursprünglichen DPX-Dateien entspricht?


Die Überprüfung der Dateien mit ffprobeergab folgende Unterschiede (korrekte Datei/fehlerhafte Datei):

  • major_brand: mp42 / isom
  • Nebenversion: 0 / 512
  • kompatible_Marken: mp42mp41 / isomiso2avc1mp41
  • Encoder: nicht aufgeführt / Lavf57.34.102
  • Video: h264 (Haupt) / h264 (Hoch)
  • Video: yuv420p(tv, bt709) / yuv420p
  • Video: 1920 x 1080 / 1920 x 1080 [SAR 1:1 DAR 16:9]
  • handler_name: Alias-Datenhandler/VideoHandler

Sondenreferenzen : dpx , richtig , falsch

Antworten (2)

Ich habe den yuv420p(tv, bt709)Teil der Codierung weiterverfolgt und festgestellt, dass sich dies auf die Rec bezieht. 709 Farbraum für HDTV. In ffmpeg wird der Farbraum durch den Farbmatrixfilter definiert . Sie müssen jedoch aus einem Farbraum konvertieren. Laut einem Gespräch in einer ffmpeg-Mailingliste wird als Standardfarbraum angenommen bt601:

ISTR, dass, wenn Sie ffmpeg RGB geben, es seinen vollen Bereich annimmt, es konvertiert auch standardmäßig mit 601-Matrizen. Obwohl es eine Reihe von Farbräumen definiert hat, auf die in den Bibliotheken über die API zugegriffen werden kann, verwendet ffmpeg selbst sie nicht (obwohl ich das nagende Gefühl habe, dass das möglicherweise auch nicht mehr ganz stimmt).

Der letzte ffmpeg-Befehl, der funktionierte, war also:

ffmpeg -y -start_number 0101 -i \\path\to\filename.%04d.dpx
-vf colormatrix=bt601:bt709 -pix_fmt yuv420p sample.mp4

Die Farbe ist jetzt korrekt, aber es gibt keinen erkennbaren Unterschied in der Ausgabe von ffprobe oder MediaInfo. (Mit anderen Worten, der Farbraum der ffmpeg-generierten Datei erscheint nicht in der Ausgabe.)

Hinzufügen -colorspace 1, um die Ausgabe zu markieren.
@Mulvya großartig! Gibt es eine Option "Alles markieren"? (Ich konnte keinen finden)

Aktuelle Patches für ffmpeg haben dieses Problem behoben https://github.com/FFmpeg/FFmpeg/search?q=dpx&type=commits

Es liest jetzt Bereich, Primärfarben, Matrix und Transfer. Ganz zu schweigen von SMPTE-Timecode und alternativer Framerate.

Es gibt immer noch einen Fehler, dass es lineare Übertragung auf alle Dateien schreibt.