DeepStream Multi-Stream Video Analytics on NG4500
NeoEdge NG4500(Jetson Orin)上的多路 RTSP 视频分析——单台可同时处理 2–32 路相机,硬解码 + 推理 + 跟踪,产出业务事件并重发布标注 RTSP 流。
1. 方案概述
deepstream 扩展封装了 NVIDIA DeepStream 7.1 SDK(基于 GStreamer 的视频分析流水线),在 Jetson 上提供多路 RTSP 推理。典型部署形态:NeoMind 在 Mac/PC,sidecar 在 NG4500,通过 TCP 远程桥接。
核心能力:
- 多路 RTSP:单台 Jetson Orin NX 8G 可并发 2–32 路 720p/1080p。
- 硬件流水线:NVDEC → TensorRT → 跟踪(NvDCF/NvSORT)→ nvdsanalytics → OSD → NVENC,零拷贝。
- 业务分析:越线、区域入侵、双向计数、停留时长。
- 标注输出:带检测框 / 跟踪 ID / 分析叠加的 RTSP 流,浏览器可看的 MJPEG 缩略图与 JPEG 截图。
- 事件驱动:Detection / LineCross / ROIIntrusion / AnalyticsSnapshot 推送到 NeoMind EventBus,可触发仪表板与自动化。
数据流向:
效果演示(多路 RTSP 实时推理 + 跟踪 + 业务事件叠加):
2. 物料清单(BOM)
| 物料 | 规格 | 用途 | 必需 |
|---|---|---|---|
| NeoMind 平台 | v0.8.0+ | 运行在 Mac/PC,托管扩展 | ✅ |
| deepstream 扩展 | v2.8.0+ | 远程桥接 + 事件路由 | ✅ |
| NG4500 | Jetson Orin NX/Nano/AGX,JetPack 6.x,DeepStream 7.1 | 跑 DeepStream sidecar | ✅ |
| RTSP 相机 | 2–32 路 720p/1080p | 视频源 | ✅ |
| 网络 | NeoMind 与 NG4500 可互通(TCP 9556 等) | 远程桥接 | ✅ |
3. 部署 DeepStream 运行环境(NG4500)
deepstream 扩展的 Python sidecar 只能在 Jetson 上运行(DeepStream SDK 仅 Jetson 可用)。下面在 NG4500 上从零部署一次,分六步。DeepStream SDK 本体的安装细节见 NG4500 DeepStream 指南,扩展自带最全步骤见 INSTALL.md。
全程在 NG4500 上以普通用户操作;Docker 命令依赖
nvidia-container-runtime(JetPack 自带)。
3.1 核对系统环境
| 项目 | 要求 | 核对命令 |
|---|---|---|
| JetPack / L4T | R36.4.3(JetPack 6.1 GA) | cat /etc/nv_tegra_release |
| 内核 | 5.15.x-tegra | uname -r |
| 可用磁盘 | ≥ 20 GB | df -h /var/lib |
| 内存 | ≥ 8 GB(验证于 Orin NX 8GB) | free -h |
3.2 安装 DeepStream SDK 7.1
推荐用官方 Debian 包(最省事)。先装依赖:
sudo apt update
sudo apt install -y libssl1.1 libgstreamer1.0-0 gstreamer1.0-tools \
gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly \
gstreamer1.0-libav libgstrtspserver-1.0-0 libjansson4 libyaml-cpp-dev
从 NGC 下载 deepstream-7.1_7.1.0-1_arm64.deb 后安装:
sudo apt-get install ./deepstream-7.1_7.1.0-1_arm64.deb
sudo ldconfig
验证:
deepstream-app --version-all
# deepstream-app version 7.1.0 / DeepStreamSDK 7.1.0 / CUDA 12.6 / TensorRT 10.3
tar 包、SDK Manager 等其它安装方式见 NG4500 DeepStream 指南第 3 节。
3.3 配置 Docker
Orin NX 内核有两个坑必须先处理,否则容器会无限重试或网络不通。
① 存储驱动改 vfs——内核 overlayfs 处理容器内 whiteout 文件会失败,导致 Docker 反复重试塞满磁盘:
sudo tee /etc/docker/daemon.json <<'EOF'
{
"storage-driver": "vfs",
"default-runtime": "nvidia",
"runtimes": {
"nvidia": { "path": "nvidia-container-runtime", "runtimeArgs": [] }
}
}
EOF
sudo systemctl restart docker
② 全部用 --network=host——内核缺少 iptable_raw 模块,Docker 桥接网络不可用;本文所有 docker run 都走 host 网络。
③ 登录 NGC(拉基础镜像要用)。在 NGC 建 API Key 后:
echo "$YOUR_NGC_KEY" | docker login nvcr.io -u '$oauthtoken' --password-stdin
$oauthtoken是字面量,必须带$且用单引号防 shell 展开。vfs不做层去重,定期docker image prune -f清理。
3.4 构建 sidecar 镜像 ds:7.1-pyds-gi
拉 Jetson 专用基础镜像(不要用 :7.1 数据中心版,缺 Jetson 库):
docker pull nvcr.io/nvidia/deepstream:7.1-samples-multiarch
docker tag nvcr.io/nvidia/deepstream:7.1-samples-multiarch ds:7.1-base
准备 pyds 1.2.0 wheel(对应 DS 7.1 / Python 3.10):
wget https://github.com/NVIDIA-AI-IOT/deepstream_python_apps/releases/download/v1.2.0/pyds-1.2.0-cp310-cp310-linux_aarch64.whl
# 若文件名只有一次 cp310(NGC 直下常见),补成两次 ABI 标签,否则 pip 按 PEP 427 拒收:
# cp pyds-1.2.0-cp310-linux_aarch64.whl pyds-1.2.0-cp310-cp310-linux_aarch64.whl
在同目录放 Dockerfile.sidecar(在 pyds 之上叠 Python GI 绑定):
FROM nvcr.io/nvidia/deepstream:7.1-samples-multiarch
RUN apt-get update && apt-get install -y --no-install-recommends \
python3-gi python3-gst-1.0 libpython3.10 python3-pip \
&& rm -rf /var/lib/apt/lists/*
COPY pyds-1.2.0-cp310-cp310-linux_aarch64.whl /tmp/
RUN pip3 install --no-cache-dir /tmp/pyds-1.2.0-cp310-cp310-linux_aarch64.whl \
&& rm /tmp/*.whl
WORKDIR /srv/sidecar
构建并验证 pyds 可加载:
docker build --network=host -t ds:7.1-pyds-gi -f Dockerfile.sidecar .
docker run --rm --runtime=nvidia --network=host ds:7.1-pyds-gi \
python3 -c "import pyds; print('pyds', pyds.__version__)"
3.5 预构建 TensorRT FP16 引擎
Orin NX 8GB 上让
nvinfer启动时现编 INT8 引擎会在 tactic 选择阶段 OOM;务必事先用trtexec编出 FP16 引擎,运行时只反序列化。
mkdir -p ~/ds-engines
docker run --rm --runtime=nvidia --network=host \
-v ~/ds-engines:/engines ds:7.1-pyds-gi \
trtexec \
--onnx=/opt/nvidia/deepstream/deepstream/samples/models/Primary_Detector/resnet18_trafficcamnet_pruned.onnx \
--saveEngine=/engines/trafficcam_fp16.engine \
--fp16 --memPoolSize=workspace:1024
约 3 秒生成 ~4 MB 引擎。TensorRT 10.3+ 已弃用 --workspace,用 --memPoolSize。
trtexec默认batch-size=1;sidecar 的pipeline_builder.py强制 nvinferbatch-size=1对齐。自定义配置务必保持 batch 一致,否则 nvinfer 触发重编又掉回 OOM。
3.6 准备 RTSP 测试源(mediamtx + ffmpeg)
无真实相机时,用样例视频循环推 RTSP 测试。装 mediamtx(ARM64v8,从 releases 下载):
tar xf mediamtx_v*.linux_arm64v8.tar.gz
./mediamtx & # 监听 8554
推 4 路测试流:
for i in 1 2 3 4; do
ffmpeg -re -stream_loop -1 -i sample.mp4 -c copy \
-f rtsp rtsp://localhost:8554/in/stream$i &
done
RTSP 必须走 TCP(
protocols=tcp)。UDP 会因内核multiudpsink无法解析 IPv6 的 localhost 而报Invalid address family (got 10)失败。
4. 在 NG4500 上启动 sidecar
NG4500 上需常驻四个服务:
| 服务 | 端口 | 作用 |
|---|---|---|
mediamtx | 8554 (RTSP) | RTSP 中继,接收输入流与 DeepStream 标注输出,向客户端分发 |
ffmpeg 测试源 | — | 把样例视频循环推成 RTSP(测试用;正式换成真实相机 URL) |
mjpeg_server.py | 8090 (HTTP) | 把 RTSP 输出转 MJPEG,供浏览器缩略图预览 |
sidecar_bridge.py | 9556 (TCP) | NeoMind 与 Docker sidecar 之间的桥接守护 |