ffmpeg: h.264 explizit als bt.601 markieren, anstatt nicht spezifiziert zu lassen?

12

Ich möchte Videos als explizit bt.601 und nicht als "nicht spezifiziert" kennzeichnen. Ich weiß, dass Spieler normalerweise bt.601 als Standard für Videos mit einer Breite von weniger als 1280 Pixel auswählen, aber ich möchte deutlich machen, dass bt.601 die richtige Farbmatrix für ein Video ist.

Der Knackpunkt ist, dass es keine bt601Option für ffmpeg oder libx264 gibt, nur für bt709 und einige andere.

Ich habe einige Videos, die von HD verkleinert wurden und sich noch in BT7070 befinden, aber nicht richtig markiert sind. Wenn ich mir ein Video ansehe , muss ich meinen Player manchmal manuell auf BT7070 umschalten . Das explizite Markieren als bt.601 wird zukünftigen Zuschauern (z. B. mir selbst) mitteilen, dass es sich definitiv um bt.601 handelt und nicht um ein falsch getaggtes bt.709-Video, wenn ich es mir ansehe mediainfo.

Ein weiterer Anwendungsfall hierfür wäre, wenn Sie ein bt.601-Video auf 1280 oder höher hochskaliert hätten, ohne eine Colormatrix-Konvertierung (mit -vf colormatrix) durchzuführen. Spieler würden bt.709 fälschlicherweise annehmen, wenn Sie die Farbinformationen nicht spezifiziert hätten.

Der colormatrixVideofilter von FFMpeg unterstützt zwar bt601eine Eingabe- oder Ausgabefarbmatrix, setzt jedoch keine Tags. (Da es nicht den Nebeneffekt hat, die Farboptionen von ffmpeg einzustellen, weigert es sich, überhaupt mit src zu arbeiten und dasselbe zu destieren, wie z -vf colormatrix=bt601:bt601. B. )


ffmpg in  -color_primaries bt709 -color_trc bt709 -colorspace bt709  out

markiert das ausgegebene Video mit bt.709 für yuv <-> rgb. Die Tags landen im Video-Bitstream selbst, nicht nur im Container (da dies eine Codec-spezifische Sache zu sein scheint, keine Containersache, zumindest für MP4- und MKV-Container).

zB mediainfoAusgabe:

Complete name             : out.mkv
...
Writing application                      : Lavf57.14.100
Writing library                          : Lavf57.14.100


Video
ID                                       : 1
Format                                   : AVC
...
Writing library                          : x264 core 148 r2638+4 afcf21c
Encoding settings                        : cabac=1 / ref=8 / ...
Language                                 : English
Default                                  : Yes
Forced                                   : No
Color primaries                          : BT.709
Transfer characteristics                 : BT.709
Matrix coefficients                      : BT.709

Bt.709 ist also einfach zu markieren. Das Problem ist, ich sehe bt.601 nirgendwo. Ist einer der anderen Namen ein Alias ​​dafür oder gibt es wirklich keine Möglichkeit, ihn explizit anzugeben?

x264 --fullhelp output:

  --colorprim <string>    Specify color primaries ["undef"]
                              - undef, bt709, bt470m, bt470bg, smpte170m,
                                smpte240m, film, bt2020
  --transfer <string>     Specify transfer characteristics ["undef"]
                              - undef, bt709, bt470m, bt470bg, smpte170m,
                                smpte240m, linear, log100, log316,
                                iec61966-2-4, bt1361e, iec61966-2-1,
                                bt2020-10, bt2020-12
  --colormatrix <string>  Specify color matrix setting ["???"]
                              - undef, bt709, fcc, bt470bg, smpte170m,
                                smpte240m, GBR, YCgCo, bt2020nc, bt2020c

ffmpeg -h full zeigt die gleichen Optionen für die Farboptionen, die der -c:v libx264Videocodec von ffmpeg an x264 weitergibt. Ist einer von diesen ein Alias ​​für bt.601 oder hat er eine numerisch äquivalente Farbmatrix?

Peter Cordes
quelle
Ich habe genau das gleiche Problem. Haben Sie die Befehlszeile für h264 HD-Filmmaterial mit BT.601 ermittelt?
Casper
@Casper: Ja, ich habe Mulvyas Antwort akzeptiert, weil es viele Informationen gab, um die richtigen Optionen zu finden. Ich habe eine Bearbeitung vorgenommen, um die richtigen Optionen explizit einzuschließen (z -color_primaries smpte170m -color_trc smpte170m -colorspace smpte170m. B. NTSC ).
Peter Cordes

Antworten:

12

PAL und NTSC haben also unterschiedliche Farbprimäre

NTSC = SMPTE 170M = BT 601 525

PAL = BT 470 BG = BT 601 625

Siehe die Zeilen für die Werte 5 und 6 in der Tabelle auf Seite 387 des aktiven H.264- Standards .


Die richtigen Argumente für ffmpeg sind also:

NTSC:

# NTSC
ffmpeg -i input  \
 -colorspace smpte170m -color_primaries smpte170m -color_trc smpte170m

mediainfo:
Color primaries                          : BT.601 NTSC
Transfer characteristics                 : BT.601
Matrix coefficients                      : BT.601

KUMPEL:

-color_trcakzeptiert nicht bt470bg, ffmpeg -h fullzeigt aber , dass gamma28dies "BT.470 BG" für diese Option bedeutet.

# PAL
ffmpeg -i input  \
 -colorspace bt470bg -color_primaries bt470bg -color_trc gamma28

mediainfo:
Color primaries                          : BT.601 PAL
Transfer characteristics                 : BT.470 System B, BT.470 System G
Matrix coefficients                      : BT.601

-colorspaceist die wichtigste Option; Die anderen machen für Software-Player wie mpvunter Linux keinen sichtbaren Unterschied .

Gyan
quelle
Ah natürlich. Ich habe mir sogar die Wikipedia-Seite bt601 angesehen und keine Ahnung von der Tabelle mit zwei Zeilen. Derp.
Peter Cordes
Wenn Sie dieselbe Einstellung mit HandBrake vornehmen möchten, geben Sie auf der Registerkarte Video im Bearbeitungsfeld Zusätzliche Optionen die folgende Zeichenfolge ein: "colorprim = smpte170m: transfer = smpte170m: colormatrix = smpte170m"
pcunite