【全流程】配置 Jetson Nano 摄像头使用 GStreamer 传输 RTSP 流到本地(整合版)


文末附录内容:【本地编译 OpenCV 支持 GStreamer(Windows 方案)】

写在前面:为什么选择 GStreamer

Jetson Nano 这样的微机平台中,我们选择视频流传输工具时应该综合考虑 硬件兼容性、延迟、资源占用和开发效率这几个方面。

以下是 GStreamer 与其他常见几种工具做对比:

工具/框架优势局限性适用场景
GStreamer✅ 深度整合 NVIDIA 硬件编码(NVENC/NVDEC) ✅ 模块化管道,灵活定制处理链路 ✅ 超低延迟(50~200ms) ✅ 支持 RTP/RTSP/UDP/TCP 全协议栈❗ 学习曲线较陡(需掌握插件语法,但现在有ai,咱学的快哈哈哈)❗ 多平台编译依赖较复杂在嵌入式设备进行实时推流,如 Jetson Nano
FFmpeg✅ 命令行简洁易用 ✅ 支持几乎所有编解码格式 ✅ 社区资源丰富❌ Jetson 上需手动启用硬件加速(需编译支持) ❌ 高分辨率下延迟较高(>300ms) ❌ 无法灵活插入自定义处理逻辑快速验证格式转换 非实时批量处理
VLC✅ 图形界面操作友好 ✅ 跨平台播放器一体化方案 ✅ 支持简单推流❌ 硬件加速依赖系统驱动(Jetson 兼容性差) ❌ 延迟不可控(>500ms) ❌ 无法深度定制编码参数临时调试播放 非专业流媒体场景
Python OpenCV✅ 开发便捷,适合快速搭建平台 ✅ 与 AI 模型无缝集成(YOLO 各系列用的多)❌ 默认不支持硬件编码(CPU 软编码负载高) ❌ 网络传输需依赖额外库 ❌ 高帧率下稳定性差本地摄像头调试, 轻量级 AI 推理演示
RTSP Simple Server✅ 专为 RTSP 流媒体设计 ✅ 轻量(<5MB 内存占用) ✅ 支持鉴权和多路流管理无硬件加速支持 ❌ 功能单一,仅转发流,无处理能力 ❌ 依赖外部编码器纯转发场景, 低资源服务器流分发

为什么在 Jetson Nano 上首选 GStreamer

GStreamer 是一个功能强大的开源多媒体框架,用于构建处理音频、视频和多媒体流的应用程序。它提供了丰富的工具和库,帮助开发者创建、处理和播放多媒体内容。

  • 硬核性能:NVIDIA 硬件加速全链路支持,板子本身支持
    GStreamer 通过 nvarguscamerasrcnvvidconvnvv4l2h264enc 等插件直接调用 Jetson Nano 的 GPU 和编码器,实现 零拷贝内存传递,对比 FFmpeg 软编码方案,CPU 占用率降低 60% ,帧率提升 2~3 倍。

  • 毫秒级延迟
    通过 tune=zerolatencyspeed-preset=ultrafast 参数优化,GStreamer 在 720p@30fps 下延迟可控制在 ​80ms 以内,而 FFmpeg 或 VLC 通常在 200ms 以上(太慢了),适合机器人 SLAM、无人机避障,YOLO 目标检测等实时推理场景。

  • 灵活性与可扩展性
    GStreamer 的 ​​“管道-插件” 架构 允许在视频流链路中任意插入处理模块(如滤镜、AI 推理、数据叠加)

# 在推流链路中加入边缘检测和文字叠加
nvarguscamerasrc ! nvvidconv ! videoconvert ! \
tee name=t \
t. ! queue ! edge_detect ! x264enc ! ...  # 分支1:处理后的视频流  
t. ! queue ! textoverlay text="Live Stream" ! ...  # 分支2:原始视频流+叠加文字
  • 支持多协议,兼容性好
    支持 RTSP/RTP/UDP/TCP/WebRTC 等协议,可通过 rtspsrcrtspsink 插件快速搭建企业级流媒体服务,无需额外部署 Nginx 或 Wowza。

