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.