如何使用FFmpeg颜色空间选项

13

我在努力理解色彩空间FFmpeg参数之间的区别:

  • 普通选项,-colorspace bt709
  • 数字,-colorspace 1
  • 编解码器参数 -x264-params "colorspace=bt709"
  • 过滤器 -vf "colorspace=bt709"

颜色空间类别有:

  • all
  • iall
  • colorspace
  • transfer
  • primaries
  • color range
  • color matrix

问题

从原始格式编码或转码/转换到另一种格式时,应该何时使用每个选项?例如从mpg转换到mp4

我需要指定输入颜色空间吗?还是FFmpeg会自动检测?


问题

没有-vp8-params,只有-x264-params。对于vp8和其他编解码器,我应该使用普通选项还是-vf


错误

  • 没有普通-all-colormatrix选项,但有all=colormatrix=用于-x264-params-vf

  • 使用编解码参数 -x264-params "colorspace=bt709" 会得到 Error parsing option 'colorspace = bt709'. 的错误提示。
    然而,colorprim=bt709transfer=bt709colormatrix=bt709 都可以正常工作。


参考资料

https://ffmpeg.org/ffmpeg-filters.html#colormatrix
https://ffmpeg.org/ffmpeg-filters.html#colorspace
https://trac.ffmpeg.org/wiki/colorspace

1个回答

14
这可能不能完全回答你的问题,但我发现FFmpeg、libswscale和各种滤镜的细节并没有很好地记录,所以我会在这里分享我的理解。
- -pix_fmt、-colorspace、-color_primaries、-color_trc和-color_range用于设置AVFrame结构中描述的值here。它们本身不进行任何转换,只是标记输入或输出流(取决于它们是否放置在-i之前或之后)。据我所知,这不会修改像素值本身。 - 一些编解码器或格式还需要知道它们正在操作的颜色空间,因为它们需要将其插入到编码流中,有时FFmpeg不会传递它所知道的信息。-x264-params和-x265-params可以手动执行此操作。据我所知,仅凭这一点也不会修改像素值。 - 各种-vf选项用于在颜色空间之间进行转换。它们积极地改变像素值和内存布局。 - FFmpeg的输出报告了它对每个流的了解。例如,当您看到类似于gbrp10le(tv,bt2020nc / bt2020 / arib-std-b67)的内容时,这意味着:
- 像素格式为gbrp10le(-pix_fmt) - 范围为tv / limited(-color_range) - YUV <-> RGB颜色矩阵为bt2020nc(-colorspace) - 原色为bt2020(-color_primaries) - EOTF /色调曲线是arib-std-b67(HLg)(-color_trc)
现在,这就变得有趣了:某些滤镜根据FFmpeg对流的了解自动应用,通常使用libswscale组件(-vf scale)。如果您正在转换像素格式,则显然需要这样做,但您还可以使用该过滤器手动执行一些转换或更改图像大小,例如。
大问题在于libswscale无法很好地处理所有情况,特别是在命令行中无法设置所有参数,尤其是对于像BT2020这样的广色域/ HDR空间。有其他滤镜(colorspacecolormatrixzscale),它们不会引起太多麻烦,并且替换了libswscale的部分功能。据我所知,它们似乎设置了正确的AVFrame像素格式,因此libswscale不会尝试进行两次转换,但我对哪个是自动的、哪个不是有点模糊。

编辑:如需详细了解完整命令行的具体示例,请参见如何在ffmpeg命令行中将RGB图像编码为HDR10视频?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接