📺 B站博主个人介绍

📘 博主书籍-京东购买链接*:Yocto项目实战教程

📘 加博主微信,进技术交流群jerrydev



RK3588 视频 Pipeline 实战总结:从本地显示到网络推流,彻底讲清 GStreamer、RTP/UDP、显示链路与高质量视频核心

摘要

在 RK3588 等嵌入式视觉平台开发中,很多问题表面上看是“画面没出来”“YOLO 没显示”“网络推流不稳定”,但本质上往往不是单点故障,而是对整条视频 Pipeline 缺乏系统理解。
本文从工程实战角度出发,围绕“采集、处理、显示、编码、传输、推理”六大环节,系统梳理 GStreamer 在板端视觉系统中的作用,讲清本地显示与网络传输的区别,重点解释 RTP、UDP、Weston、OpenCV、KMS/DRM、YOLO/NPU 等概念在实际项目中的位置与关系。同时结合典型问题,分析高质量视频系统的关键要素,包括成像质量、色彩格式、分辨率、帧率、码率、网络抖动、端到端延迟与产品化部署思路。
这篇文章适合正在做 RK3588、Rockchip、嵌入式相机、GStreamer、网络视频传输、板端 AI 推理项目的开发者,用于系统复习和建立完整知识框架。

关键词

RK3588;GStreamer;Pipeline;RTP;UDP;Weston;OpenCV;YOLO;NPU;网络推流;高质量视频;嵌入式视觉


在这里插入图片描述

一、为什么很多视频问题越查越乱?

做板端视觉项目时,最常见的困惑不是不会写命令,而是把多个层面的问题混在一起看

比如下面这些现象:

  • 相机已经有数据,但你怀疑 Sensor 坏了
  • DP 屏亮了,但 cv2.imshow() 还是打不开
  • YOLO 已经打印出检测框了,却还以为模型没跑起来
  • GStreamer 本地预览正常,一上 Wi-Fi 推流就开始花屏、卡顿、延迟大
  • 屏幕偶尔黑掉,被误判成显示链路故障
  • 网络视频不流畅,却不知道该看码率、缓冲、Wi-Fi 还是解码能力

这些问题之所以容易绕,是因为视频系统本身不是一个点,而是一条完整链路。
如果缺乏Pipeline 思维,就会很容易把“采集”“显示”“编码”“网络”“推理”混成一个问题来排查。

所以本文先给出一个核心观点:

视频系统必须按 Pipeline 来理解。

只要你能把系统拆成一段一段,很多看似复杂的问题都会变得清晰。


二、什么是 Pipeline 思维?

Pipeline,中文一般可以理解为“流水线”。

它的核心思想很简单:

每一段只负责自己的输入、处理和输出。

在视频系统里,一条最基础的 Pipeline 可以写成:

Sensor/Camera
  -> ISP / 3A
  -> V4L2
  -> 预处理
  -> 编码 / 显示 / 推理
  -> 屏幕 / 网络 / 文件

如果再细化一点,可以写成:

镜头成像
  -> Sensor 输出 RAW
  -> ISP 处理
  -> 视频节点输出 NV12 / YUYV / RGB
  -> GStreamer / OpenCV / C++ 程序取流
  -> 编码 / 推理 / 叠框 / 显示
  -> 本地屏幕 / 网络远端 / 文件存储

这个思维方式最大的价值在于:

  • 你可以明确问题属于哪一段
  • 你不会因为“最终没画面”就怀疑整条链都坏了
  • 你可以快速切换到最小验证路径

举个最实际的例子:

  • 如果 frame 0: ... detections 已经打印出来,说明采集和推理至少是工作的
  • 如果 cv2.imshow()Can't initialize GTK backend,那问题就在 GUI 会话,不在模型本身
  • 如果 kmssink 本地能出图,但网络接收端没画面,那大概率是 RTP/UDP 链路问题,不是相机问题

这就是 Pipeline 思维的真正意义。


三、一个完整视频系统,到底包含哪些层?

做嵌入式视觉系统时,建议把整体分成下面几层来看。

1. 成像层

