AGX Xavier 搭建360环视教程【一、先确认方案】

设备默认自带 NVIDIA 硬件编解码 能力(NVDEC /NVENC ),但是需要你在 OpenCVFFmpeg 里正确启用 + 调通 GStreamernvmpi,才真正能用起来!

这里的硬解码是核心:

Jetson 平台的硬解码,要么走 GStreamer(nvv4l2)要么走 RidgeRun 的 nvmpi(FFmpeg 插件),否则就只能 CPU 软解。

推荐的技术路线(实战稳定)

【1】 RTSP → GPU 硬解(输入)

选项 1:GStreamer nvv4l2(官方推荐)

复制代码
gst-launch-1.0 rtspsrc location=rtsp://... ! rtph264depay ! h264parse ! nvv4l2decoder ! nvvidconv ! appsink

然后在 OpenCV 中用

复制代码
 cv::VideoCapture("your_pipeline", cv::CAP_GSTREAMER)

直接拿到。

选项 2:FFmpeg + nvmpi

如果GStreamer 用不了(极少数),就自己编 nvmpi + FFmpeg。


【2】 remap + 拼接(处理)

  • 保留 OpenCV remap

  • 若想用 GPU 做 remap ,需要用OpenCV CUDA 模块cv::cuda::remap),

    但要编译时 WITH_CUDA=ONWITH_CUBLAS=ON


【3】 拼接后 → RTSP 推流(输出)

✅ 用 FFmpeg 的 libx264(CPU 编码) → ffmpeg -f rawvideo -pix_fmt bgr24 -i pipe:0 ...

✅ 用 GStreamer**nvvidconv + nvv4l2h264enc**(GPU 编码)→ RTSP server


⚡ 必须重装的组件

1️⃣ OpenCV 必须重新编译

复制代码
cmake \
-D CMAKE_BUILD_TYPE=Release \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D WITH_CUDA=ON \
-D WITH_CUDNN=ON \
-D WITH_GSTREAMER=ON \
-D WITH_TBB=ON \
-D WITH_OPENGL=ON \
-D BUILD_opencv_python2=OFF \
-D BUILD_opencv_python3=ON \
-D BUILD_TESTS=OFF \
-D BUILD_EXAMPLES=OFF \
..

🚩 一定要确认 WITH_GSTREAMER=ONWITH_CUDA=ON

2️⃣ FFmpeg(可选)

如果你走 nvmpi 路线,要重新编译 FFmpeg:

复制代码
./configure --enable-nonfree --enable-nvmpi --enable-shared ...

🎯 推荐实战路线(总结)

✅ 1)输入 → GStreamer(nvv4l2)GPU 硬解 → OpenCV VideoCapture

✅ 2)处理 → OpenCV CUDA(可选)做 remap → 拼接

✅ 3)输出 → 用 FFmpeg/GStreamer nvv4l2h264enc 硬编码 → rtsp-simple-servermediamtx


🚦 一句话:

Jetson NX 在 JetPack 4.5 下,最稳的组合就是:GStreamer 负责硬解码 + 硬编码,OpenCV 只做逻辑,不做解码/编码。



ffmpeg编译安装时容易碰到问题。

✅ 1️⃣ 「解码 → 畸变矫正 → 拼接」阶段

这个阶段:

  • GStreamer + nvv4l2decoder:GPU 硬解码

  • OpenCV CUDA remap:GPU 做 map1/map2 畸变矫正

  • OpenCV 拼接、叠车图、组合画面

这一步,确实是纯 GStreamer + OpenCV CUDA,不需要 FFmpeg 来 解码


✅ 2️⃣ 「结果视频流 → 通过 RTSP 发布」阶段

这里就有 2 种常见选择:

  • 选项 A:用 FFmpeg(popen)把拼接后图像写到 stdin,然后推给 RTSP 服务端

    • 简单粗暴,依赖 FFmpeg 做推流 mux+encode

    • 已经在你的 main.cpp 里用了

    • 优点:最容易落地,FFmpeg 支持推 RTSP、RTMP 都稳

    • 缺点:FFmpeg 在 Jetson 上如果没启用硬编(nvenc),那还是 CPU 做 H.264 编码

  • 选项 B:全链路用 GStreamer 推流

    • GStreamer 可以用 appsrc 把你 CPU/GPU 的拼接帧丢回管道,然后 nvvidconv + nvv4l2h264enc 做 GPU 编码,rtspclientsink 或 rtpbin/udpsink 做流化。

    • 优点 :全流程硬编(nvv4l2h264enc),CPU 压力最低

    • 缺点 :写 C++ GStreamer appsrc 需要自己维护 GstPipelineGstAppSrc、buffer push,写起来比 popen(ffmpeg) 要麻烦不少,且需要调试好 RTSP session


