jetpack6.0+ubuntu22.04
相机:森云智能2M-GMSL2星光相机
1.安装GStreamer
1.1测试开发环境是否支持通过GMSL2接口访问相机:
gst-launch-1.0 --version
如果没有,运行下边指令安装:
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
1.2OpenCV GStreamer支持检查
如需使用opencv:
import cv2
print(cv2.getBuildInformation())
查看输出内容是否有GStreamer相关内容,且内容为yes +版本号。
2.NVIDIA Orin运行指令
使用 v4l2-ctl 查询摄像头支持的格式:
v4l2-ctl --device=/dev/video7 --list-formats-ext
运行如下指令捕获摄像头数据并通过UDP推送到别的主机:
1.启动相机
sudo insmod ./nv_nru2mp.ko #相机驱动
sudo ./NRU_230_SN2M4EFGD.sh #启动脚本
2.测试相机是否正常点亮:
gst-launch-1.0 v4l2src device=/dev/video7 ! xvimagesink
3.正常则可推流:
gst-launch-1.0 v4l2src device=/dev/video7 ! 'video/x-raw,format=UYVY,width=1920,height=1080,framerate=30/1' ! videoconvert ! x264enc tune=zerolatency bitrate=200 speed-preset=superfast ! rtph264pay config-interval=1 pt=96 ! udpsink host=192.168.X.XX port=5000
各个参数的含义:
1.v4l2src device=/dev/video7:
使用 Video4Linux2 (V4L2) 源插件从设备 /dev/video7 获取视频输入。
2.video/x-raw,format=UYVY,width=1920,height=1080,framerate=30/1:
设置视频格式为 UYVY(一种未压缩的YUV格式),分辨率为 1920x1080,帧率为 30fps。
3.videoconvert:
转换视频帧格式以适应后续处理步骤的需求。在这个例子中,它可能用于将 UYVY 格式转换为编码器支持的格式。
4.x264enc tune=zerolatency bitrate=4000 speed-preset=superfast:
使用 x264 编码器对视频进行 H.264 编码。
tune=zerolatency: 优化编码器设置以减少延迟,适用于实时应用。
bitrate=4000: 设置目标比特率为 4000 kbps(即 4 Mbps)。
speed-preset=superfast: 使用快速编码预设,减少编码时间但可能降低压缩效率。
5.rtph264pay config-interval=1 pt=96:
使用 RTP 封装 H.264 视频流。
config-interval=1: 在每个关键帧前插入配置信息。
pt=96: 设置RTP负载类型(Payload Type)为 96。
udpsink host=192.168.X.XX port=5000:
通过 UDP 协议将封装后的视频流发送到指定的 IP 地址 (192.168.X.XX) 和端口 (5000)。
3.本地接收视频流
3.1gst-launch-1.0接收显示
gst-launch-1.0 -v udpsrc port=5000 ! application/x-rtp, media=video, clock-rate=90000, encoding-name=H264 ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! "videoconvert" ! autovideosink sync=false
如果提示缺少h264parse 插件:
sudo apt update
sudo apt install gstreamer1.0-plugins-ugly
sudo apt install gstreamer1.0-plugins-bad
#验证
gst-inspect-1.0 h264parse
#成功输出如下:
Factory Details:
Name: h264parse
Long name: H.264 parser
Class: Codec/Parser
Description: Parses H.264 video streams
...
3.2Opencv接收显示
确认OpenCV 版本是否支持支持 GStreamer:
python3 -c "import cv2; print(cv2.getBuildInformation())" | grep -i gstreamer
python3 cvtest.py
# cvtest.py
import cv2
# 使用 GStreamer pipeline 构建完整接收流程
gst_pipeline = (
'udpsrc port=5000 ! '
'application/x-rtp, media=video, clock-rate=90000, encoding-name=H264 ! '
'rtph264depay ! avdec_h264 ! '
'videoconvert ! appsink'
)
#参数
#udpsrc port:监听本机的 UDP 端口 5000
#application/x-rtp, media=video, clock-rate=90000, encoding-name=H264 ! :设置RTP协议的 caps,指定是 H.264 编码视频
#rtph264depay:解封装 RTP 包中的 H.264 视频
#avdec_h264:使用 FFmpeg 的解码器解码 H.264 视频
videoconvert:转换格式,确保输出为 OpenCV 支持的 RGB/BGR 格式
appsink:OpenCV 可读取的输出终点
cap = cv2.VideoCapture(gst_pipeline, cv2.CAP_GSTREAMER)
if not cap.isOpened():
print("Failed to open UDP stream with GStreamer pipeline.")
else:
while True:
ret, frame = cap.read()
if not ret:
print("Failed to receive frame (EOF or error). Exiting...")
break
cv2.imshow("UDP Stream", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
参考:
配置 Jetson Nano 摄像头使用 GStreamer 传输 RTSP 流到本地_jetson nano rtsp推流-CSDN博客
gst-launch-1.0 测试树莓派摄像头_gst-launch-1.0 v4l2src-CSDN博客
cv2.VideoCapture使用,opencv读取摄像头,视频图像_video = cv2.videocapture-CSDN博客