这一层包括:

  • 镜头
  • Sensor
  • 曝光
  • 白平衡
  • ISP
  • 对焦
  • 去噪
  • 锐化
  • 色彩处理

它决定的是“源头画质”。


2. 采集层

这一层包括:

  • V4L2
  • 视频节点
  • 图像格式
  • 分辨率
  • 帧率
  • Buffer 管理

它决定的是“程序能不能正确拿到帧”。


3. 处理层

这一层包括:

  • GStreamer
  • OpenCV
  • 自研 C++ 程序
  • resize
  • colorspace convert
  • overlay
  • preprocess/postprocess

它决定的是“帧在进入显示、编码、推理前被怎么处理”。


4. 显示层

这一层包括:

  • DRM/KMS
  • kmssink
  • Weston
  • Wayland
  • GTK
  • OpenCV imshow
  • GUI backend

它决定的是“图像怎么被显示到本地屏幕”。


5. 编码层

这一层包括:

  • H.264 / H.265
  • 硬件编码器
  • 码率控制
  • GOP/I/P 帧
  • 封装格式

它决定的是“视频如何被压缩,以及压缩后的观感和带宽占用”。


6. 网络层

这一层包括:

  • RTP
  • UDP
  • RTSP
  • jitter
  • queue
  • buffer
  • Wi-Fi / Ethernet

它决定的是“视频如何跨设备传输,以及延迟和稳定性如何”。


7. AI 推理层

这一层包括:

  • OpenCV DNN
  • ONNX Runtime
  • RKNN
  • NPU
  • CPU/GPU 推理
  • YOLO 前处理和后处理

它决定的是“系统如何做目标检测、分类、分割等 AI 功能”。


四、为什么说 GStreamer 是板端视频开发的核心工具?

很多人第一次接触 GStreamer,会把它当成一个命令行播放器。
但在嵌入式系统里,它真正重要的地方在于:

GStreamer 是一个多媒体 Pipeline 框架。

它能让你非常清楚地表达一条多媒体处理链路:

Source -> Filter -> Encode/Decode -> Sink

在相机场景下,它可以表示成:

v4l2src -> format/caps -> transform -> encoder -> payloader -> network sink

也可以是:

v4l2src -> format/caps -> kmssink

GStreamer 的核心价值有三点:

1. 快速验证链路

你不用先写完整 C++ 程序,就能验证:

  • 相机节点是否正常
  • 本地显示是否正常
  • 编码器是否可用
  • 网络推流是否可用

2. 结构清晰

你看到一条 pipeline 命令,就知道:

  • 数据源是什么
  • 中间经过了哪些变换
  • 最终输出到哪里

3. 便于定位问题

比如本地显示通但网络不通,你很容易定位到是 pay/depay/udpsink/udpsrc 这一段。


五、视频系统里最常见的三条主 Pipeline

在实际工程中,视频系统通常会拆成三条主路径。

1. 本地预览 Pipeline

作用是把相机画面直接显示到本地屏幕。

Camera -> ISP -> V4L2 -> Display Sink -> DP/HDMI

例如:

gst-launch-1.0 v4l2src device=/dev/video11 ! \
  video/x-raw,format=NV12,width=1920,height=1080,framerate=30/1 ! \
  kmssink

这条链路的意义是:

  • 验证采集是否正常
  • 验证本地显示链是否正常
  • 尽量少引入网络和 AI 变量

2. 录制/编码 Pipeline

作用是把视频压缩并写入文件。

Camera -> ISP -> V4L2 -> Encoder -> Mux -> File

例如:

gst-launch-1.0 -e \
  v4l2src device=/dev/video11 ! \
  video/x-raw,format=NV12,width=1920,height=1080,framerate=30/1 ! \
  mpph265enc ! h265parse ! mp4mux ! \
  filesink location=record.mp4

这条链主要验证:

  • 编码路径是否正常
  • 文件封装是否正确
  • 播放器是否能正常解析

3. 网络推流 Pipeline

作用是把视频通过网络发到另一台设备。

Camera -> ISP -> V4L2 -> Encoder -> RTP -> UDP -> Network

接收端则是:

Network -> UDP -> RTP depay -> Decode -> Display

典型例子就是:

发送端