结论:GStreamerJetson Nano 上实现高性能、低延迟视频流传输的终极方案,尤其在与 AI 推理结合的复杂场景(如 YOLO 实时目标识别)中表现卓越。在Jetson Nano 上使用 GStreamer 可以利用其硬件加速(H.264 编码),同时通过 UDP 或 TCP 推送视频流到笔记本。

我们开始讲解如何在本地配置 GStreamerJetson Nano,并实现视频流传送。


1. Jetson Nano 端:配置 GStreamer 推流

1.1 配置环境,确保 GStreamer 已安装

在 Jetson Nano 上安装 GStreamer 和相关插件:

sudo apt-get update
sudo apt-get install gstreamer1.0-tools gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav
  • gstreamer1.0-tools: 包含 GStreamer 命令行工具(如 gst-launch-1.0)。
  • gstreamer1.0-plugins-base: 基础插件集,支持常见格式。
  • gstreamer1.0-plugins-good: 高质量插件集,支持更多格式和功能。
  • gstreamer1.0-plugins-bad: 实验性插件集。
  • gstreamer1.0-plugins-ugly: 包含一些有专利问题的插件。
  • gstreamer1.0-libav: 提供基于 FFmpeg 的编解码器支持。

1.2 一键式推流命令

在命令行使用以下命令从 Jetson Nano 的 CSI 摄像头捕获视频并通过 UDP 推送到笔记本:

# 通过 UDP 推送 CSI 摄像头视频流(硬件加速方案)
gst-launch-1.0 \
nvarguscamerasrc ! \
"video/x-raw(memory:NVMM),width=640,height=480,framerate=30/1" ! \
nvvidconv ! "video/x-raw,format=I420" ! \
x264enc tune=zerolatency bitrate=500 speed-preset=superfast ! \
rtph264pay config-interval=1 pt=96 ! \
udpsink host=<PC_IP> port=5000
  • video/x-raw(memory:NVMM): 指定视频格式为 NVMM(NVIDIA 内存管理),分辨率为 640x480,帧率为 30fps。
  • nvvidconv: 使用 NVIDIA 硬件加速进行视频格式转换。
  • x264enc: 使用 H.264 编码器,优化为低延迟传输。
    • bitrate=500: 设置比特率为 500 kbps。
    • speed-preset=superfast: 使用超快编码预设以降低延迟。
  • udpsink: 通过 UDP 协议传输视频流。
    • host=<PC_IP_ADDRESS>: 替换为笔记本的 IP 地址。
    • port=5000: 视频流传输的目标端口。
组件作用
nvarguscamerasrc调用 Jetson Nano 的 CSI 摄像头驱动
nvvidconv使用 GPU 硬件加速进行视频格式转换(NVMM → CPU 可读内存)
x264enc调用 NVIDIA 硬件编码器,zerolatency 模式确保超低延迟
rtph264pay将 H.264 视频流封装为 RTP 包。
udpsink通过 UDP 协议发送到指定 IP 和端口,传输视频流

2. 笔记本(本地)端:接收和显示视频流

2.1 方案一:使用 OpenCV 实时预览

笔记本可以通过 OpenCVGStreamer 接收并解码 RTSP 视频流。

事先需要保证 OpenCV 在编译时包含 GStreamer 支持!!!
相关内容附在本文末尾处

import cv2

# 配置 UDP 流接收(需 OpenCV 编译时包含 GStreamer 支持!自主编译部分在本文末尾处)
pipeline = "udpsrc port=5000 ! application/x-rtp,payload=96 ! rtph264depay ! decodebin ! videoconvert ! appsink"
cap = cv2.VideoCapture(pipeline, cv2.CAP_GSTREAMER)

while cap.isOpened():
    ret, frame = cap.read()
    if not ret: break
    cv2.imshow("Jetson Nano Stream", frame)
    if cv2.waitKey(1) == ord('q'): break

cap.release()
cv2.destroyAllWindows()
  • udp://@:5000: 从 UDP 端口 5000 接收视频流。
  • cv2.imshow: 显示视频流。
  • cv2.waitKey(1): 检测按键输入,按下 q 键退出。

2.2 方案二:GStreamer 原生播放(更低延迟,我推荐这种,实测效果很好)

