NVIDIA Orin 配置摄像头使用GStreamer 传输视频流到本地

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博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值