gst-launch-1.0 -e \
  v4l2src device=/dev/video11 io-mode=dmabuf do-timestamp=true ! \
  video/x-raw,format=NV12,width=1920,height=1080,framerate=30/1 ! \
  mpph265enc bps=4000000 ! \
  h265parse config-interval=-1 ! \
  rtph265pay pt=96 config-interval=1 ! \
  udpsink host=<接收端IP> port=5000 sync=false async=false

接收端

gst-launch-1.0 -e \
  udpsrc port=5000 caps="application/x-rtp,media=video,encoding-name=H265,payload=96,clock-rate=90000" ! \
  rtph265depay ! h265parse ! avdec_h265 ! autovideosink sync=false

这条链路就是完整的 RTP over UDP 视频传输模型。


六、显示链路怎么理解:DP、KMS、Weston、GTK、OpenCV 之间是什么关系?

这是很多人最容易混淆的一块。

1. DP 屏亮了,说明什么?

说明的是:

  • 物理显示链路大概率正常
  • DRM/KMS 或 Weston 至少有一部分在工作
  • 屏幕和接口不是完全断的

但这不代表 GUI 程序一定能弹窗


2. kmssink 是什么?

kmssink 走的是底层 DRM/KMS 路径。

特点是:

  • 不依赖完整桌面
  • 开销低
  • 很适合嵌入式预览和产品化场景

也就是说:

本地能用 kmssink 出图,不等于 OpenCV imshow() 一定没问题。


3. Weston 是什么?

Weston 是 Wayland compositor,简单理解为:

  • 图形会话管理者
  • 窗口合成器
  • Wayland 客户端的宿主环境

程序要弹窗口时,常常需要运行在正确的 Weston 图形会话里。


4. GTK / Qt 是什么?

它们是 GUI backend。

cv2.imshow() 这种显示方式,通常会依赖:

  • GTK
  • Qt
  • X11
  • Wayland backend

你前面遇到的核心报错就是:

Can't initialize GTK backend

这说明不是模型不行,不是相机不行,而是图形 backend 在当前 shell 中无法初始化。


5. OpenCV 是什么角色?

OpenCV 在这条链里主要负责:

  • 图像处理
  • 画框
  • resize
  • 色彩转换
  • 可选窗口显示

但它本身不是桌面系统。
它要显示窗口,仍然依赖底层 GUI backend。

所以:

  • detections 打印出来,说明推理链正常
  • imshow() 崩掉,说明 GUI/显示会话没通

这两个问题不能混为一谈。


七、为什么 YOLO 能跑,不代表显示链就正常?

这一点在板端 AI 项目里非常关键。

假设一条 YOLO 路径是:

Camera -> Frame -> Preprocess -> Inference -> Postprocess -> Print result

那么它只说明:

  • 采集到帧了
  • 模型算出来了
  • 后处理出了检测结果

但如果你还要显示带框图像,还需要再多一段:

... -> draw boxes -> GUI backend -> display window

所以出现下面这种现象完全正常:

  • 控制台输出 frame 0: 3 detections
  • cv2.imshow() 立即报错退出

这种情况说明:

  • YOLO 推理没问题
  • 崩在显示那一步

你前面的实际排查就是这个典型情况。


八、RTP 和 UDP 到底是什么关系?

这是做网络视频时必须讲清楚的。

1. UDP 全称

UDP = User Datagram Protocol
中文:用户数据报协议

它负责的是:

  • 把数据包快速发出去
  • 低延迟
  • 无连接
  • 不保证可靠到达
  • 不重传

所以 UDP 很适合实时视频。


2. RTP 全称

RTP = Real-time Transport Protocol
中文:实时传输协议

它负责的是:

  • 给实时音视频流定义标准封装格式
  • 标记序列号
  • 标记时间戳
  • 指明 payload 类型
  • 帮助接收端按顺序、按时序恢复媒体流

所以 RTP 不是简单“发数据”,而是:

为实时音视频定义了一套封包和播放时序规则。


3. 为什么视频里常见 RTP over UDP?

因为:

  • UDP 负责“传”
  • RTP 负责“按音视频规则封装”

所以工程上常见的是:

RTP over UDP

