三张图看懂视频链路,像素格式、压缩编码与传输接口

视频系统的所有术语只回答三个问题:像素怎么表示、怎么压缩、怎么传输。不理解这个分层,概念永远搅在一起。

第一次接触视频系统的人,往往同时碰到 RGB、YUV、LVDS、MIPI、H264、JPG、PNG 这些术语。它们看起来像同一类东西,但把"颜色格式""压缩编码""传输接口"混在一起,是新手最常见的翻车点。

视频系统本质上只做一件事:把像素从源头搬到屏幕上。你遇到的所有概念,都只是这条链路中某一层的解决方案。

像素格式:数据长什么样

一张图片的本质是大量小格子,每个格子是一个像素(Pixel)。1920×1080 表示横向 1920 个点、纵向 1080 个点,每个点都有颜色。

RGB 是最直觉的颜色表示方式。人眼通过红绿蓝三种感光细胞感知颜色,三个分量就能拼出几乎所有色彩。RGB888 是最常见的格式:R、G、B 各 8 bit,一个像素占 24 bit。(255, 0, 0) 是纯红,(255, 255, 255) 是白色,(255, 128, 0) 是橙色。

YUV 是另一种颜色表示方式,思路完全不同。Y 是亮度(黑白信息),U/V 是色度(颜色信息)。人眼对亮度敏感、对颜色不敏感,所以 YUV 可以在亮度上保持高精度、在色度上降低精度来节省带宽。YUV420 是最常见的变体:色度分辨率在水平和垂直方向都减半,平均每像素 12 bit,相比 RGB 的 24 bit 节省一半。

RAW 是摄像头传感器的原始数据。CMOS 传感器的每个像素只能感知一种颜色,按 Bayer 模式排列(R-G / G-B),所以 RAW 不是 RGB,是还没经过插值处理的感光数据。

RGB、YUV、RAW 都回答同一个问题:一个像素的颜色怎么表示

压缩编码:数据怎么存

1080P RGB 视频每秒数据量约 3 Gbps,不压缩根本无法存储和传输。

JPG 是有损图片压缩格式,针对单张图片。压缩过程通常是 RGB → YUV → DCT 变换 → 量化编码,用丢失细节换取小文件。PNG 是无损图片格式,不失真且支持透明通道,但文件体积比 JPG 大得多。

H264 是视频压缩编码。它不保存每一帧的完整画面,只保存帧与帧之间的变化量——背景没变、只有人脸动了,就只编码人脸的变化。一段 3 Gbps 的原始视频经 H264 压缩后可以降到几十 Mbps,压缩比通常在 50:1 到 100:1。H265 是更先进的版本,压缩率更高,但编码复杂度也更大。

JPG、PNG、H264 都回答同一个问题:怎么把像素数据压缩到可用体积

传输接口:数据怎么搬

像素数据压缩完(或不压缩),需要在芯片之间搬运。这一层回答的问题是:电信号怎么从一颗芯片跑到另一颗

MIPI 是手机领域最常见的高速传输接口,分两个子协议:CSI(Camera Serial Interface)用于摄像头到 SoC 的数据传输,DSI(Display Serial Interface)用于 SoC 到屏幕的数据传输。MIPI 不限制像素格式,RGB、YUV、RAW 甚至压缩视频都可以在里面跑。

LVDS(Low Voltage Differential Signaling)是一种电气传输方式。高速信号用普通 GPIO 会有 EMI、噪声和串扰问题,LVDS 用两根信号线传输差分信号,接收端取正端与负端的差值,抗干扰能力极强。它常用于老式 LCD、工业屏和 FPGA 视频输出。注意,LVDS 不是视频格式,只是"电线上的传输方式"。

RGB Parallel Interface 是 MCU 屏幕常用的并行接口,直接用 24 根数据线同时传输一个像素的 RGB 值,配合 HSYNC(行同步)、VSYNC(帧同步)和 PCLK(像素时钟)三个控制信号。每个时钟周期传输一个像素,简单直接,但速率受限,只适合低分辨率场景。

MIPI、LVDS、RGB Parallel、HDMI、eDP 都回答同一个问题:像素数据怎么从一颗芯片搬到另一颗

完整链路:从摄像头到屏幕

video-system-three-layers.png650

理解分层模型之后,看真实系统的数据链路就清晰了。

手机播放视频:MP4 文件 → H264 解码 → YUV 视频帧 → GPU 转换 → RGB → MIPI DSI → OLED 屏幕。手机拍摄视频:CMOS 传感器 → RAW10 原始数据 → MIPI CSI → ISP 处理 → YUV/RGB → H264 编码 → 保存为 MP4。

两条链路中,H264 负责压缩和解压,RGB/YUV 负责颜色表示,MIPI 负责传输,各司其职。一旦把概念放回正确的层级,视频系统就不再是一团乱麻。

下次看到一组视频术语,先问自己:它回答的是"像素怎么表示"、"怎么压缩"还是"怎么传输"?归到正确的层,理解就不会跑偏。