像素格式是图像或视频原始画面数据中每个像素的排布方式。它告诉程序画面包含哪些颜色分量,以及每个分量使用多少位。
视频报告中,这个字段通常显示为 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 配置文件。