不是二选一,而是协同工作。


4. 结合 GStreamer 命令来看

发送端:

... ! h265parse ! rtph265pay pt=96 ! udpsink host=192.168.1.100 port=5000

含义就是:

  • h265parse:整理 H.265 码流
  • rtph265pay:把 H.265 封成 RTP 包
  • udpsink:再通过 UDP 发出去

接收端:

udpsrc ... ! rtph265depay ! h265parse ! avdec_h265 ! autovideosink

含义就是:

  • 从 UDP 收到 RTP 包
  • 把 RTP 包拆开
  • 还原 H.265 码流
  • 解码显示

九、为什么视频推流常用 UDP,而不是 TCP?

因为视频实时预览和文件下载的目标不一样。

文件下载更在乎:

  • 不能丢
  • 顺序必须完全正确
  • 慢一点能接受

实时视频更在乎:

  • 延迟低
  • 连续播放
  • 偶尔丢一点比整体卡住更能接受

如果用 TCP:

  • 丢包会触发重传
  • 网络一抖,延迟就会堆积
  • 实时预览会越拖越慢

如果用 UDP:

  • 少量丢包可能只是花一下
  • 但整体还能继续往前播
  • 更适合 Wi-Fi 下的实时视频预览

所以你现在做“板端相机通过 Wi-Fi 远传到另一台主机显示”,优先 RTP/UDP 是非常合理的。


十、高质量视频到底看什么?

这部分是本文最重要的核心之一。

很多人判断视频质量,只看“清不清楚”。
但真正高质量视频,至少要看下面七个方面。


1. 成像质量

这一层由:

  • 镜头
  • Sensor
  • ISP
  • 3A

共同决定。

关键点包括:

  • 曝光是否稳定
  • 白平衡是否自然
  • 暗部噪声是否可控
  • 高光是否过曝
  • 细节是否保留
  • 色彩是否可信

如果源头成像就差,后面怎么编码和传输都补不回来。


2. 图像格式与色彩空间

常见格式有:

  • RAW
  • YUYV
  • NV12
  • RGB/BGR

高质量 Pipeline 的一个核心原则是:

尽量减少不必要的格式转换。

因为每多一次转换,就可能带来:

  • CPU 开销
  • 带宽开销
  • 额外延迟
  • 潜在画质损失

例如相机输出 NV12,而编码器也适合 NV12,那就尽量别中间反复转 RGB 再转回来。


3. 分辨率

分辨率决定细节上限,比如:

  • 1280×720
  • 1920×1080
  • 3840×2160

但分辨率越高,不代表体验一定越好。
因为它会同时提高:

  • 编码压力
  • 网络带宽压力
  • 解码压力
  • 内存带宽占用

4. 帧率

帧率决定运动流畅度,比如:

  • 15fps
  • 25fps
  • 30fps
  • 60fps

高帧率意味着更流畅,但也意味着更高的数据量和更大压力。

所以“高质量视频”不是一味追求分辨率,而是:

分辨率、帧率、码率、编码能力之间的平衡。


5. 码率

码率对网络视频影响极大。

码率过低会导致:

  • 马赛克
  • 细节丢失
  • 运动模糊
  • 复杂场景下压缩块明显

码率过高会导致:

  • Wi-Fi 承载不稳
  • 丢包概率升高
  • 延迟上升
  • 接收端缓存堆积

对于你当前这类 Wi-Fi 实时预览场景,较稳的起步参数一般是:

  • 1080p30
  • H.265
  • 4Mbps 到 8Mbps

先把链路跑稳,再慢慢往上调。


6. 编码质量

编码器不仅影响带宽,也影响观感。

例如 H.264 和 H.265:

  • H.265 一般压缩效率更高
  • 同等观感下可以更省码率
  • 但编码和解码复杂度更高

在 RK3588 上,优先用硬件编码器是正确方向,因为它可以明显降低 CPU 压力。


7. 网络稳定性与端到端延迟

高质量视频不只是“画面好看”,还包括:

  • 延迟是否低
  • 抖动是否可控
  • 是否持续稳定
  • 是否容易积压卡顿

这尤其是 Wi-Fi 网络视频的核心问题。

