如何使用FFMPEG从iPhone13拍摄的BT.2020 MOV中提取色彩准确的图像序列
解决方案
问题根源
你所处理的是iPhone 13 Pro拍摄的HLG格式HDR视频,元数据中的arib-std-b67即为HLG电光转换函数标识。直接提取帧时FFmpeg不会自动完成HDR到SDR的色彩映射与伽马转换,而普通图像查看器默认将PNG/JPG按BT.709 SDR的伽马规则解析,因此必然出现亮度偏高、饱和度偏低的偏色问题,并非HDR视频无法提取准确色彩。
可行方案
方案1:输出兼容普通查看器的SDR图片(推荐绝大多数场景使用)
使用zscale滤镜完成HLG到BT.709 SDR的全链路色彩转换,命令如下:
输出最高质量JPG:
ffmpeg -i img_2106.mov -vsync 0 \ -vf "zscale=transfer=bt709:matrix=bt709:primaries=bt709,format=yuv420p" \ -q:v 1 test.%04d.jpg
输出PNG:
ffmpeg -i img_2106.mov -vsync 0 \ -vf "zscale=transfer=bt709:matrix=bt709:primaries=bt709,format=rgb24" \ test.%04d.png
如果需要保留更高色彩精度,可将format=rgb24替换为format=rgb48输出16bit深度PNG。
如果你的FFmpeg版本提示找不到zscale滤镜,可使用原生scale+colormatrix组合替代:
ffmpeg -i img_2106.mov -vsync 0 \ -vf "colormatrix=bt2020:bt709,scale=in_color_matrix=bt2020:in_range=tv:out_color_matrix=bt709:out_range=tv,format=yuv420p" \ -q:v 1 test.%04d.jpg
方案2:保留HDR信息输出HDR图片
若后续需要在支持HLG HDR的编辑/查看软件中使用图片,可输出携带完整HDR元数据的PNG:
ffmpeg -i img_2106.mov -vsync 0 \ -vf "zscale=transfer=arib-std-b67:matrix=bt2020nc:primaries=bt2020,format=rgb48" \ -color_primaries bt2020 -color_trc arib-std-b67 -colorspace bt2020nc \ test.%04d.png
注意:该方案输出的图片仅可在支持HLG HDR的设备/软件中显示正常色彩,普通查看器打开仍会偏色。
内容的提问来源于stack exchange,提问作者aescript
相关产品推荐
相关产品推荐

