如何使用 FFmpeg 色彩空间选项

Mat*_*nis 5 video encoding ffmpeg video-encoding

我试图了解 Colorspace FFmpeg参数之间的区别:

  • 正常选项, -colorspace bt709
  • 数字, -colorspace 1
  • 编解码器参数 -x264-params "colorspace=bt709"
  • 筛选 -vf "colorspace=bt709"

色彩空间类别是:

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

当从原始编码或从一种格式转码/转换为另一种格式时,应该何时使用它们?比如mpgmp4

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


问题

没有-vp8-params,只有-x264-params。我应该使用normal options-vf代替vp8其他编解码器吗?


错误

  • 没有Normal -all-colormatrixoptions,但有all=and colormatrix=for-x264-params-vf

  • 随着编解码器PARAMS -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

F.X*_*.X. 14

这可能无法完全回答您的问题,但我发现 FFmpeg 和 libswscale 以及各种过滤器的复杂性并没有很好的记录,所以这里是我对此事的理解。

  • -pix_fmt-colorspace-color_primaries和用于设置此处描述的结构-color_trc内的值。它们本身不进行任何转换,它们只是标记输入或输出流(取决于它们是放置在之前还是之后)。据我所知,这不会修改像素值本身。-color_rangeAVFrame-i

  • 某些编解码器或格式还需要知道它们正在运行的色彩空间,因为它们需要将其插入编码流中,有时 FFmpeg 不会传递它所知道的内容。-x264-params-x265-params手动执行此操作。据我所知,这本身也不会修改像素值。

  • 有多种-vf选项可以在色彩空间之间进行转换。他们主动改变内存中的像素值和布局。

FFmpeg 的输出报告它所知道的每个流的内容。例如,当您看到类似gbrp10le(tv, bt2020nc/bt2020/arib-std-b67)输入或输出流的内容时,这意味着:

  • 像素格式为 gbrp10le ( -pix_fmt)
  • 范围为电视/有限 ( -color_range)
  • YUV <-> RGB 颜色矩阵为 bt2020nc ( -colorspace)
  • 初选是 bt2020 ( -color_primaries)
  • EOTF/色调曲线为 arib-std-b67 (HLg) ( -color_trc)

现在,这就是有趣的地方:根据 FFmpeg 对流的了解,通常使用 libswscale 组件 ( -vf scale) 自动应用一些过滤器。如果您要在像素格式之间进行转换,这显然是必需的,但您也可以使用该过滤器手动进行某些转换或更改图像大小等。

最大的问题是它libswscale不能很好地处理所有情况,特别是在无法设置所有参数的命令行中,尤其是对于 BT2020 等宽色域/HDR 空间。还有其他过滤器(colorspacecolormatrixzscale),它们不会造成太多麻烦,并且可以替换 的部分内容libswscaleAVFrame据我所知,它们似乎确实设置了正确的像素格式,因此libswscale不会尝试两次应用转换,但我对哪些是自动的、哪些不是自动的有点模糊。


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