Estou testando em uma entrada que não possui nenhum conjunto de metadados de cores:
ffprobe -v error -show_streams "input.mp4" | grep color
color_range=unknown
color_space=unknown
color_transfer=unknown
color_primaries=unknown
Isso resulta em uma mudança de cor, que acredito ser devido à conversão automática do espaço de cores que o scale
filtro faz. No entanto, quando adiciono out_color_matrix=bt601
ao scale
filtro para preservar o espaço de cores, a opção parece ser totalmente ignorada e o espaço de cores ainda é convertido para BT.709 (os metadados são gravados porque eu tenho -color_range 1 -color_trc 1 -color_primaries 1
):
ffprobe -v error -show_streams "out_color_matrix=bt601.mp4" | grep color
color_range=tv
color_space=bt709
color_transfer=bt709
color_primaries=bt709
Por que é isso?
Então, duas coisas:
Se a entrada for realmente 601, você não precisará adicionar nada em escala.
A sinalização correta de 601 nos metadados de saída dependerá da fonte analógica.
PAL e NTSC têm cores primárias diferentes, então
NTSC = SMPTE 170M = BT 601 525
PAL = BT 470 BG = BT 601 625
Portanto, os argumentos corretos 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 diferença visível para players de software comompv
no Linux.