4、显示输出技术:HDMI、VGA、SDI接口对比,多屏拼接显示方案

好,咱们今天聊显示输出。这部分其实挺有意思的,你想想看,前端摄像头采集再好的画面,后端解码再流畅,最后要是输出到屏幕上糊成一团,那前面全白干了。

我个人习惯把显示输出分成两件事来看:接口选型拼接方案。接口决定了信号怎么传,拼接决定了画面怎么摆。咱们一个一个说。

4.1 三大主流接口:HDMI、VGA、SDI

先看一张对比表,心里有个底:

特性HDMIVGASDI
信号类型数字模拟数字
最大分辨率4K@60Hz (HDMI 2.0)1920x1080@60Hz4K@60Hz (12G-SDI)
传输距离5-15米(无中继)15-30米100米(同轴电缆)
抗干扰能力中等
音频传输支持不支持支持(嵌入)
成本极低
典型场景民用、商用显示老旧设备、投影广电、安防监控中心

4.1.1 HDMI:最通用的选择

HDMI 现在基本是标配了。DVR/NVR 主板上只要不是太老的方案,都会带至少一个 HDMI 输出口。

我在项目中遇到过一个问题:客户用了一根 10 米的 HDMI 线,画面时不时闪一下。排查了半天,发现是线材质量不行。HDMI 对线材要求其实挺高的,尤其是 4K 信号。我建议,超过 5 米的 HDMI 线,尽量选带信号放大功能的,或者直接用光纤 HDMI 线。

小技巧: 如果板子上 HDMI 输出分辨率不对,检查一下 EDID。很多显示器或者拼接处理器会通过 EDID 告诉主板「我能支持什么分辨率」。如果主板读到的 EDID 有问题,输出就会乱。我习惯在驱动里强制指定一个分辨率,比如 1920x1080@60,这样最稳。

4.1.2 VGA:老当益壮,但该退了

VGA 是模拟信号,说白了就是电压高低来表示颜色。它最大的问题是容易受干扰。你想想看,一根 VGA 线旁边走一根强电线,屏幕上立马出现水波纹。

不过 VGA 也有它的好处:传输距离比 HDMI 远,而且兼容性极好。有些老旧的投影仪、监视器,只有 VGA 口。我建议,如果项目里还有 VGA 设备,最好用一根质量好的 VGA 线,并且远离强电走线。

注意: VGA 不支持音频。如果你需要同时传声音,得单独拉一根音频线。另外,VGA 最高只能到 1080p,4K 就别想了。

4.1.3 SDI:安防监控的硬核选择

SDI 在广电领域用得最多,但在安防监控中心也越来越常见。为什么?因为它传输距离远,抗干扰能力强。100 米以内用同轴电缆,信号基本不衰减。

我记得有一次做平安城市项目,监控中心离机房有 80 米远。如果用 HDMI,中间得加好几个中继器,麻烦不说,还容易出问题。最后我们选了 SDI 方案,一根同轴线拉过去,画面稳得很。

SDI 的缺点也很明显:贵。接口、线缆、采集卡都比 HDMI 贵不少。而且 SDI 的接口比较大,板子上占地方。我建议,只有在对传输距离和稳定性要求极高的场景下,才考虑 SDI。

4.2 多屏拼接显示方案

好,接口聊完了,咱们说说怎么把多个屏幕拼起来。说白了,就是让多个显示器显示一个完整的大画面,或者显示不同的画面。

4.2.1 硬件拼接 vs 软件拼接

先分清楚两种方式:

  • 硬件拼接: 用专门的拼接处理器或者拼接屏。信号进去,处理器自动把画面切成几块,分别送到不同的屏幕上。这种方式延迟低,效果好,但成本高。
  • 软件拼接: 在 DVR/NVR 的主控芯片里,通过软件把画面分割好,然后通过多个 HDMI 口输出。这种方式成本低,但占用 CPU 资源,而且同步性不如硬件。

我个人习惯,如果屏幕数量超过 4 块,或者对画面同步要求高(比如看高速运动的物体),我会选硬件拼接。如果只是 2x2 或者 1x3 的简单拼接,软件拼接完全够用。

4.2.2 常见的拼接布局

实际项目中,最常见的拼接布局就这几种:

  1. 2x2 拼接: 4 块屏幕,组成一个大画面。分辨率是单屏的 2 倍宽、2 倍高。
  2. 1x3 拼接: 3 块屏幕横着排,适合看超宽的画面,比如全景监控。
  3. 3x3 拼接: 9 块屏幕,适合监控中心的大屏墙。

这里有个坑:拼接的时候,每块屏幕的边框会吃掉一部分画面。你想想看,如果画面正好有一条线在边框位置,那这条线就看不到了。我建议,在软件里做拼接时,要预留「拼缝补偿」,也就是把画面稍微放大一点,让拼缝处的画面重叠一部分。

4.2.3 多路视频解码与拼接的配合

咱们这个课程的核心是多路视频解码。拼接显示的时候,解码的压力会成倍增加。举个例子:

一个 2x2 的拼接墙,每块屏幕显示 4 路 1080p 画面。那总共需要解码 16 路 1080p。如果主控芯片的解码能力只有 8 路 1080p,那就得降分辨率,或者减少每屏的路数。

核心原则: 拼接显示的解码路数 = 单屏解码路数 × 屏幕数量。选型的时候,一定要把解码能力算清楚,别到时候画面出不来。

4.2.4 一个简单的软件拼接示例

假设我们用 Linux 下的 GStreamer 来做软件拼接。下面是一个 2x2 拼接的 pipeline 示例:

# 假设有 4 路视频源,分别解码后拼成 2x2
gst-launch-1.0 \
  videomixer name=mix \
    sink_0::xpos=0   sink_0::ypos=0 \
    sink_1::xpos=1920 sink_1::ypos=0 \
    sink_2::xpos=0   sink_2::ypos=1080 \
    sink_3::xpos=1920 sink_3::ypos=1080 \
  ! videoconvert ! autovideosink \
  filesrc location=video1.h264 ! decodebin ! videoconvert ! mix.sink_0 \
  filesrc location=video2.h264 ! decodebin ! videoconvert ! mix.sink_1 \
  filesrc location=video3.h264 ! decodebin ! videoconvert ! mix.sink_2 \
  filesrc location=video4.h264 ! decodebin ! videoconvert ! mix.sink_3

这段代码的意思很简单:用 videomixer 把 4 路视频拼在一起,每路放在不同的位置。xpos 和 ypos 就是左上角的坐标。如果每路是 1920x1080,那 2x2 拼接后的总分辨率就是 3840x2160。

避坑指南: 我曾经在调试这个 pipeline 时,发现画面不同步。后来查出来,是因为 4 路视频的帧率不一样。有的 25fps,有的 30fps,拼在一起就乱了。解决办法是,在 decodebin 后面加一个 videorate 元素,强制统一帧率。

4.3 总结一下

显示输出这块,说白了就是三件事:选对接口、算好解码能力、定好拼接方案。HDMI 最通用,VGA 该淘汰了,SDI 适合远距离。拼接的话,硬件方案稳但贵,软件方案灵活但吃资源。

嗯,下一章咱们聊聊实际项目中的调试技巧,比如怎么用示波器看视频信号,怎么排查画面撕裂的问题。到时候见。