# 接收 UDP 流并渲染到屏幕
gst-launch-1.0 -v udpsrc port=5000 \
! "application/x-rtp,media=video,encoding-name=H264" \
! rtph264depay ! avdec_h264 ! videoconvert ! autovideosink
  • udpsrc port=5000: 从 UDP 端口 5000 接收数据
  • rtph264depay: 解封装 RTP 包
  • avdec_h264: 解码 H.264 视频流
  • autovideosink: 自动选择视频输出设备

3. 进阶优化策略

3.1 编码参数调优

# 修改推流命令中的编码参数(示例:1080p 低带宽场景)
x264enc tune=zerolatency bitrate=2000 speed-preset=ultrafast ! ...

分辨率调整width=1280, height=720(平衡清晰度与带宽)
帧率控制framerate=15/1(动态场景可降低至 15fps,视情况而定)
比特率优化:根据网络质量调整 bitrate

3.2 切换网络传输协议

可以使用 TCP 协议:如果 UDP 丢包严重,可以改用 TCP 传输。(但一般不会)

Jetson Nano 上:

gst-launch-1.0 nvarguscamerasrc ! \
'video/x-raw(memory:NVMM),width=640,height=480,framerate=30/1' ! \
nvvidconv ! 'video/x-raw,width=640,height=480,format=I420' ! \
x264enc tune=zerolatency bitrate=500 speed-preset=superfast ! \
rtph264pay config-interval=1 pt=96 ! tcpserversink host=<PC_IP_ADDRESS> port=5000

本地笔记本 上:

gst-launch-1.0 tcpclientsrc host=<JETSON_IP_ADDRESS> port=5000 ! \
application/x-rtp,media=video,encoding-name=H264,payload=96 ! \
rtph264depay ! avdec_h264 ! autovideosink
协议命令片段适用场景
UDPudpsink host=IP port=5000低延迟,容忍少量丢包
TCPtcpserversink host=IP port=5000高可靠性网络,允许自动重传

3.3 硬件加速全链路配置

# 从采集到显示全程使用 NVIDIA 硬件加速(Jetson Nano → 笔记本 NVIDIA GPU)
nvarguscamerasrc ! nvvidconv ! nvv4l2h264enc ! rtph264pay ! udpsink ...
  • Jetson Nano端加速:确保使用 NVIDIA 硬件 加速(如 nvvidconvx264enc)。

  • 本地笔记本端解码加速:如果笔记本有 GPU,可以使用 CUDA 加速 OpenCV 或 GStreamer 的视频处理

    (下面代码是配置 CUDA 版本 = 12.6,获取 GPU 加速),建议去官网配置

  pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu126  

4. 故障排查

emmm,这是我当时遇到的一些问题。。。经供参考

4.1 视频流无法接收🔍

  • 确保本地的 OpenCV 支持 GStreamer

  • 检查 Jetson Nano 和笔记本的网络连接,可以在同一 局域网

  • 确保防火墙允许 UDP/TCP 端口 5000 的通信

  • 检查 GStreamer 命令中的 IP 地址端口 是否正确

    # Jetson Nano 测试摄像头是否正常
    gst-launch-1.0 nvarguscamerasrc ! nvvidconv ! autovideosink
    # 本地测试端口连通性
    sudo apt install netcat
    nc -ul 5000  # Jetson 端发送测试数据
    

4.2 高延迟问题

  • 在推流命令中添加 sync=false 禁用音视频同步

  • 使用 speed-preset=ultrafast ,来降低编码复杂度

  • 通过 ifconfig 检查网络延迟,推荐使用有线连接

【这里是附录,解决 OpenCV 不支持 GStreamer】


附录:本地编译 OpenCV 支持 GStreamer(Windows 方案)

由于大部分当前主流版本预编译 OpenCV 版本默认不包含 GStreamer 支持,我们需手动编译OpenCV


1. 安装 GStreamer 开发环境

1.1 下载 RuntimeDevelopment 版本

组件类型下载链接安装路径示例
Runtime 版本GStreamer Runtime (Windows 64-bit)D:\Gstream\run
Development 版本GStreamer Development (Windows 64-bit)D:\Gstream\develop

1.2 配置系统环境变量

• 将以下路径加入 PATH 环境变量:

D:\Gstream\run\bin
D:\Gstream\develop\bin

