📺 B站视频讲解(Bilibili):https://www.bilibili.com/video/BV1k1C9BYEAB/
📘 《Yocto项目实战教程》京东购买链接:Yocto项目实战教程
GStreamer 插件完整讲解(各平台通用,Jetson 为主)
定位:专门讲解 GStreamer 插件(Plugin),涵盖多平台差异与 Jetson 深度解析。内容结构严谨、概念清晰、适合作为教程或课程讲稿。
1. 引言:为什么必须先理解“插件”?
在任何平台上使用 GStreamer(PC、Jetson、RK3588、移动设备)时,第一个必须搞清楚的问题不是 Pipeline,而是 插件(Plugin)。
原因很简单:
- 插件决定系统有哪些 Element 可以用
- 插件决定系统是否支持硬件加速
- 插件决定你能否打开摄像头、是否能解码、是否能显示
- 插件缺失或不兼容时,Pipeline 再完美都运行不了
所以:插件是 GStreamer 能力的根本来源。
2. GStreamer 插件的核心概念(所有平台通用)
2.1 插件的定义(最重要的概念)
GStreamer 插件(Plugin)本质上是一组遵守 GStreamer 框架规范的 .so 动态库文件,内部包含多个 Element(元素),每个元素代表一个可使用的音视频处理功能。
一句话总结:
插件 = 动态库(.so) + 插件描述符 + 若干 Element(功能单元)
插件本身不会“执行功能”,真正执行的是 Element,但 Element 必须由插件提供。
2.2 插件包含什么?(内部构成)
一个 GStreamer 插件内部包含:
- GstPluginDesc(插件描述符)
- plugin_init() 注册函数
- 若干 Element(功能元素)
- 每个 Element 的工厂(GstElementFactory)
- Element 支持的 caps(能力描述,例如 video/x-raw)
示例结构:
libgstnvvidconv.so
├── 注册插件(nvvidconv)
├── 注册 Element:nvvidconv
├── 支持 caps:video/x-raw(memory:NVMM)
└── 实现硬件格式转换
3. 插件、Element、Pipeline 的关系(无需讲 Pipeline,也要理解)
三个概念必须区分:
| 概念 | 解释 |
|---|---|
| Plugin(插件) | 一组动态库,内部包含多个 Element |
| Element(元素) | 功能节点,可在 Pipeline 里使用 |
| Pipeline | Element 的组合形成的数据流图 |
如果没有插件 → 没有 Element → 无法构建 Pipeline。
插件是所有功能的根源。平台之间的差异,本质上都是插件能力的差异。
4. 插件的分类(所有平台通用)
从功能角度分为:
4.1 Source 插件(输入源)
- v4l2src(摄像头)
- filesrc(文件)
- nvarguscamerasrc(Jetson 专属)
4.2 Filter/Transform 插件(数据处理)
- videoconvert
- nvvidconv(Jetson)
- videoflip
4.3 Encoder/Decoder 插件(编解码)
- avdec_h264(软件)
- nvv4l2decoder / encoder(Jetson)
- v4l2codecs(Rockchip)
4.4 Sink 插件(输出)
- autovideosink
- nveglglessink(Jetson)
- nvdrmvideosink(Jetson)
4.5 Mux/Demux 插件(容器格式)
- mp4mux
- qtdemux
平台差异会在每个分类下体现(尤其是硬件加速类)。
5. 插件加载机制(registry)
5.1 插件放在哪里?
所有平台上插件都位于:
/usr/lib/*/gstreamer-1.0/*.so
/usr/lib64/gstreamer-1.0/*.so
5.2 插件是如何被加载的?
GStreamer 使用 插件注册表(registry):
~/.cache/gstreamer-1.0/registry*.bin
首次运行时扫描系统所有插件,之后加速加载。
5.3 如何查看插件是否被检测到?
gst-inspect-1.0 | grep v4l2
或专查某插件:
gst-inspect-1.0 nvvidconv
如果找不到,说明:
- 插件缺失
- 插件依赖库缺失
- 插件版本不兼容
6. 插件在不同平台的差异
GStreamer 是跨平台框架,但插件能力由平台决定。
下面对比主流平台:
6.1 Linux PC(x86 / Ubuntu)插件特点
-
插件全面、生态最完整
-
多为软件实现(CPU 计算)
-
依赖 ffmpeg、libav
-
常见插件:
libgstlibav.so(强大的编解码能力)videoconvert(软件转换)v4l2src(USB 摄像头)
软件能力强,但缺乏专用硬件加速插件。
6.2 NVIDIA Jetson 插件特点(本篇重点)
Jetson 是独一无二的平台,因为它提供了:
✔ 专有硬件加速插件
✔ 深度绑定 Argus / NVMM / EGL
✔ 完整的 GPU + ISP 加速能力
Jetson 插件主要分几类:

6.2.1 摄像头插件:nvarguscamerasrc(最核心)
libgstnvarguscamerasrc.so
功能:
- 访问 MIPI CSI 摄像头
- 使用 Argus API 驱动 ISP
- 输出 NVMM buffer(零拷贝)
这是 Jetson 专属插件,其他平台没有任何替代品。
6.2.2 编解码插件:nvv4l2 系列
libgstnvvideo4linux2.so
包含:
- nvv4l2decoder(硬解码)
- nvv4l2h264enc(硬编码)
- nvv4l2h265enc
基于 V4L2 + NVDEC/NVENC,加速能力强。
6.2.3 格式转换:nvvidconv
libgstnvvidconv.so
能力:
- 颜色空间转换
- 分辨率缩放
- CPU ↔ GPU ↔ NVMM buffer 转换
Jetson pipeline 的必备插件。
6.2.4 显示插件:nveglglessink / nvdrmvideosink
libgstnveglglessink.so
libgstnvdrmvideosink.so
特点:
- EGL/GLES 显示
- 零拷贝渲染
- Wayland & X11 支持
Jetson 显示性能极佳依赖这些插件。
6.3 Rockchip RK3588 插件特点
Rockchip 使用 Linux 主线 V4L2 模型,因此插件以 v4l2codecs 为核心:
- v4l2slh264dec
- v4l2slh265dec
- v4l2codecs
特点:
- 依赖 kernel driver(rkvdec/rkvenc)
- 不如 Jetson 的插件体系完整
- 没有 Argus,摄像头走 V4L2
- 没有 NVMM,零拷贝不如 Jetson
6.4 Windows 平台插件特点
- 插件数量最少
- Dev 未全面维护
- 无法使用多数 Linux 插件
实际工业项目中极少使用。
6.5 Android 平台插件特点
- 插件依赖 NDK、Java bindings
- 摄像头仅支持 Camera API/Camera2
- 插件数量远小于 Linux
主要用于移动端原型验证。
7. Jetson 插件实战分析(基于你的示例)
示例命令:
gst-launch-1.0 v4l2src ! jpegdec ! nvvidconv ! nveglglessink
7.1 每个 Element 对应的插件与 .so
| Element | 插件名称 | 动态库文件 | 插件类型 | 功能 |
|---|---|---|---|---|
| v4l2src | video4linux2 | libgstvideo4linux2.so | Source | 采集 JPEG 视频 |
| jpegdec | jpeg | libgstjpeg.so | Decoder | JPEG → RAW 解码 |
| nvvidconv | nvvidconv | libgstnvvidconv.so | Transform | GPU 格式转换 |
| nveglglessink | nveglglessink | libgstnveglglessink.so | Sink | GPU 渲染显示 |
7.2 整体流程
USB Camera (JPEG)
↓ v4l2src [libgstvideo4linux2.so]
JPEG Stream
↓ jpegdec [libgstjpeg.so]
Raw Video (I420)
↓ nvvidconv [libgstnvvidconv.so]
NVMM/GPU Frames
↓ nveglglessink [libgstnveglglessink.so]
Screen (EGL/GLES)
这是最典型的 Jetson USB 摄像头流程。
8. 如何查看插件的能力?(强烈推荐掌握)
8.1 查看插件列表
gst-inspect-1.0
8.2 查看某个 Element
gst-inspect-1.0 nvvidconv
8.3 查看插件文件路径
gst-inspect-1.0 nvvidconv | grep Filename
8.4 查看支持的 caps
gst-inspect-1.0 nvv4l2decoder | grep video
这些命令是调试最关键的工具。
9. 插件常见问题与解决方法
9.1 找不到元素(No such element)
原因: 插件未正确加载。
解决:
- sudo ldconfig
- 清除 registry:
rm ~/.cache/gstreamer-1.0/*
- 检查依赖库:
ldd /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstnvvidconv.so
9.2 插件版本不兼容
Jetson 上最常见:升级 rootfs 但未同步对应 L4T 插件版本。
解决:重新刷机 or
9.2 插件版本不兼容
Jetson 上常见于:升级 RootFS,但未同步 L4T 固件与插件版本。
表现:
- nvv4l2decoder 无法加载
- nvarguscamerasrc 无法初始化(Argus 崩溃)
- nveglglessink 找不到 EGL backend
解决方法:
- Jetson 必须保持 Bootloader + Kernel + RootFS + CUDA + Multimedia 版本一致
- 不可混用不同 JetPack/L4T 版本组件
- 建议使用 SDK Manager 完整刷机维持一致性
9.3 插件依赖库缺失(ldd 失败)
所有平台均常见,尤其是交叉编译后:
检查依赖库:
ldd /usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstnvvidconv.so
如果出现:not found
则需要:
- 安装缺失的依赖库
- 或修复 LD_LIBRARY_PATH
RK3588 上也常因 ffmpeg 缺失导致 libgstlibav.so 加载失败。
9.4 插件冲突(同类型插件多个)
常见例子:
- 多个 H.264 解码器(avdec_h264、v4l2h264dec、nvv4l2decoder)
- 多个 Sink(ximagesink、nveglglessink、waylandsink)
GStreamer 会自动协商 caps 选择插件,但在 Jetson 上推荐:
export GST_V4L2_DECODER_USE_NV_BUFFER=1
以强制使用硬件 NVMM buffer。
10. 各平台插件能力对比(Jetson / RK3588 / x86)
| 能力 | x86 Ubuntu | NVIDIA Jetson | Rockchip RK3588 |
|---|---|---|---|
| MIPI CSI 摄像头 | 不支持(需驱动) | nvarguscamerasrc(ISP) | v4l2src(不带 ISP) |
| 硬件解码 | 依赖 VAAPI/Intel | nvv4l2decoder(NVDEC) | v4l2codecs(rkvdec) |
| 硬件编码 | x264 软件为主 | nvv4l2h264/265enc(NVENC) | v4l2h264enc/rkvenc |
| GPU 转换 | videoconvert(CPU) | nvvidconv(GPU/NVMM) | rga(非官方 GSt 插件) |
| 显示 | ximagesink | nveglglessink(EGL GPU) | kmssink/drm |
| AI Pipeline | 无深度集成 | DeepStream 插件(nv*) | 缺少统一体系 |
结论:Jetson 插件体系最完整、性能最高、零拷贝能力最佳。
11. Jetson 插件体系深度剖析(高级篇)
Jetson 的插件不仅多,而且 彼此协同:
11.1 NVMM(NVIDIA 内存管理)
NVMM 是 Jetson 多媒体性能的核心:
- Zero-copy 零拷贝传输
- GPU / ISP / VIC / NVENC / NVDEC 共享内存
- 插件间无需 CPU 拷贝
支持 NVMM 的插件包括:
- nvarguscamerasrc
- nvvidconv
- nvv4l2encoder/decoder
- nveglglessink
Pipeline 示例:
nvarguscamerasrc ! video/x-raw(memory:NVMM) ! nvvidconv ! nveglglessink
11.2 Argus Camera API
Jetson 专属 ISP 管线:
- AE/AF/AWB
- 去噪、锐化、畸变矫正
- 传感器初始化
所有 CSI 摄像头必须通过:
nvarguscamerasrc
RK3588 与 x86 没有等效组件。
11.3 EGL + GL + CUDA 协同
Jetson 的显示插件依赖:
- EGLStream
- GLES 渲染
- 与 CUDA 互操作(CUDA-EGL interop)
这使得 Jetson 上:
- 视频解码 → GPU shader → 显示
完全无拷贝。
12. 实战:如何检查系统插件是否完整?
12.1 检查 Jetson 是否有 nv 插件
gst-inspect-1.0 | grep nv
必须有:
- nvarguscamerasrc
- nvvidconv
- nvv4l2decoder
- nvv4l2h264enc
- nveglglessink
如缺失 → 表明你的 JetPack/L4T 不完整。
12.2 查看插件路径
gst-inspect-1.0 nvvidconv | grep Filename
12.3 查看插件支持的格式(caps)
gst-inspect-1.0 nvv4l2decoder | grep video
13. 深度案例:USB 摄像头 JPEG → 屏幕显示(Jetson)
命令:
gst-launch-1.0 v4l2src ! image/jpeg,width=2560,height=1440 ! jpegdec ! nvvidconv ! nveglglessink
这是典型的跨插件链路:
| Stage | Element | 插件 | 作用 |
|---|---|---|---|
| 采集 | v4l2src | video4linux2 | USB 摄像头取流 |
| 解码 | jpegdec | jpeg | JPEG → RAW |
| 转换 | nvvidconv | nvvidconv | RAW → NVMM / RGBA |
| 显示 | nveglglessink | nveglglessink | GPU/EGL 渲染 |
Jetson 的 GPU 在此 pipeline 中全程参与 accelerated path。
14. 如何选择插件(开发者指南)
14.1 摄像头
- CSI(IMX219/IMX477/AR0234):
nvarguscamerasrc - USB 摄像头:
v4l2src
14.2 编解码
- Jetson:始终使用
nvv4l2decoder/encoder - x86:使用
libav(软件)或 VAAPI - RK3588:使用
v4l2slh264dec等
14.3 渲染
- Jetson:
nveglglessink或nvdrmvideosink - RK3588:
kmssink - x86:
ximagesink
14.4 格式转换
- Jetson:必须用
nvvidconv(硬件) - x86:
videoconvert - RK3588:RGA 插件(多为社区实现)
15. 插件调试技巧(必须掌握)
15.1 查看插件是否存在
gst-inspect-1.0 nveglglessink
15.2 打印更多调试信息
GST_DEBUG=3 gst-launch-1.0 ...
15.3 打印某个插件的加载日志
GST_DEBUG=GST_PLUGIN_LOADING:5 gst-launch-1.0 ...
15.4 重新生成 registry
rm ~/.cache/gstreamer-1.0/*
16. 总结:不同平台插件的本质差异
| 平台 | 插件优势 | 插件不足 |
|---|---|---|
| x86/Linux | 插件最丰富,生态强大 | 缺少统一硬件加速体系 |
| RK3588 | V4L2 主线兼容好 | ISP、RGA、编码插件能力不如 Jetson |
| Jetson(主角) | NVMM、Argus、NVENC/NVDEC、EGLStream 完整体系 | 插件必须匹配 JetPack 版本 |
📺 B站视频讲解(Bilibili):https://www.bilibili.com/video/BV1k1C9BYEAB/
📘 《Yocto项目实战教程》京东购买链接:Yocto项目实战教程

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



