我正在测试没有设置任何颜色元数据集的输入:
ffprobe -v error -show_streams "input.mp4" | grep color
color_range=unknown
color_space=unknown
color_transfer=unknown
color_primaries=unknown
这会导致颜色偏移,我认为这是因为scale
过滤器会自动进行颜色空间转换。但是,当我添加out_color_matrix=bt601
到scale
过滤器以保留颜色空间时,该选项似乎被完全忽略,颜色空间仍然转换为 BT.709(因为我有元数据,所以写入了元数据-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
为什么是这样?
答案1
因此,有两件事:
- 比例过滤器默认为 601,因此在没有颜色元数据的情况下,假定为 601。
- 这些颜色选项的值为 1 表示 709,这就是 ffprobe 返回该读数的原因。
如果输入确实是 601,则不需要在比例中添加任何内容。
在输出元数据中正确发出信号 601 将取决于模拟源。
PAL 和 NTSC 的基色不同,因此
NTSC = SMPTE 170M = BT 601 525
PAL = BT 470 BG = BT 601 625
因此 ffmpeg 的正确参数是:
国家电视系统委员会:
-colorspace smpte170m -color_primaries smpte170m -color_trc smpte170m
mediainfo:
Color primaries : BT.601 NTSC
Transfer characteristics : BT.601
Matrix coefficients : BT.601
朋友:
-color_trc
不接受bt470bg
,但ffmpeg -h full
显示gamma28
该选项意味着“BT.470 BG”。
-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
mpv
是最重要的选项;其他选项对于Linux等软件播放器来说没有明显的区别。