📺 B站视频讲解(Bilibili):https://www.bilibili.com/video/BV1k1C9BYEAB/
📘 《Yocto项目实战教程》京东购买链接:Yocto项目实战教程
Jetson GStreamer 实战全指南:从入门到高级(含测试、代码、应用)
适用于 Jetson Orin / Xavier / Nano 全系列平台
内容客观、通俗易懂、以实战为核心,逻辑清晰,包含指令、图表、技巧与完整调试流程。

1. 为什么在 Jetson 上必须学习 GStreamer?
GStreamer 是 Jetson 多媒体栈的核心:
- 摄像头(nvarguscamerasrc)
- GPU 解码(NVDEC)
- GPU 编码(NVENC)
- 视频转换(nvvidconv)
- 显示(nveglglessink)
- DeepStream 基础能力
理解 GStreamer = 理解 Jetson 视频系统的入口。
下文将以 从简单到专业、从基础到工程实战 的方式组织内容。
2. GStreamer 基础概念(初学者友好)
2.1 Pipeline 是什么?
元素1 ! 元素2 ! 元素3
每个 “!” 表示一个模块的输出接到下一个模块的输入。
典型结构:
source → decoder → converter → sink
2.2 Jetson 常用插件一览(非常重要)
| 插件 | 作用 | GPU 加速 | 典型用途 |
|---|---|---|---|
| nvarguscamerasrc | CSI 摄像头输入 | ✔ | MIPI 相机 |
| v4l2src | USB 摄像头输入 | ✘ | UVC 相机 |
| nvv4l2decoder | 硬件解码 H264/H265 | ✔ | 视频播放、RTSP |
| nvv4l2h264enc | 硬件编码 H264 | ✔ | RTSP、录制 |
| nvvidconv | 图像转换、缩放 | ✔ | Grayscale、Resize |
| nveglglessink | GPU 显示 | ✔ | GUI 显示 |
熟悉上表即可应对 90% 的 Jetson 多媒体任务。
3. Jetson GStreamer 入门实战(初级)
3.1 测试 GStreamer 是否正常
gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink
如果看到彩色条纹,说明 GStreamer 工作正常。
3.2 播放本地视频(CPU 解码)
gst-launch-1.0 filesrc location=test.mp4 ! qtdemux ! h264parse ! avdec_h264 ! videoconvert ! autovideosink
适合验证:Pipeline 正常、播放正常。
3.3 Jetson GPU 解码(NVDEC)
初次建议执行此测试,验证 GPU 多媒体是否可用。
gst-launch-1.0 filesrc location=test.mp4 ! qtdemux ! h264parse ! nvv4l2decoder ! nveglglessink
特点:
- Zero-copy GPU pipeline
- 延迟 < 10ms
技巧:如果报错,多半是 Xorg/Wayland 未启动。
3. Jetson GStreamer 入门实战(初级)
本节所有命令,建议按顺序逐条执行并记录现象,形成自己的“Jetson 多媒体自检清单”。
3.1 基础显示测试:GStreamer 是否正常工作?
命令:
gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink
核心知识点:
videotestsrc:内部生成彩条测试源,不依赖任何硬件;videoconvert:将格式转换为显示设备支持的格式;autovideosink:自动选择合适的视频输出后端。
预期结果:
- 屏幕上出现不断变化的彩色条纹;
- 终端无明显报错;
- Ctrl+C 可正常中断。
如果结果异常:
-
只有黑屏 / 无窗口:
- 检查是否在纯 TTY 下运行(无 X11/Wayland 图形环境);
- 在桌面环境或通过
export DISPLAY=:0再尝试;
-
报错
Could not initialise Xv output:-
尝试改用
xvimagesink或nveglglessink:gst-launch-1.0 videotestsrc ! videoconvert ! nveglglessink
-
调试技巧:
-
增加日志级别:
GST_DEBUG=2 gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink -
使用
--gst-debug-no-color方便保存日志到文件。
3.2 播放本地视频:验证解封装 + 解码链路
命令:
gst-launch-1.0 filesrc location=test.mp4 ! \
qtdemux ! h264parse ! avdec_h264 ! videoconvert ! autovideosink
核心知识点:
filesrc:从文件读取数据;qtdemux:解析 MP4 容器,分离音视频轨;h264parse:解析 H.264 码流,使其适配解码器;avdec_h264:CPU 软解;- 该 pipeline 完全不依赖 Jetson 硬件解码单元,适合作为多媒体栈最基础自检。
预期结果:
- 视频能正常播放,CPU 占用相对较高(
top中可观察); - 终端无持续报错。
常见问题与排查:
-
报错
No such file or directory:- 检查
location=路径是否正确;
- 检查
-
无画面但无报错:
-
确认
test.mp4中视频编码是否为 H.264,可用:ffprobe test.mp4 | grep Video -
若为 H.265,需要替换为
avdec_h265或硬件解码器。
-
测试扩展:帧率 / 性能观察
gst-launch-1.0 filesrc location=test.mp4 ! \
qtdemux ! h264parse ! avdec_h264 ! videoconvert ! \
fpsdisplaysink video-sink=autovideosink text-overlay=true
fpsdisplaysink会在终端打印实际渲染帧率和丢帧信息,便于评估性能。
3.3 GPU 解码自检:验证 NVDEC 是否正常(关键)
命令(H.264 示例):
gst-launch-1.0 filesrc location=test.mp4 ! \
qtdemux ! h264parse ! nvv4l2decoder ! nveglglessink
核心知识点:
nvv4l2decoder:调用 Jetson 的 NVDEC 硬件单元进行解码;nveglglessink:基于 EGL/GLES 的 GPU 显示,避开传统 Xv 路径,更符合 Jetson 架构;- 该 pipeline 是后续 DeepStream、视频 AI、RTSP 服务的基础路径。
预期结果:
- 视频播放流畅;
- CPU 占用明显低于软解方案;
- 在
tegrastats中可观察到 NVDEC 模块活跃。
可能问题与原因:
| 现象 | 可能原因 | 建议排查 |
|---|---|---|
启动即报错 Could not get EGL display | 没有有效的图形会话 | 确认当前在图形桌面或已正确设置 DISPLAY、Xauthority |
报 not negotiated | 上下游格式不匹配 | 在 decoder 与 sink 之间增加 nvvidconv + caps 约束 |
| 有声音无画面 | test.mp4 中编码格式非 H.264/H.265 | 用 ffprobe 查看编码格式,调整 parse/decoder |
增强版测试(带性能统计):
gst-launch-1.0 filesrc location=test.mp4 ! \
qtdemux ! h264parse ! nvv4l2decoder ! \
fpsdisplaysink video-sink=nveglglessink text-overlay=true
3.4 综合测试策略:如何判断 Jetson 多媒体栈是否健康?
建议按如下顺序执行并记录结果:
- 纯软件路径测试:
videotestsrc+avdec_h264,验证 GStreamer 基本功能; - 文件播放(软解):排除文件本身问题;
- 文件播放(硬解):验证
nvv4l2decoder+nveglglessink; - 摄像头测试(nvarguscamerasrc / v4l2src);
- **编码与推流测试(nvv4l2h264enc)`;
- 根据需要增加
fpsdisplaysink、GST_DEBUG等辅助工具。
执行完 1~4 步且现象符合预期,基本可以认定:
- 显示链路 OK;
- 解封装/解码链路 OK;
- GPU 多媒体硬件 OK;
- 摄像头驱动与 Argus 栈大体正常。
4. 摄像头实战(Jetson 最重要内容)
4.1 测试 CSI 摄像头(nvargus)
gst-launch-1.0 nvarguscamerasrc ! nveglglessink
如无画面:
- 检查摄像头排线
- 检查驱动是否加载:
/dev/video0不一定存在
指定分辨率:
gst-launch-1.0 nvarguscamerasrc ! 'video/x-raw(memory:NVMM), width=1920, height=1080' ! nveglglessink
4.2 USB 摄像头(UVC)
gst-launch-1.0 v4l2src device=/dev/video0 ! videoconvert ! autovideosink
查看支持格式:
v4l2-ctl -d /dev/video0 --list-formats-ext
5. 中级:图像处理、格式转换、性能优化
5.1 使用 GPU 进行图像格式转换(高性能)
gst-launch-1.0 nvarguscamerasrc ! nvvidconv ! nveglglessink
5.2 缩放到指定分辨率(GPU)
gst-launch-1.0 nvarguscamerasrc ! nvvidconv ! 'video/x-raw(memory:NVMM), width=640, height=480' ! nveglglessink
5.3 保存图片(JPEG 编码)
gst-launch-1.0 nvarguscamerasrc num-buffers=1 ! nvjpegenc ! filesink location=capture.jpg
6. 高级:RTSP、编码器、录像、并发、多路输入
6.1 GPU 编码 H.264 + 保存文件
gst-launch-1.0 nvarguscamerasrc ! nvvidconv ! nvv4l2h264enc ! h264parse ! qtmux ! filesink location=out.mp4
6.2 GPU 编码 + RTSP 推流(最常见工程用途)
gst-launch-1.0 nvarguscamerasrc ! nvvidconv ! nvv4l2h264enc bitrate=4000000 ! rtph264pay ! udpsink host=192.168.1.10 port=5000
客户端 VLC:
udp://@:5000
6.3 多路 USB 摄像头拼接(技巧)
gst-launch-1.0 \
v4l2src device=/dev/video0 ! videoconvert ! videoscale ! m.sink_0 \
v4l2src device=/dev/video1 ! videoconvert ! videoscale ! m.sink_1 \
videomixer name=m ! nveglglessink
技巧:需要相同帧率,否则 pipeline 不会启动。
7. 性能技巧与调优(工程师必备)
7.1 所有高性能 pipeline 都应该使用 NVMM 内存
video/x-raw(memory:NVMM)
避免 CPU copy。
7.2 避免 videoconvert(CPU) → 推荐 nvvidconv(GPU)
Bad:
videoconvert
Good:
nvvidconv
7.3 避免 autovideosink,在 Jetson 上性能低
推荐:
nveglglessink
7.4 nvarguscamerasrc 延迟优化
nvarguscamerasrc bufapi-version=1
减少 pipeline 额外 copy。
8. Jetson GStreamer 技巧集锦(实战经验)
| 场景 | 推荐指令或技巧 |
|---|---|
| 测试硬件解码是否正常 | nvv4l2decoder |
| 评估显示链路 | nveglglessink |
| 排查摄像头驱动是否正常 | v4l2-compliance |
| 查看 Argus 日志 | sudo journalctl -u nvargus-daemon |
| RTSP 卡顿排查 | 查看编码器码率、网络 MTU |
| pipeline 启动失败 | 分辨率 + 格式是否一致 |
9. GStreamer → DeepStream 的能力迁移图(关键)
GStreamer 基础
↓
摄像头 / 视频播放 / 解码编码
↓
GPU Zero-copy Pipeline
↓
多路流 / RTSP / 转码
↓
DeepStream 插件(nvinfer / nvtracker / nvstreammux)
↓
完整 AI 视频分析应用
理解这条链路之后,学习 DeepStream 会非常轻松。
10. 真实工程示例:实现一个“录制 + 显示 + 推流”三合一系统
gst-launch-1.0 nvarguscamerasrc ! \
nvvidconv ! tee name=t \
t. ! nveglglessink \
t. ! nvv4l2h264enc ! h264parse ! qtmux ! filesink location=record.mp4 \
t. ! nvv4l2h264enc bitrate=4000000 ! rtph264pay ! udpsink host=192.168.1.10 port=5000
实现:
- HDMI 显示 nveglglessink
- 本地录像 record.mp4
- 网络推流 RTSP-like(UDP)
此 pipeline 是实际工程中最常见的结构。
11. 总结:Jetson GStreamer 实战路线
| 阶段 | 内容 | 收获 |
|---|---|---|
| 入门 | testsrc、视频播放 | 熟悉 GStreamer 语法 |
| 基础实战 | USB/CSI 摄像头 | 控制 Jetson 输入模块 |
| 中级 | 解码、编码、转换、显示 | 理解 GPU pipeline |
| 高级实战 | 多路视频、RTSP、Zero-copy | 具备工程能力 |
| 专业 | DeepStream | 可构建 AI 视频系统 |
📺 B站视频讲解(Bilibili):https://www.bilibili.com/video/BV1k1C9BYEAB/
📘 《Yocto项目实战教程》京东购买链接:Yocto项目实战教程
1550

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



