如何使用 FFmpeg 色彩空间选项

问题描述 投票:0回答:1

我试图理解 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

video encoding ffmpeg video-encoding
1个回答
16
投票

这可能无法完全回答您的问题,但我发现 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
    选项)
  • YUV <-> RGB 颜色矩阵是
    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)

,翻译为:

现在,这就是有趣的地方:根据 FFmpeg 对流的了解,自动应用一些过滤器,通常使用 libswscale 组件 (

-vf scale

)。如果您要在像素格式之间进行转换,这显然是需要的,但您也可以使用该过滤器手动进行某些转换或更改图像大小,例如。

最大的问题是

libswscale

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

如果需要,上面的每个选项也可以在输入之后指定以覆盖输出配置(例如

-i <video> -color_primaries bt2020),但显式使用过滤器通常可以避免相信会发生正确的转换。

	

© www.soinside.com 2019 - 2024. All rights reserved.