🎬 第七章 音视频编解码原理与标准
📄 一句话概括

采集是整条链路的源头,它吐出来的是没有压缩的数据——4K60 的原始带宽有好几个 Gbps,接口撑不住就只能在源头让步。

📝 本节和前面几节的关系

7.1 讲了编码要做什么,这一节往回退一步——数据是怎么从传感器进到内存的。

一、采集链路的四段

从光到内存,中间要过四道手: 传感器——把光变成电信号,输出的是 Bayer 原始数据; ISP(图像信号处理器)——去马赛克、白平衡、降噪、色调曲线; 采集接口——USB、HDMI、SDI、PCIe,把数据搬出去; 内存——到达应用程序,这才轮到编码器接手。 每一段都在改数据的形态,也都在改带宽。

二、传感器出来的是 Bayer

常见传感器每个像素只测一种颜色:一行隔一个红、一行隔一个绿,四个像素拼成一个颜色组。 所以 Bayer 原始格式平均每像素 1 字节——这是整条链路上最省的一种格式。 要还原成彩色,必须做 去马赛克(demosaic),而这一步是猜出来的:靠周围像素插值。所以采集质量的源头在 ISP,不在编码器。

三、格式选择就是带宽选择

同样是 4K60,换一种像素格式,带宽可以差三倍: Bayer 原始——每像素 1 字节,3981 Mbps; YUV 4:2:0——每像素 1.5 字节,5972 Mbps; YUV 4:2:2——每像素 2 字节,7963 Mbps; RGB24——每像素 3 字节,11944 Mbps。 调采集参数时,第一件事就是确认用哪种格式——它直接决定后面接口扛不扛得住。

四、接口是硬门槛

选采集卡,本质上是在选接口: USB 2.0 理论 480 Mbps、实际可用约 300 Mbps——720p30 的 YUV 4:2:0 要 332 Mbps,已经很勉强,所以老摄像头一律先压成 MJPEG 再传; USB 3.0 标称 5 Gbps、可用约 3.2 Gbps——单路 4K60 必然要压缩或降格式; HDMI 2.0 约 14.4 Gbps、HDMI 2.1 约 42.6 Gbps——足够跑未压缩; SDI(3G/6G/12G)——广电用的同轴接口,长距离、稳定,是专业采集的首选。 带宽不够时,只能三选一:降分辨率、降帧率、降格式。

五、采集参数会一路影响到编码

采集端做错了,后面怎么调都补不回来: 拍糊了——编码器只能忠实地记录模糊,压缩算法不会凭空造细节; 噪点太多——噪声是高频信息,既费码率又不讨好,编码器要花大量位数去描述它; 曝光和白平衡跑偏——后期调色是在已经量化过的数据上做的,越调越花。 所以工程上有句话:七分靠拍,三分靠压。

六、动手 Demo:采集端一上来就是几个 Gbps

采集拿到的第一份数据是没有压缩的,带宽由三个数决定。

rows = [("1280×720", 30), ("1920×1080", 30), ("1920×1080", 60),
        ("3840×2160", 30), ("3840×2160", 60)]
for res, fps in rows:
    w, h = res.split("×")
    bps = int(w) * int(h) * 3 * fps
    print("%-11s %2d fps  %8.1f MB/s  %6.0f Mbps"
          % (res, fps, bps / 1e6, bps * 8 / 1e6))

实跑输出:

--------------------------------------------------------------------
采集端一上来就是几个 Gbps
--------------------------------------------------------------------

采集拿到的第一份数据是【没有压缩】的,带宽由三个数决定:
  **采集带宽 = 宽 × 高 × 每像素字节 × 帧率**。

  按 RGB24(每像素 3 字节)算:

  分辨率        帧率     每像素     原始带宽 MB/s     折合 Mbps
  --------------------------------------------------------------
  1280×720      30       3 字节     82.9              664
  1920×1080     30       3 字节     186.6             1493
  1920×1080     60       3 字节     373.2             2986
  3840×2160     30       3 字节     746.5             5972
  3840×2160     60       3 字节     1493.0            11944

  同一颗 4K60 摄像头,一路走下来其实是三种带宽:
    传感器 Bayer 原始  3840×2160×1×60  = **3981 Mbps**
    转成 RGB24        3840×2160×3×60  = **11944 Mbps**
    再转 YUV 4:2:0    3840×2160×1.5×60 = **5972 Mbps**
  **每一环的接口(USB、PCIe、内存带宽)都得扛得住这几个 Gbps。**
  USB 3.0 标称 5 Gbps、可用约 3.2 Gbps——**单路 4K60 走 USB 3.0 必然要压缩或者降格式。**

同一颗 4K60 摄像头,一路走下来是三种带宽: Bayer 原始 3981 Mbps、RGB24 11944 Mbps、YUV 4:2:0 5972 Mbps。 每一环的接口都得扛得住这几个 Gbps。

30 秒实验

  1. 打开电脑的【相机】应用或 OBS,找到采集格式那一栏,看它默认给的是 MJPEG 还是 YUY2。
  2. 把同一台摄像头切到两种格式,观察 CPU 占用与画面延迟的差别。

常见误区

  1. 以为【采集就是复制一份画面】。从 Bayer 到彩色中间有大量计算,ISP 的活儿一点不比编码轻。
  2. 只看分辨率不看格式。720p 的 RGB24 可能比 1080p 的 YUV 4:2:0 还费带宽。
  3. 把采集卡当成【带宽转换器】随便买。接口带宽是硬上限,超了就必然降格式或压缩。
自测三问(点开对答案) 1. 采集链路有哪四段? —— 传感器、ISP、采集接口、内存(应用程序)。 2. 4K60 用 YUV 4:2:0 采集,原始带宽大约多少? —— 3840×2160×1.5×60 ≈ 5972 Mbps。 3. 为什么说【七分靠拍,三分靠压】? —— 噪声与模糊会大幅抬高码率而且无法在编码端补救。

相关笔记