• 新增 PKG_CONFIG_PATH 环境变量:

D:\Gstream\run\1.0\msvc_x86_64\lib\pkgconfig

1.3 验证安装

# 检查 GStreamer 版本
gst-launch-1.0 --version
# 验证 pkg-config 配置
pkg-config --cflags gstreamer-1.0
pkg-config --libs gstreamer-1.0

2. 编译 OpenCV 源码

2.1 获取源码

# clone一下 OpenCV 主仓库
git clone https://github.com/opencv/opencv.git
# 下载扩展模块(必须与 OpenCV 版本匹配)
git clone https://github.com/opencv/opencv_contrib.git

2.2 配置 CMake

推荐使用 CMake 自带的 gui 可视化界面来操作,这里介绍命令行操作

使用以下命令启用 GStreamer,并指定 opencv_contrib 的模块路径:

# 创建构建目录
cd opencv
mkdir build
cd build
# 生成构建配置(注意替换实际路径)
cmake -S D:\opencv `
      -B D:\opencv\build `
      -D CMAKE_BUILD_TYPE=Release `
      -D OPENCV_EXTRA_MODULES_PATH=D:\opencv_contrib\modules `
      -D WITH_GSTREAMER=ON `
      -D PKG_CONFIG_EXECUTABLE=pkg-config `
      -D CMAKE_INSTALL_PREFIX=D:\opencv\install `
      -D CMAKE_PREFIX_PATH="D:\Gstream\develop\1.0\msvc_x86_64" `
      -D GSTREAMER_INCLUDE_DIR=D:\Gstream\develop\1.0\msvc_x86_64\include\gstreamer-1.0 `
      -D GSTREAMER_LIBRARY_DIR=D:\Gstream\develop\1.0\msvc_x86_64\lib

2.3 关键配置验证

在输出中检查以下是否出现以下关键信息:

--   GStreamer:                   YES (1.20.6)
--     base:                      YES (1.20.6)
--     video:                     YES (1.20.6)
--     app:                       YES (1.20.6)

2.4 执行编译

Visual Studio 生成解决方案(根据实际版本调整),本人使用 Visual Studio 2022

cmake --build . --config Release --target INSTALL -j 8

3. 验证 OpenCVGStreamer 支持

3.1 检查编译结果

import cv2
print(cv2.getBuildInformation())  # 输出中应包含 "GStreamer: YES"

若输出 GStreamer: YES,则编译成功。

3.2 测试视频流接收(本地)

import cv2

# 使用 GStreamer 管道接收视频流
pipeline = "udpsrc port=5000 ! application/x-rtp,payload=96 ! rtph264depay ! decodebin ! videoconvert ! appsink"
cap = cv2.VideoCapture(pipeline, cv2.CAP_GSTREAMER)

while cap.isOpened():
    ret, frame = cap.read()
    if not ret: break
    cv2.imshow("GStreamer Stream", frame)
    if cv2.waitKey(1) == ord('q'): break

cap.release()
cv2.destroyAllWindows()

4 常见编译问题排查

❌ 错误:pkg-config 找不到 GStreamer

  • 确保 PKG_CONFIG_PATH 指向正确的 .pc 文件路径(如 D:\Gstream\run\1.0\msvc_x86_64\lib\pkgconfig
  • 也可以在 PowerShell 中临时设置环境变量:
$env:PKG_CONFIG_PATH="D:\Gstream\run\1.0\msvc_x86_64\lib\pkgconfig"

❌ 错误:缺少 glib-2.0 头文件

手动指定 GLib 路径:

-D GLIB_INCLUDE_DIR="D:\Gstream\run\1.0\msvc_x86_64\include\glib-2.0"
-D GLIB_LIBRARY="D:\Gstream\run\1.0\msvc_x86_64\lib\glib-2.0.lib"

通过本方案,可以在 Windows 平台实现 OpenCV + GStreamer 的深度整合,为 Jetson Nano 视频流处理提供完整的本地开发支持!

有想交流的朋友可以联系微信:a2744739916,或微信公众号:咚叶的小铺
欢迎大家一起交流!

📝 文档声明
所有功能均通过实际场景验证,转载请注明出处:[https://blog.csdn.net/a2744739916/article/details/146167874]

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值