Quero marcar o vídeo como explicitamente bt.601, em vez de "não especificado". Sei que os players geralmente escolhem o bt.601 como o padrão para vídeos com menos de 1280 pixels de largura, mas quero deixar explícito que o bt.601 é a matriz de cores correta para um vídeo.
O ponto de discórdia é que não há bt601
opção para ffmpeg ou libx264, apenas bt709 e algumas outras.
Tenho alguns vídeos que foram reduzidos em HD e ainda estão no bt.709, mas não estão marcados corretamente. Então, quando assisto a um vídeo, às vezes tenho que alternar manualmente meu player para bt.709 . Etiquetar explicitamente como bt.601 comunicará aos futuros espectadores (por exemplo, a mim mesmo) que é definitivamente o bt.601, e não um vídeo bt.709 com etiqueta incorreta, quando olhar para ele mediainfo
.
Outro caso de uso para isso seria se você escalasse um vídeo bt.601 para 1280 ou superior sem fazer uma conversão de -vf colormatrix
matriz de cores (usando ), os jogadores assumiriam incorretamente o bt.709 se você deixasse as informações de cores não especificadas.
O colormatrix
filtro de vídeo do FFMpeg é compatível bt601
com uma matriz de cores de entrada ou saída, mas também não define tags. (Como não tem o efeito colateral de definir as opções de cores do ffmpeg, ele se recusa a operar com src e a destar o mesmo, por exemplo -vf colormatrix=bt601:bt601
).
ffmpg in -color_primaries bt709 -color_trc bt709 -colorspace bt709 out
marcará o vídeo de saída como usando bt.709 para yuv <-> rgb. As tags acabam dentro do próprio fluxo de bits de vídeo, não apenas no contêiner (já que isso parece ser algo específico de codec, e não contêiner, para contêineres mp4 e mkv).
por exemplo, mediainfo
saída:
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
Portanto, o bt.709 é fácil de etiquetar. O problema é que não vejo o bt.601 em lugar nenhum. Um dos outros nomes é um alias para ele ou não há realmente nenhuma maneira de especificá-lo explicitamente?
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 o mesmo conjunto de opções para suas opções de cores, que o -c:v libx264
codec de vídeo do ffmpeg passa para x264. Algum desses nomes é alternativo para bt.601 ou possui uma matriz de cores numericamente equivalente?
fonte
-color_primaries smpte170m -color_trc smpte170m -colorspace smpte170m
).Respostas:
PAL e NTSC têm cores primárias diferentes, então
NTSC = SMPTE 170M = BT 601 525
PAL = BT 470 BG = BT 601 625
Veja as linhas dos valores 5 e 6 na tabela na página 387 do padrão H.264 ativo .
Portanto, os argumentos certos para o ffmpeg são:
NTSC:
AMIGO:
-color_trc
não aceitabt470bg
, masffmpeg -h full
mostra quegamma28
significa "BT.470 BG" para essa opção.-colorspace
é a opção mais importante; os outros não fazem uma diferença visível para jogadores de software comompv
no Linux.fonte