所以:

  • 之前说 「不用 FFmpeg」 是指:「解码阶段不用 FFmpeg」,因为 GStreamer 已经硬解码了。

  • 如果要纯 GStreamer 全链路 ,就要把 FFmpeg popen 部分换成 GStreamer 的 appsrc + nvv4l2h264enc + rtspclientsink



✅ 1️⃣ 【方案 A】直接用 GStreamer 拉取 RTSP + nvv4l2decoder

流程

复制代码

scss

复制编辑

(海康摄像头 RTSP) → GStreamer → rtspsrc → rtph264depay → nvv4l2decoder → CUDA Mat

  • RTSP 协议是海康自带的。

  • GStreamer 自带 rtspsrc 可以直接拉流。

  • Jetson 的 nvv4l2decoder 是最成熟的硬件解码插件,稳定高效。

  • 后续直接转成 cv::cuda::GpuMat 处理 remap,拼接也走 CUDA。

优点

  • 简单、干净,完全不依赖厂商 SDK(HCNetSDK)

  • 全硬件解码,零 CPU 开销

  • 最好调试,最多人用,资料多

  • 维护成本低

缺点

  • 需要网络 RTSP 稳定(丢包要注意)

  • 如果摄像头不是 RTSP 输出,而是专有协议,则必须 SDK


✅ 2️⃣ 【方案 B】海康 SDK (HCNetSDK)+ PlayM4 软解码

流程

复制代码

scss

复制编辑

(海康摄像头) → HCNetSDK → PlayM4 → YUV → OpenCV

  • 走海康私有协议(比如海康的 PS 流、专用登录等)。

  • PlayM4 一般只能软解码(除非用自研插件配合硬解码)。

  • 你要自己维护多路 SDK 线程、缓冲、丢帧逻辑。

优点

  • 如果 RTSP 不稳定(比如公网)、或者要高级控制(云台、录像调度),必须用 SDK。

  • 一些场景下比纯 RTSP 更可控。

缺点

  • PlayM4 不支持硬解码,CPU 压力大。

  • 要自己拼接 OpenCV 流程。

  • 移植麻烦,Jetson 也没专门的 ARM64 优化。

  • 不支持 GStreamer pipeline。


✅ 3️⃣ 【方案 C】工业场景高阶方案:ONVIF 或 RTSP + 边缘推流器

还有人会:

  • 在相机侧用边缘设备先拉流 → 本地转码(GStreamer/FFmpeg)→ 统一推给 RTSP 服务端 → Jetson 从统一 RTSP 拉。

  • 这样可以做转码(例如把所有流转成相同分辨率/码率),稳定性最好。


✅ 4️⃣ 【最佳实践:实际生产怎么选?】

1️⃣ 若摄像头支持 RTSP(海康都支持) → 优先选 GStreamer + rtspsrc + nvv4l2decoder

2️⃣ 若要跨公网 + 要登录控制 + 云台 + 录像 → 用海康 SDK 但只能软解(除非自己改)

3️⃣ 若要极致可控 → 相机接入侧加推流器(或者 NVR 先做聚合)


🔑 结论

环视、低延时、单机 Jetson:一定优先直接 RTSP + GStreamer + nvv4l2decoder!

  • 最少依赖,最少功耗,GPU 干活,CPU 只拼接。

  • SDK 只在需要云台控制或特殊功能时使用。

✅ 【GStreamer 多路 RTSP 拉流 + nvv4l2decoder 硬解码 → CUDA remap → 拼接 → appsrc 回推 RTSP】的 全套 Jetson 版 C++。

相关推荐
小坏坏的大世界2 小时前
ROS2中的QoS(Quality of Service)详解
linux·机器人
贾全4 小时前
从LLM到VLM:视觉语言模型的核心技术与Python实现
人工智能·python·ai·机器人·视觉语言模型·vlm
pk_xz1234565 小时前
在Intel Mac的PyCharm中设置‘add bin folder to the path‘的解决方案
ide·人工智能·科技·算法·macos·pycharm·机器人
向左转, 向右走ˉ5 小时前
目标检测中的NMS算法详解
pytorch·python·深度学习·算法·目标检测
SoaringPigeon5 小时前
端到端自动驾驶:挑战与前沿
人工智能·机器学习·自动驾驶
阿里云大数据AI技术7 小时前
基于MaxCompute MaxFrame 汽车自动驾驶数据预处理最佳实践
大数据·人工智能·自动驾驶
源之缘-OFD先行者8 小时前
基于YOLOv11的无人机目标检测实战(Windows环境)
人工智能·yolo·目标检测
蹦蹦跳跳真可爱5898 小时前
Python----目标检测(使用YOLOV8网络训练人脸)
人工智能·python·yolo·目标检测
搬砖的小码农_Sky1 天前
AI:机器人行业发展现状
人工智能·机器人