RTSP 推流 + AI 分析
本节实现 RK1828 NPU 推理 + 检测框叠加(OSD)+ RTSP 推流的完整端到端方案。
视频/图片输入
│
▼
V4L2 / 文件解码 → RGB/BGR
│
├─→ RGA 缩放 (任意分辨率 → 640×360)
│
├─→ RK1828 NPU 推理 (RKNN / YOLOv5s) → 后处理 (NMS + 画框)
│
└─→ OSD 叠加检测框
│
▼
MPP 硬件编码 (H.264)
│
▼
RTSP Server (gst-rtsp-server)
│
▼
网络推送 → VLC / ffplay → PC端实时查看0. 快速开始
一键启动
# 启动 RTSP + AI 分析服务(默认视频文件)
/home/linaro/rtsp-ai/start_ai.sh
# 启动网络摄像头版本
/home/linaro/rtsp-ai/start_ai.sh --camera
# 指定摄像头地址
/home/linaro/rtsp-ai/start_ai.sh --input "rtsp://192.168.1.100:554/stream"
# PC端查看
ffplay -fflags nobuffer -flags low_delay \
rtsp://192.168.49.138:8554/live/ai文件结构
/home/linaro/rtsp-ai/
├── rtsp_ai_server.py # 统一服务程序 ⭐
├── start_ai.sh # 统一启动脚本 ⭐
├── README.md # 本文档
├── RTSP_AI_SUCCESS.md # 成功配置记录
├── install.sh # 安装脚本
├── Makefile # 构建文件
└── yolov5s_config.json # 配置文件输入源选择
| 输入源 | 启动方式 | 适用场景 |
|---|---|---|
| 视频文件 | start_ai.sh | 测试、演示、已有视频文件 |
| 网络摄像头 | start_ai.sh --camera | 实时监控、安防场景 |
| 指定输入 | start_ai.sh --input URL | 自定义输入源 |
1. 依赖安装
sudo apt-get install -y \
gstreamer1.0-rockchip1 \
gstreamer1.0-plugins-good \
gstreamer1.0-plugins-bad \
gstreamer1.0-rtsp \
python3-gst-1.0 \
gir1.2-gst-rtsp-server-1.0 \
libgstrtspserver-1.0-0 \
ffmpeg2. 模型配置
2.1 模型路径
YOLOv5s 模型必须放在 /userdata/models/yolov5s/ 目录:
# 创建目录并复制模型文件
mkdir -p /userdata/models/yolov5s
cp -r /userdata/RK1820_RK1828_AI_SDK/examples/gstreamer/yolov5s/* \
/userdata/models/yolov5s/
# 验证文件
ls -la /userdata/models/yolov5s/预期输出:
-rw-r--r-- 1 linaro linaro 239 config.json
-rw-r--r-- 1 linaro linaro 621 detect_classes.txt
-rw-r--r-- 1 linaro linaro 234K yolov5s.rknn
-rw-r--r-- 1 linaro linaro 8.6M yolov5s.weight2.2 验证插件
gst-inspect-1.0 rknninfer
gst-inspect-1.0 rknnpostprocess
gst-inspect-1.0 rknnosd3. 服务配置
3.1 统一服务程序
/home/linaro/rtsp-ai/rtsp_ai_server.py - 支持多种输入源:
#!/usr/bin/env python3
"""RTSP + AI 分析服务(统一版本)
支持视频文件/网络摄像头 → YOLOv5s检测 → OSD画框 → 硬编码 → RTSP推流
使用方法:
python3 rtsp_ai_server.py # 默认视频文件
python3 rtsp_ai_server.py --camera # 网络摄像头
python3 rtsp_ai_server.py --input rtsp://... # 指定摄像头地址
"""
import gi
gi.require_version('Gst', '1.0')
gi.require_version('GstRtspServer', '1.0')
from gi.repository import Gst, GstRtspServer, GLib
import sys
Gst.init(None)
# 配置路径
CONFIG = "/userdata/models/yolov5s/config.json"
POST_LIB = "/usr/lib/libyolov5spostprocess.so"
DEFAULT_VIDEO = "/userdata/models/Qwen3-VL-2B/rtsp_ai_small.mp4"
# 解析命令行参数
input_source = None
use_camera = False
for i, arg in enumerate(sys.argv[1:], 1):
if arg == '--camera':
use_camera = True
elif arg == '--input' and i + 1 < len(sys.argv):
input_source = sys.argv[i + 1]
server = GstRtspServer.RTSPServer.new()
server.set_service('8554')
factory = GstRtspServer.RTSPMediaFactory.new()
# 根据输入源选择管道
if use_camera or (input_source and input_source.startswith('rtsp://')):
# 网络摄像头模式
camera_rtsp = input_source if input_source else "rtsp://camera_ip:554/stream"
launch = (
f'( rtspsrc location={camera_rtsp} latency=100 ! '
f'rtph264depay ! h264parse ! queue ! '
f'decodebin ! '
f'videoconvert ! videoscale ! '
f'video/x-raw,format=BGR,width=640,height=360,framerate=15/1 ! '
f'queue max-size-buffers=4 ! '
f'rknninfer config-path={CONFIG} use-rknn3=true ! '
f'queue max-size-buffers=4 ! '
f'rknnpostprocess library-path={POST_LIB} config-path={CONFIG} ! '
f'queue max-size-buffers=4 ! '
f'rknnosd ! '
f'videoconvert ! video/x-raw,format=NV12,width=640,height=360 ! '
f'mpph264enc bps=1500000 ! '
f'rtph264pay name=pay0 pt=96 )'
)
source_type = "网络摄像头"
source_info = camera_rtsp
else:
# 视频文件模式
video_file = input_source if input_source else DEFAULT_VIDEO
launch = (
f'( filesrc location="{video_file}" ! '
f'qtdemux ! h264parse ! queue ! decodebin ! '
f'videoconvert ! videoscale ! '
f'video/x-raw,format=BGR,width=640,height=360,framerate=15/1 ! '
f'queue max-size-buffers=4 ! '
f'rknninfer config-path={CONFIG} use-rknn3=true ! '
f'queue max-size-buffers=4 ! '
f'rknnpostprocess library-path={POST_LIB} config-path={CONFIG} ! '
f'queue max-size-buffers=4 ! '
f'rknnosd ! '
f'videoconvert ! video/x-raw,format=NV12,width=640,height=360 ! '
f'mpph264enc bps=1500000 ! '
f'rtph264pay name=pay0 pt=96 )'
)
source_type = "视频文件"
source_info = video_file
factory.set_launch(launch)
factory.set_shared(True)
factory.set_latency(0)
server.get_mount_points().add_factory('/live/ai', factory)
server.attach(None)
print('🤖 RTSP + AI分析服务启动成功')
print(f'📹 输入源: {source_type}')
print(f'📹 输入: {source_info}')
print('🎯 AI: YOLOv5s 目标检测')
print('📹 输出: rtsp://0.0.0.0:8554/live/ai')
print('📹 PC: rtsp://192.168.49.138:8554/live/ai')
print('📹 按Ctrl+C停止服务')
GLib.MainLoop().run()3.2 统一启动脚本
/home/linaro/rtsp-ai/start_ai.sh:
#!/bin/bash
# RTSP + AI 分析服务统一启动脚本
# 支持视频文件和网络摄像头两种输入源
echo "=== RTSP + AI 分析服务启动 ==="
# 停止现有服务
pkill -f "python3.*rtsp_ai_server" 2>/dev/null
sleep 2
# 解析参数(支持 --camera, --input 等)
# ... 启动服务逻辑 ...
echo "✓ 服务运行中"
echo "✓ RTSP地址: rtsp://192.168.49.138:8554/live/ai"3.3 视频文件分析测试
测试视频输入:

分析输出结果:

4. 视频预处理(可选)
如果原始视频太大,建议预处理:
# 裁剪并压缩视频
ffmpeg -i input.mp4 \
-t 10 \
-vf scale=640:360 \
-c:v libx264 -preset fast -crf 23 \
-c:a aac -b:a 128k \
output.mp4参数说明:
-t 10:只取前10秒scale=640:360:缩小分辨率降低NPU负载-crf 23:控制质量(18-28,越小质量越好)
5. 使用网络摄像头
5.1 启动网络摄像头模式
# 方法1:交互式输入(推荐)
/home/linaro/rtsp-ai/start_ai.sh --camera
# 按提示输入摄像头地址,如:rtsp://192.168.1.100:554/stream
# 方法2:命令行指定
/home/linaro/rtsp-ai/start_ai.sh --input "rtsp://192.168.1.100:554/stream"
# 方法3:直接运行Python脚本
python3 /home/linaro/rtsp-ai/rtsp_ai_server.py --input "rtsp://camera_ip:554/stream"5.2 常见摄像头RTSP地址
| 摄像头品牌 | RTSP地址格式 |
|---|---|
| 海康威视 | rtsp://user:pass@ip:554/Streaming/Channels/101 (主码流) 或 102 (子码流) |
| 大华 | rtsp://user:pass@ip:554/cam/realmonitor |
| 通用 | rtsp://ip:554/stream |
| 本地RTSP源 | rtsp://localhost:8554/stream |
5.3 网络摄像头分析测试
网络摄像头输入测试:

网络摄像头分析输出结果:

5.4 网络协议建议
某些摄像头品牌(如海康威视)在网络不稳定时,建议在代码中添加 protocols=tcp 参数以提高连接稳定性。如果连接不稳定,可以修改 rtsp_ai_server.py 中的网络摄像头管道配置。
6. 客户端查看
6.1 ffplay(推荐)
ffplay -fflags nobuffer -flags low_delay \
rtsp://192.168.49.138:8554/live/ai6.2 VLC
- 打开 VLC
- 媒体 → 打开网络串流
- 输入:
rtsp://192.168.49.138:8554/live/ai - 点击播放
6.3 流信息查询
ffprobe -v error -rtsp_transport tcp \
-show_entries stream=codec_name,width,height,r_frame_rate \
-of default=nw=1 rtsp://192.168.49.138:8554/live/ai7. 故障排查
| 现象 | 原因 | 解决方案 |
|---|---|---|
| 无检测框 | 模型路径错误 | 检查 /userdata/models/yolov5s/ 是否存在 |
| 服务启动失败 | 配置文件错误 | 查看 cat /tmp/rtsp_ai.log |
| 无法连接 | 网络不通 | ping 192.168.49.138 |
| VLC打不开 | 不在同一网段 | 确认PC和板子IP在同一网段 |
7.1 快速验证命令
# 验证RTSP推流是否正常
ffprobe -v quiet -rtsp_transport tcp \
-show_entries stream=codec_name,width,height,r_frame_rate \
"rtsp://192.168.49.138:8554/live/ai"
# 预期输出应显示H.264编解码和640×360分辨率
# 示例输出:
# [STREAM]
# codec_name=h264
# width=640
# height=360
# r_frame_rate=51/28. 技术要点
AI管道流程
filesrc → qtdemux → h264parse → decodebin →
videoconvert → videoscale → (BGR 640×360 15fps) →
rknninfer → rknnpostprocess → rknnosd →
videoconvert → (NV12) → mpph264enc → rtph264pay关键参数
| 参数 | 值 | 说明 |
|---|---|---|
| 分辨率 | 640×360 | 降低NPU负载 |
| 帧率 | 15fps | 平衡性能与流畅度 |
| 码率 | 1.5Mbps | 保证传输质量 |
| 模型 | YOLOv5s | 80类COCO检测 |
| 置信度阈值 | 0.45 | 可调整 |
NPU设备
- 设备节点:
/dev/dri/renderD128 - PCIe地址:
0004:41:00.0 - 算力:20 TOPS (INT8)
