词典

什么是像素格式?

像素格式是视频或图像中每个像素的颜色数据排布方式。了解 yuv420p 等数值对你的文件意味着什么。

pixel-format

像素格式是图像或视频原始画面数据中每个像素的排布方式。它告诉程序画面包含哪些颜色分量,以及每个分量使用多少位。

视频报告中,这个字段通常显示为 pix_fmt,值类似 yuv420p。这样的值表示颜色模型、色度抽样 和 比特深度。色彩空间 是单独的字段。

哪些文件携带它

FFmpeg 的 ffprobe 程序会为每个视频流列出 pix_fmt。这适用于 MP4、MOV、MKV 和 WebM 文件。

图像也会报告一个数值。FFmpeg 会把 4:2:0 抽样的 JPEG 标为 yuvj420p,把 8 位 RGB PNG 标为 rgb24。

带有封面图片的音频文件也可能报告像素格式。FFmpeg 会把这张图片当作视频流处理。

ExifTool 会从 Windows HD Photo 文件(HDP 和 WDP)中读取名为 PixelFormat 的标签。它会显示如 24-bit RGB 和 8-bit Gray 这样的值。

数值的呈现方式

FFmpeg 用多个短片段来组合名称。值 yuv420p10le 包含 5 个部分:

  • yuv:颜色模型。Y 表示亮度,U 和 V 承载颜色信息。U 和 V 也叫 Cb 和 Cr,如同 YCbCr。
  • 420:抽样方式。颜色在水平方向和垂直方向的分辨率都是亮度数据的一半。
  • p:平面格式。每个分量都有独立的平面。打包格式会把各分量放在同一个数组中。
  • 10:每个分量的比特数。值 yuv420p 这里没有数字,使用 8 位。
  • le:字节序,小端序。结尾的 be 表示大端序。

典型值

下面每个数字表示原始画面数据中每像素的平均比特数:

  • yuv420p:12 位,颜色在水平方向和垂直方向都是一半分辨率
  • yuv422p:16 位,颜色在水平方向是一半分辨率
  • yuv444p:24 位,每个像素都有完整颜色信息
  • yuvj420p:12 位,采用 yuv420p 的布局,但使用 JPEG 的全范围
  • rgb24:24 位,打包的红、绿和蓝
  • rgba:32 位,额外包含用于透明度的 alpha 值
  • gray:8 位,只有亮度
  • pal8:8 位,每个数值指向调色板中的一种颜色

在全范围中,8 位亮度从 0 到 255。在限幅范围中,它从 16 到 235。FFmpeg 建议使用单独的范围字段,而不是使用 yuvj 这样的名称。

数值的来源

决定像素格式的是对该流进行编码的程序。在 FFmpeg 中,你可以用 -pix_fmt 选项来选择。

这个名称本身通常不会存到文件中。读取程序会根据存储的细节来组合出名称。

对 H.264,FFmpeg 使用流头中的比特深度和色度格式。对 PNG,FFmpeg 使用图像头中的比特深度和颜色类型。

这对你的文件有何影响

像素格式决定原始画面数据的大小。一个 rgb24 帧每像素有 24 位,一个 yuv420p 帧有 12 位。编码器随后会压缩这些数据,所以这些数字并不等于最终文件大小。

像素格式也决定文件保留多少颜色细节。人眼对亮度细节的感知远高于颜色,所以 4:2:0 带来的可见损失很小。

如果你把 4:2:0 转换成 4:4:4,程序会从附近的数据计算缺失的样本。4:2:0 去掉的颜色细节不会恢复。

H.264 配置文件也是你需要检查这个值的原因之一。Main 和 High 配置文件支持 8 位颜色和 4:2:0 抽样。

使用 yuv444p 或 yuv420p10le 的 H.264 流需要更高的配置文件。Apple 的 HLS 规范要求 H.264 配置文件不高于 High。YouTube 建议上传时使用带 4:2:0 的 High 配置文件。