ffmpeg: tagga esplicitamente h.264 come bt.601, piuttosto che lasciare non specificato?


12

Voglio taggare il video come esplicitamente bt.601, piuttosto che "non specificato". So che i giocatori in genere scelgono bt.601 come predefinito per i video con larghezza inferiore a 1280 pixel, ma voglio chiarire che bt.601 è la matrice di colore corretta per un video.

Il punto bt601critico è che non esiste alcuna opzione per ffmpeg o libx264, solo bt709 e alcuni altri.

Ho alcuni video che sono stati ridimensionati dall'HD e sono ancora nel BT709, ma non sono stati taggati correttamente. Quindi, quando guardo un video, a volte devo commutare manualmente il mio lettore su bt.709 . Contrassegnare esplicitamente come bt.601 comunicherà ai futuri spettatori (ad es. Me stesso) che è sicuramente bt.601, e non un video bt.709 etichettato male, quando lo guardo con mediainfo.

Un altro caso d'uso per questo sarebbe se si ingrandiva un video bt.601 a 1280 o superiore senza fare una conversione colormatrix (usando -vf colormatrix), i giocatori avrebbero erroneamente assunto bt.709 se non avessi specificato le informazioni sul colore.

Il colormatrixfiltro video di FFMpeg supporta bt601come matrice di colore di input o output, ma non imposta anche tag. (Dal momento che non ha l'effetto collaterale di impostare le opzioni di colore di ffmpeg, si rifiuta persino di operare con src e dest lo stesso, come -vf colormatrix=bt601:bt601.)


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

contrassegnerà il video di output come usando bt.709 per yuv <-> rgb. I tag finiscono all'interno del video bitstream stesso, non solo nel contenitore (dal momento che questa sembra essere una cosa specifica del codec, non una cosa contenitore, almeno per i contenitori mp4 e mkv).

ad es. mediainfouscita:

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

Quindi bt.709 è facile da taggare. Il problema è che non vedo bt.601 da nessuna parte. Uno degli altri nomi è un alias o non c'è davvero modo di specificarlo esplicitamente?

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 mostra lo stesso set di opzioni per le sue opzioni di colore, che il -c:v libx264codec video di ffmpeg passa a x264. Qualcuno di questi è un alias per bt.601 o ha una matrice cromatica numericamente equivalente?


Ho lo stesso identico problema. Hai capito la riga di comando da utilizzare per ottenere i filmati HD h264 taggati con BT.601?
— Casper,

@Casper: sì, ho accettato la risposta di Mulvya perché c'erano molte informazioni per cercare le opzioni giuste. Ho fatto una modifica per includere esplicitamente le giuste opzioni (es. NTSC lo è -color_primaries smpte170m -color_trc smpte170m -colorspace smpte170m).
— Peter Cordes,

Risposte:


12

PAL e NTSC hanno primari di colore diverso, quindi

NTSC = SMPTE 170M = BT 601 525

PAL = BT 470 BG = BT 601 625

Vedere le righe per i valori 5 e 6 nella tabella a pagina 387 dello standard H.264 attivo .


Quindi gli argomenti giusti per ffmpeg sono:

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

AMICO:

-color_trcnon accetta bt470bg, ma ffmpeg -h fullmostra che gamma28significa "BT.470 BG" per quell'opzione.

# 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

-colorspaceè l'opzione più importante; gli altri non fanno una differenza visibile per i lettori di software come mpvsu Linux.


Ah certo. Stavo anche guardando la pagina di Wikipedia bt601, e non avevo idea della tabella con due righe. Derp.
— Peter Cordes,

Per coloro che desiderano eseguire questa stessa impostazione con HandBrake, nella scheda Video, all'interno della casella di modifica Opzioni extra, immettere questa stringa: "colorprim = smpte170m: transfer = smpte170m: colormatrix = smpte170m"
— pcunite
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.