配置 Jetson Nano 摄像头使用 GStreamer 传输 RTSP 流到本地
目录
GStreamer 是一个功能强大的开源多媒体框架,用于构建处理音频、视频和多媒体流的应用程序。它提供了丰富的工具和库,帮助开发者创建、处理和播放多媒体内容。
最佳方案:在 Jetson Nano 上使用 GStreamer
推送 RTSP 流
Jetson Nano 使用 GStreamer 可以利用其硬件加速(H.264 编码),同时通过 UDP 或 TCP 推送视频流到笔记本。
1. 配置 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 运行 GStreamer 命令
使用以下命令从 Jetson Nano 的 CSI 摄像头捕获视频并通过 UDP 推送到笔记本:
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 ! udpsink host=<PC_IP_ADDRESS> port=5000
nvarguscamerasrc
: 调用 Jetson Nano 上的 CSI 摄像头。video/x-raw(memory:NVMM)
: 指定视频格式为 NVMM(NVIDIA 内存管理),分辨率为 640x480,帧率为 30fps。nvvidconv
: 使用 NVIDIA 硬件加速进行视频格式转换。x264enc
: 使用 H.264 编码器,优化为低延迟传输。tune=zerolatency
: 设置为零延迟模式。bitrate=500
: 设置比特率为 500 kbps。speed-preset=superfast
: 使用超快编码预设以降低延迟。
rtph264pay
: 将 H.264 视频流封装为 RTP 包。udpsink
: 通过 UDP 协议传输视频流。host=<PC_IP_ADDRESS>
: 替换为笔记本的 IP 地址。port=5000
: 视频流传输的目标端口。
2. 在笔记本上接收 RTSP 流
笔记本可以通过 OpenCV
或 GStreamer
接收并解码 RTSP 视频流。
2.1 使用 OpenCV 接收 RTSP 流
调用 OpenCV
在笔记本端接收并显示摄像头视频流:
import cv2
cap = cv2.VideoCapture("udp://@:5000") # 接收来自 Jetson Nano 的视频流
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("Failed to receive frame. Exiting...")
break
cv2.imshow("RTSP Stream", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
udp://@:5000
: 从 UDP 端口 5000 接收视频流。cv2.imshow
: 显示视频流。cv2.waitKey(1)
: 检测按键输入,按下q
键退出。
2.2 使用 GStreamer 接收 RTSP 流
调用 GStreamer
接收并显示视频流:
gst-launch-1.0 udpsrc port=5000 ! application/x-rtp,media=video,encoding-name=H264,payload=96 ! rtph264depay ! avdec_h264 ! autovideosink
udpsrc port=5000
: 从 UDP 端口 5000 接收数据。rtph264depay
: 解封装 RTP 包。avdec_h264
: 解码 H.264 视频流。autovideosink
: 自动选择视频输出设备。
3. 优化建议
3.1 压缩与分辨率调整
- 降低分辨率:如果网络带宽有限,可以降低视频分辨率(例如
320x240
)。 - 调整比特率:根据网络条件调整比特率(例如
bitrate=300
)。 - 帧率调整:降低帧率以减少带宽占用(例如
framerate=15/1
)。
3.2 使用轻量化模型
- 若使用 YOLO 进行目标检测,可以切换到轻量化模型(如
YOLOv5n
或YOLOv7-tiny
之类)以提高推理速度。
3.3 使用硬件加速
- Jetson Nano:确保使用
NVIDIA 硬件
加速(如nvvidconv
和x264enc
)。 - 本地:如果笔记本有 GPU,可以使用 CUDA 加速 OpenCV 或 GStreamer 的视频处理。
3.4 网络优化
-
使用 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
-
4. 常见问题排查
emmm,这是我当时遇到的一些问题。。。
4.1 视频流无法显示
- 确保本地的
OpenCV
支持GStreamer
。 - 检查 Jetson Nano 和笔记本的网络连接,可以在同一
局域网
下。 - 确保防火墙允许 UDP/TCP 端口
5000
的通信。 - 检查 GStreamer 命令中的
IP 地址
和端口
是否正确。
4.2 视频延迟过高
- 降低
分辨率
和比特率
。 - 使用更快的编码预设
speed-preset=ultrafast
有想交流或获取源码的朋友可以私信,或微信公众号:咚叶的小铺
,欢迎大家!