📺 B站视频讲解(Bilibili):https://www.bilibili.com/video/BV1k1C9BYEAB/
📘 《Yocto项目实战教程》京东购买链接:Yocto项目实战教程
Jetson 视频流处理完整讲解:从摄像头特性到 GStreamer 实战
–

1. 为什么要学习视频流处理?(引言)
在嵌入式视觉系统中,“视频流”是所有 AI、监控、机器视觉、机器人视觉的基础。摄像头通过 USB、MIPI、CSI 等接口传输连续帧,而系统需要对帧进行:
- 显示(预览)
- 存储(录像)
- 处理(AI 推理 / 图像增强 / 降噪)
- 编码/解码(H.264/H.265)
在 NVIDIA Jetson 平台上,这些能力由 硬件加速模块(GPU、NVDEC、NVENC、ISP) 与软件框架(GStreamer、Argus、V4L2)共同完成。
本篇内容将带你完整理解:
- 摄像头支持什么格式、什么能力?如何测试?
- GStreamer 在 Jetson 上如何工作?
- 不同格式(MJPEG/YUYV/NV12)对 CPU 和 GPU 的影响是什么?
- 如何通过测试掌握摄像头能力并做出最优选择?
- Jetson 平台的硬件加速链路是怎样的?
文章内容 理论 + 实战 + 工具使用,适合完全不了解视频流的初学者。
2. 摄像头视频格式基础知识:必须先理解的核心概念
在 Jetson 上调试摄像头之前,你必须明确:
✔ 摄像头不提供“图像”,提供的是“视频格式”
不同摄像头输出的帧格式不同,常见的有:
| 格式 | 是否压缩 | CPU 负载 | GPU 能否直接用 | 典型接口 | 说明 |
|---|---|---|---|---|---|
| YUYV (YUY2) | ❌ 无压缩 | ⭐ 高(需转换) | ❌ 不能直接用 | USB/UVC | 体积大、颜色子采样 YUV422 |
| NV12 | ❌ 无压缩 | ⭐ 低 | ✔ Jetson 最喜欢 | MIPI/CSI | Jetson ISP 输出格式 |
| MJPEG | ✔ JPEG 压缩 | ⭐⭐ 中 | ❌ 需 CPU 解码成 YUV | USB/UVC | 体积小、节省带宽 |
| H.264/H.265 | ✔ 强压缩 | ⭐ 低(硬件解码) | ✔ NVDEC 支持 | 特殊摄像头 | 带宽最低、延迟最低 |
要理解 Jetson 视频处理,你要记住一句话:
🔥 GPU 不能直接处理 MJPEG/YUYV,需要转换为 NV12(NVMM 显存)
而这个转换过程通常由:
- CPU(如 jpegdec)
- GPU(如 nvvidconv)
共同完成。
3. 如何查看摄像头的能力?(第一步必须做的能力检查)
Jetson 上每个摄像头必须先“查能力”,否则你无法知道能支持什么分辨率与帧率。
使用 v4l2-ctl:
v4l2-ctl -d /dev/video0 --list-formats-ext
输出示例:
[0]: 'MJPG' (Motion-JPEG)
Size: Discrete 2560x1440 @ 30 fps
Size: Discrete 1920x1080 @ 30 fps
[1]: 'YUYV' (YUV 4:2:2)
Size: Discrete 1920x1080 @ 5 fps
Size: Discrete 1280x720 @ 10 fps
Size: Discrete 640x480 @ 30 fps
这说明:
✔ MJPEG 最高支持 30 fps @ 2560x1440(高分辨率)
✔ YUYV 高分辨率只能 5 fps,无法实时
原因:
- YUYV 未压缩,USB 带宽吃不消
- MJPEG 压缩后带宽小,可以达到更高分辨率
你能看到的第一个重点:
🔥 MJPEG 适合高分辨率预览
🔥 YUYV 适合低分辨率、低延迟场景
4. Jetson 视频处理流水线:关键知识图
下面是 Jetson 上视频处理的真实链路:
摄像头 → USB/UVC → V4L2 → GStreamer → nvvidconv → NVMM (GPU 显存) → 显示/编码/AI
解释每一步:
| 组件 | 功能 | 是否使用 GPU |
|---|---|---|
| 摄像头 | 输出 MJPEG/YUYV 等格式 | ❌ |
| V4L2 (v4l2src) | 抓取摄像头帧 | ❌ |
| jpegdec | 解 MJPEG(CPU) | ❌ |
| nvvidconv | 格式转换 YUYV→NV12、放入 GPU | ✔ GPU |
| nveglglessink | GPU 渲染显示 | ✔ GPU |
| nvv4l2h264enc | GPU 编码 H.264/H.265 | ✔ NVENC |
所以:
🔥是否使用 GPU,取决于是否进入 NVMM(显存)
而 nvvidconv 是关键节点。
5. 实战:使用 GStreamer 测试摄像头的不同格式
以下是 Jetson 最常用的两类测试:
5.1 MJPEG 测试(高分辨率、高帧率)
命令:
gst-launch-1.0 v4l2src device=/dev/video0 ! \
'image/jpeg,width=2560,height=1440,framerate=30/1' ! \
jpegdec ! nvvidconv ! nveglglessink
处理流程:
- 摄像头输出 MJPEG
jpegdecCPU 解码nvvidconvGPU 转 NV12 + 拷贝到 NVMM- 显示
特点:
- 优点:分辨率高、帧率高
- 缺点:CPU 使用率高(MJPEG 解码)
- GPU 使用率中等
适合:
- 高清预览(2K/4K)
- 静态画面
- USB 带宽有限的场景
5.2 YUYV 测试(未压缩原始帧)
命令:
gst-launch-1.0 v4l2src device=/dev/video0 ! \
"video/x-raw,format=YUY2,width=640,height=480,framerate=30/1" ! \
nvvidconv ! nveglglessink
处理流程:
- 摄像头输出 YUYV(未压缩)
nvvidconv直接 GPU 转换成 NV12- GPU 直接渲染
特点:
- 优点:延迟最低,CPU 使用最少
- 缺点:高分辨率时 USB 带宽不够
- 需要摄像头支持高帧率 YUYV
适合:
- 低延迟实时监控
- 机器人导航
- 较低分辨率场景(480p~720p)
6. 两种格式的真实对比(你的现象解释)
你在 Jetson Power GUI 看到的情况:
📌 MJPEG 的 CPU 高
因为:需要 CPU 软件解码
📌 YUYV 的 CPU 低、GPU 压力略高
因为:
- YUYV → NV12 转换走 nvvidconv(GPU)
- CPU 只负责读帧,不解码
📌 高分辨率 YUYV 帧率被限制
因为 USB 传输未压缩视频带宽巨大。
你的摄像头能力结构完美证明这一点。
7. Jetson 特性:为什么一定要使用 NVMM(GPU 显存)?
Jetson 平台硬件加速依赖于:
- NVENC:硬件编码器(H.264/H.265)
- NVDEC:硬件解码器
- VIC:Video Image Compositor(nvvidconv 的硬件)
- CUDA / GPU:OpenGL ES 显示
只有当视频帧处于 NVMM buffer(显存中),这些硬件模块才能直接读取。
而 nvvidconv 的作用:
✔ 将 CPU 内存帧 → GPU 显存帧(NVMM)
✔ 将各种格式转换成 NV12 / RGBA
没有它,GPU 无法参与处理。
8. 实战:GPU + CPU 同时测试(录像 + 预览)
下面命令能同时:
- GPU 显示(nveglglessink)
- GPU 编码 H.264(nvv4l2h264enc)
gst-launch-1.0 -e v4l2src device=/dev/video0 ! \
"video/x-raw,format=YUY2,width=1280,height=720,framerate=30/1" ! \
tee name=t \
t. ! queue ! nvvidconv ! nveglglessink \
t. ! queue ! nvvidconv ! nvv4l2h264enc ! h264parse ! mp4mux ! filesink location=out.mp4
意义:
tee进行双路分发- nvv4l2h264enc 用硬件编码,不增加 CPU 负载
你可以观察 Jetson Power GUI:
- GPU igpu0 使用率上升(显示 + 格式转换)
- NVENC 工作
- CPU 基本空闲
这是判断 Jetson 硬件加速是否正确的最佳方式。
9. 最佳实践:如何选择摄像头格式?
根据你的用途做如下判断:
✔ 想要高分辨率、高帧率 → 用 MJPEG
- CPU 会高
- GPU 显示需要 nvvidconv
- 更适合“展示画面”类场景
✔ 想要低延迟实时处理 → 用 YUYV
- 帧解析简单
- GPU 格式转换轻松
- 适合机器人、流媒体实时分析
✔ 想要编码 → 用 YUYV + NVENC
✔ 想要最低功耗 → 用 MJPEG(带宽小)
10. 对初学者最重要的理解(核心总结)
这是你必须掌握的三条铁律:
① 摄像头输出的是它自己的格式,而不是 GPU 能直接处理的格式
② Jetson 任何 GPU 加速都依赖 NVMM(显存),由 nvvidconv 负责转换
③ MJPEG → CPU 解码,YUYV → GPU 转换,不同格式对应不同性能表现
如果你理解这三点,你已经掌握 Jetson 视频流 80% 的核心能力。
📺 B站视频讲解(Bilibili):https://www.bilibili.com/video/BV1k1C9BYEAB/
📘 《Yocto项目实战教程》京东购买链接:Yocto项目实战教程
3176

被折叠的 条评论
为什么被折叠?