所以网络视频质量其实是一个端到端问题,而不是单独盯着编码器看。


十一、3A server 会不会和我的采集程序冲突?

这是做相机项目时很常见的问题。

一般情况下:

普通 C++ 采集程序和 3A server 不会直接冲突。

因为两者职责不同:

3A server 负责:

  • 自动曝光
  • 自动白平衡
  • 自动对焦
  • ISP 参数调整

采集程序负责:

  • 从视频节点取帧
  • 编码 / 显示 / 推理
  • 处理图像数据

它们一般是协作关系,不是互斥关系。

只有两种情况容易出问题:

1. 你的程序也在手动改曝光、增益、白平衡

这时就可能和 3A server 抢控制权。

2. 你的程序碰了不该碰的 ISP/subdev/控制节点

这时可能会干扰 rkaiq 的控制链。

所以经验结论是:

  • 普通取流:一般不冲突
  • 固定曝光实验:可能需要关 3A
  • 自己做完整 ISP 参数控制:要注意职责边界

十二、AI 推理在整条 Pipeline 里处于什么位置?

AI 推理不是整套系统的全部,它只是其中一环。

一条典型目标检测链路可以写成:

Camera -> Frame -> Resize/Normalize -> Inference -> NMS -> Draw -> Output

其中:

  • 前处理:resize、颜色转换、归一化
  • 推理:CPU/GPU/NPU
  • 后处理:阈值筛选、NMS、类别映射
  • 输出:控制台、网络、带框图像

所以如果你做的是板端产品,不应该只盯着“YOLO FPS”,还要看:

  • 采集链有没有瓶颈
  • 显示链和网络链有没有拖后腿
  • 是否能并行输出本地显示和远端预览
  • 是否能稳定运行

十三、RK3588 上做 YOLO,应该优先 CPU、GPU 还是 NPU?

这个问题必须从“验证阶段”和“产品阶段”分开看。

1. 验证阶段

最常见路线是:

  • OpenCV 做图像处理
  • ONNX Runtime 做推理
  • CPU 先跑通

优点是:

  • 依赖简单
  • 容易快速验证
  • 调试方便

缺点是:

  • 性能不一定够
  • 功耗不一定优
  • 不适合最终产品部署

2. GPU 为什么通常不是首选?

在 Rockchip 平台上,GPU 更多偏向:

  • 图形渲染
  • OpenGL
  • 显示相关加速

它不是板端 AI 推理的最优主力路线。


3. NPU 为什么是最终方向?

因为 NPU 是专门为神经网络推理设计的。

优势包括:

  • 更高的性能/功耗比
  • 更适合长期运行
  • 更接近产品化方案

所以正确的工程路线通常是:

  1. 先 CPU / ONNX 跑通
  2. 再转 RKNN
  3. 最终走 NPU 部署

这也是 RK3588 和 Jetson 在开发思路上的重要差别。


十四、RK3588 和 Jetson 的差别到底在哪?

很多人做过 Jetson,再做 RK3588,容易下意识沿用原来的思路。

但两者典型路线不同。

Jetson 更强调:

  • CUDA
  • TensorRT
  • GPU 做 AI 主力

RK3588 更强调:

  • RKNN
  • NPU 做 AI 主力
  • GPU 不是 AI 首选

所以你在 Jetson 上可能首先想到:

  • TensorRT 优化
  • CUDA 预处理
  • GPU pipeline

而在 RK3588 上更合理的路线通常是:

  • V4L2 + GStreamer 打通采集和显示
  • CPU/ONNX 验证模型
  • 最终迁移到 RKNN/NPU

这不是谁绝对更强,而是平台侧重点不同。


十五、真实项目里,最有效的调试顺序是什么?

建议固定按下面顺序排查。

第一步:先查采集

确认:

  • 节点对不对
  • 分辨率/帧率对不对
  • 是否真的有帧输出
  • ISP/3A 是否工作正常

第二步:再查本地显示

优先走最简单路径,比如:

  • kmssink
  • 最小 Weston/Wayland 显示

不要一上来就用完整业务程序判断显示对不对。


第三步:再查网络推流

