我试图理解 Colorspace 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
。我应该使用 normal options
或 -vf
代替 vp8
和其他编解码器吗?
没有 Normal
-all
或 -colormatrix
选项,但对于 all=
和 colormatrix=
有 -x264-params
和 -vf
。
使用编解码器参数
-x264-params "colorspace=bt709"
,我得到Error parsing option 'colorspace = bt709'.
colorprim=bt709
、transfer=bt709
、colormatrix=bt709
都可以。
https://ffmpeg.org/ffmpeg-filters.html#colormatrix
https://ffmpeg.org/ffmpeg-filters.html#colorspace
https://trac.ffmpeg.org/wiki/colorspace
这可能无法完全回答您的问题,但我发现 FFmpeg 和 libswscale 的复杂性以及各种过滤器没有很好的记录,所以这里是我对此事的理解。
-pix_fmt
、-colorspace
、-color_primaries
、-color_trc
和-color_range
用于设置此处描述的
AVFrame
结构内的值。它们本身不进行任何转换,只是标记输入或输出流(取决于它们是放置在-i
之前还是之后)。据我所知,这不会修改像素值本身。
某些编解码器或格式还需要知道它们正在运行的色彩空间,因为它们需要将其插入编码流中,有时 FFmpeg 不会传递它所知道的信息。
-x264-params
和 -x265-params
手动执行此操作。据我所知,仅此一项也不会修改像素值。
各种
-vf
选项可用于在色彩空间之间进行转换。他们主动改变内存中的像素值和布局。
运行
ffprobe <video file>
或 ffmpeg -i <video file>
时,控制台标准错误包含有关每个流的详细信息,例如:
...
Stream #0:0: Video: hevc (High 10), yuv420p10le(tv, bt2020nc/bt2020/arib-std-b67), 1920x1080, SAR 1:1 DAR 16:9, 23.98 fps, 23.98 tbr, 1k tbn (default)
...
上面示例输出中的
yuv420p10le(tv, bt2020nc/bt2020/arib-std-b67)
包含有关像素如何存储在内存中以及如何将它们解释为颜色的以下信息:
yuv420p10le
,即内存布局由 Y'CbCr 信号组成,存储为 Y' 的一个完整平面,然后是 Cb,然后是分辨率降低的 Cr,其中每个像素值是 16 位宽的小端字节序,但仅包含0-1023 之间的 10 位值(-pix_fmt
选项)tv
,即视频信号使用有限范围(-color_range
选项)bt2020nc
即 ITU-R BT.2020 非恒定亮度矩阵(-colorspace
选项)bt2020
即 ITU-R BT.2020 原色和白点(-color_primaries
选项)arib-std-b67
即 HLG(-color_trc
选项)上面列表中的每个选项都可以在输入之前提供(例如-color_primaries bt2020 -i <video file>
)以覆盖默认值,但这通常仅在输入不正确或缺少标签时才需要。另一个例子是
yuv420p(tv, bt709)
,翻译为:
-vf scale
)。如果您要在像素格式之间进行转换,这显然是需要的,但您也可以使用该过滤器手动进行某些转换或更改图像大小,例如。最大的问题是
libswscale
不能很好地处理所有情况,特别是在无法设置所有参数的命令行中,尤其是对于像BT2020这样的宽色域/HDR空间。还有其他过滤器(
colorspace
、
colormatrix
和
zscale
)不会造成太多麻烦,并且可以替换
libswscale
的部分内容。据我所知,它们似乎确实设置了正确的
AVFrame
像素格式,因此
libswscale
不会尝试两次应用转换,但我有点不清楚哪些是自动的,哪些不是。如果需要,上面的每个选项也可以在输入之后指定以覆盖输出配置(例如
-i <video> -color_primaries bt2020
),但显式使用过滤器通常可以避免相信会发生正确的转换。