先用稳妥参数:

  • 1080p30
  • H.265
  • 4Mbps 左右
  • RTP over UDP

把链路跑通后再逐步加码。


第四步:再查 AI 推理

先确认:

  • 模型能不能正常跑
  • 输入输出是否对
  • 后处理是否合理

第五步:最后查整体性能

这时才去重点看:

  • CPU
  • GPU
  • NPU
  • 内存带宽
  • 网络抖动
  • 端到端延迟

这是效率最高的顺序。


十六、几个最常见的误区总结

误区一:DP 亮了,说明图形界面一定正常

错。
DP 亮只说明底层显示链可能正常,不代表 GTK/Wayland/OpenCV 会话没问题。

误区二:YOLO 有检测框输出,说明系统全通

错。
它只说明采集和推理链基本通,不代表窗口显示和网络传输也通。

误区三:本地预览正常,网络推流一定正常

错。
本地显示和网络视频是两条不同 Pipeline。

误区四:高质量视频只看清晰度

错。
高质量视频还包括:

  • 流畅度
  • 色彩
  • 稳定性
  • 延迟
  • 抗抖动能力

误区五:在 RK3588 上 GPU 一定是 AI 主力

错。
最终产品化一般优先走 NPU。


十七、FAQ:几个最容易被问到的问题

Q1:本地 kmssink 正常,但 cv2.imshow() 打不开,先查什么?

先查:

  • OpenCV 是否带 GUI backend
  • 当前 shell 是否在正确图形会话里
  • Wayland/X11 环境变量是否正确
  • Weston 是否真的是当前显示会话宿主

Q2:本地显示正常,切 Wi-Fi 推流后画面卡顿,先调什么?

优先调:

  • 分辨率
  • 帧率
  • 码率
  • queue
  • sync
  • 接收端解码能力

不要一开始就怀疑相机。


Q3:3A server 会不会影响普通取流?

普通取流一般不会。
只有当你的程序也在抢曝光、增益、白平衡等控制时,才可能冲突。


Q4:做板端实时视频,TCP 还是 UDP?

实时预览优先考虑 UDP。
因为 TCP 重传会让延迟越来越大,不适合实时画面。


Q5:RK3588 上 YOLO 最终该走什么路线?

一般建议:

  • 先 ONNX/CPU 跑通
  • 再 RKNN
  • 最终 NPU 产品化部署

十八、结语:真正的能力,不是会写命令,而是会拆系统

做视频系统、做板端 AI、做网络推流,最怕的是“只记命令,不理解结构”。

真正有用的能力不是背下:

gst-launch-1.0 ...

而是当你看到一条 pipeline 时,能立刻说清:

  • 这条链从哪里来
  • 中间做了什么
  • 走了哪些硬件路径
  • 依赖了什么显示/网络/编码能力
  • 哪一段最可能出问题
  • 如果要高质量、低延迟、可产品化,该先优化哪一段

一句话总结全文:

在 RK3588 这类平台上,做视频系统一定要用 Pipeline 思维;本地显示、网络传输、AI 推理要分层理解;高质量视频不是只看“有没有画面”,而是成像、编码、传输、显示和实时性共同作用的结果。


附:适合复习时快速背下来的 12 句话

  1. 视频系统一定要按 Pipeline 理解。
  2. 采集、显示、编码、网络、推理是不同层。
  3. GStreamer 是多媒体 Pipeline 框架,不只是命令工具。
  4. 本地显示、录制、网络推流是三条不同 Pipeline。
  5. DP 亮不等于 GUI 正常。
  6. kmssink 正常不等于 imshow() 正常。
  7. RTP 负责媒体封装,UDP 负责快速传输。
  8. 实时视频常见的是 RTP over UDP。
  9. 高质量视频不仅是清晰度,还包括流畅度、稳定性和延迟。
  10. 尽量减少格式转换,是板端优化关键。
  11. YOLO 跑通只说明 AI 链通,不代表系统全通。
  12. RK3588 最终产品化推理通常优先走 NPU。

📺 B站博主个人介绍

📘 博主书籍-京东购买链接*:Yocto项目实战教程

📘 加博主微信,进技术交流群jerrydev


Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