# rtsp-server **Repository Path**: volara/rtsp-server ## Basic Information - **Project Name**: rtsp-server - **Description**: 海康摄像头AI推理后,零延迟的 AI 视频流 RTSP 服务器 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 87 - **Forks**: 26 - **Created**: 2026-01-10 - **Last Updated**: 2026-01-28 ## Categories & Tags **Categories**: multimedia **Tags**: None ## README # 🚀 RTSP Server - 近乎零延迟的 AI 视频流服务器 **中文** | [English](README_EN.md) > **告别卡顿!告别延迟!** 让你的 AI 检测画面像本地预览一样流畅! ![效果演示](docs/rtsp服务器0延迟效果.gif) ## 💡 项目由来 > 做 AI 安防项目时,我遇到了一个让人抓狂的问题:**AI 检测画面延迟太高了!** 传统方案是把 AI 推理后的视频流以 RTMP 推送给 ZLMediaKit,再转 WebRTC 播放。但无论怎么调参数,延迟始终在 2-5 秒徘徊。人都走出画面了,报警才姗姗来迟,这在安防场景简直是灾难。 我尝试了各种方法,都无法突破这个瓶颈。 直到有一天,我突然想到:**ZLMediaKit 天生支持 WebRTC,而且我之前用 RTSP 连接摄像头时,ZLM 的 WebRTC 播放是实时的!** 那么问题来了:**如果我把 AI 推理后的视频流也封装成 RTSP 流,让 ZLM 以拉流的方式来获取,是不是就能实现近乎零延迟?** 说干就干!我基于 live555 编写了这个 RTSP 服务器,配合 NVENC 硬件编码,最终实现了 **50-100ms** 的端到端延迟。 **从 2-5 秒到 50-100ms,这不是优化,这是质变!** --- ## 🎯 为什么需要它? 你是否遇到过这些问题: - 😤 AI 检测画面延迟 3-5 秒,人都走出画面了才报警 - 😤 RTMP 推流卡顿,WebRTC 播放体验极差 - 😤 想要实时预览 AI 推理结果,却总是慢半拍 **这个项目就是为了解决这些痛点!** ### ⚡ 延迟对比:天壤之别 | 方案 | 延迟 | 体验 | |------|------|------| | 传统 RTMP 推流 | **2-5 秒** | 😫 人都走了才看到 | | **本方案 RTSP Server** | **50-100ms** | 🚀 几乎实时同步! | ``` 传统方案:AI程序 → RTMP推流 → ZLM → WebRTC 延迟 2-5秒 ❌ 慢到怀疑人生 本方案: AI程序 → RTSP服务器 → ZLM拉流 → WebRTC 延迟 50-100ms ✅ 丝滑如德芙 ``` ### 🔥 核心技术 - **NVENC 硬件编码** - NVIDIA GPU 加速,编码延迟 **<5ms**,比眨眼还快 - **单帧缓冲** - 不堆积、不等待,来一帧编一帧 - **ZLM 主动拉流** - 告别推流缓冲区的噩梦 ## ✨ 特性一览 | 特性 | 说明 | |------|------| | 🎮 **NVENC 硬件编码** | NVIDIA GPU 加速,编码延迟 <5ms | | ⚡ **极致低延迟** | 单帧缓冲,来一帧编一帧 | | 🔗 **ZLM 自动注册** | 启动即可 WebRTC 播放,无需手动配置 | | 📹 **多摄像头支持** | 每路视频独立实例,轻松扩展 | | 🐍 **多语言支持** | C++ 库 + Python 绑定,随你选择 | | 🔄 **断线重连** | 网络抖动?自动恢复! | --- ## 🏗️ 架构 ``` ┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ 摄像头/视频 │────>│ AI 推理程序 │────>│ RTSP Server │────>│ ZLMediaKit │ │ │ │ (检测+画框) │ │ (NVENC编码) │ │ (WebRTC转发) │ └─────────────────┘ └──────────────────┘ └─────────────────┘ └─────────────────┘ │ │ │ │ pushFrame() │ ZLM 主动拉流 │ WebRTC ▼ ▼ ▼ cv::Mat (BGR) rtsp://localhost:8554 浏览器播放 ``` ### 📸 效果展示:原始视频流 vs AI 视频流 ![零延迟效果演示](docs/rtsp服务器0延迟效果.gif) ![原始视频流与AI视频流对比](docs/原始视频流与AI视频流对比.png) > 左边是摄像头原始画面,右边是 AI 检测后的画面,两者几乎同步! ### 为什么延迟更低? | 对比项 | RTSP 服务器模式 | RTMP 推流模式 | |--------|----------------|---------------| | 数据流向 | ZLM **主动拉取** | AI程序 **主动推送** | | 缓冲策略 | 单帧缓冲 | 多帧缓冲 | | 编码模式 | NVENC 零延迟 | 标准编码 | | **端到端延迟** | **50-100ms** ✅ | **2-5秒** ❌ | --- ## 🚀 快速开始 ### 1. 编译 ```batch cd rtsp_server build.bat ``` ### 2. 运行 ```batch RTSPServer.exe rtsp://admin:password@192.168.1.64:554/stream --zlm-secret 你的密钥 ``` ### 3. 播放 ``` http://localhost:8088/index/api/webrtc?app=live&stream=ai_stream ``` --- ## 🔧 集成到你的 AI 项目 ### C++ 集成 ```cpp #include "RTSPServer.h" RTSPServerWrapper server; server.init(8554, "ai_stream", 704, 576, 25); server.start(); while (running) { cv::Mat frame = camera.read(); auto results = yolo.detect(frame); drawBoxes(frame, results); server.pushFrame(frame); // 就这一行! } server.stop(); ``` ### Python 集成 ```python import rtsp_server server = rtsp_server.RTSPServer(8554, "ai_stream", 704, 576, 25) server.start() while True: frame = cap.read() results = yolo.detect(frame) frame = draw_boxes(frame, results) server.push_frame(frame) # 就这一行! server.stop() ``` #### Python 绑定编译 ```batch cd rtsp_server/python pip install pybind11 numpy build_python.bat ``` 编译成功后生成 `rtsp_server.pyd`,放到你的 Python 项目目录即可使用。 --- ## 📹 多摄像头支持 每个摄像头创建独立的 RTSP Server 实例,使用不同端口或流名: ```cpp // 方式1:不同端口 RTSPServerWrapper server1, server2; server1.init(8554, "camera1", 704, 576, 25); // rtsp://localhost:8554/camera1 server2.init(8555, "camera2", 704, 576, 25); // rtsp://localhost:8555/camera2 // 方式2:同端口不同流名(推荐) server1.init(8554, "camera1", 704, 576, 25); // rtsp://localhost:8554/camera1 server2.init(8554, "camera2", 704, 576, 25); // rtsp://localhost:8554/camera2 ``` Python 同理: ```python server1 = rtsp_server.RTSPServer(8554, "camera1", 704, 576, 25) server2 = rtsp_server.RTSPServer(8554, "camera2", 704, 576, 25) ``` --- ## 📖 命令行参数 ``` RTSPServer.exe <视频源> [选项] 选项: --port <端口> RTSP 端口 (默认: 8554) --stream <名称> 流名称 (默认: ai_stream) --zlm-host <地址> ZLM 地址 (默认: localhost) --zlm-port <端口> ZLM HTTP 端口 (默认: 8088) --zlm-secret <密钥> ZLM API 密钥 --no-zlm 禁用 ZLM 自动注册 --no-display 禁用窗口显示 ``` --- ## ⚡ 性能指标 | 指标 | 数值 | |------|------| | 编码延迟 | <5ms (NVENC) | | 端到端延迟 | 50-100ms | | 支持分辨率 | 最高 4K | | 默认码率 | 4Mbps | | 缓冲队列 | 1帧 | --- ## 📁 目录结构 ``` rtsp_server/ ├── RTSPServer.h/.cpp # 核心库 ├── example_main.cpp # 独立程序 ├── build.bat # 编译脚本 ├── README.md # 中文文档(默认) ├── README_EN.md # English documentation ├── python/ # Python 绑定 │ ├── rtsp_server_pybind.cpp │ ├── build_python.bat │ └── example.py └── 3rdparty/live555/ # live555 依赖 ``` --- ## 🐛 常见问题 ### ZLM 拉流失败 1. 确保 ZLMediaKit 已启动 2. 检查 RTSP Server 是否正常运行(日志显示 `RTSP server running`) 3. 用 VLC 测试:`vlc rtsp://localhost:8554/ai_stream` ### NVENC 不可用 程序会自动切换到 x264 软件编码,日志会显示 `falling back to software encoder`。延迟会稍高但仍可正常工作。 ### 画面卡顿 1. 检查摄像头网络是否稳定 2. 降低分辨率或帧率 3. 确保 GPU 没有被其他程序占满 ### Python 导入失败 1. 确保 `rtsp_server.pyd` 在当前目录或 Python 路径中 2. 安装依赖:`pip install numpy opencv-python` 3. 确保 Python 版本与编译时一致(如都是 3.10) --- ## 📋 系统要求 - Windows 10/11 - Visual Studio 2022 - CMake 3.15+ - vcpkg: `opencv4`, `glog`, `ffmpeg` - NVIDIA GPU (可选,用于 NVENC 硬件编码) - ZLMediaKit (用于 WebRTC 转发) --- ## 📄 开源协议 - live555 - LGPL - FFmpeg - LGPL/GPL - OpenCV - Apache 2.0 --- ## 🙏 致谢 - **[ZLMediaKit](https://github.com/ZLMediaKit/ZLMediaKit)** - 夏楚大佬开源的流媒体服务器,WebRTC 支持非常优秀,是本项目能实现低延迟的关键 - **[live555](http://www.live555.com/)** - 经典的 RTSP/RTP 开源库,本项目的 RTSP 服务器基于此构建 - **[FFmpeg](https://ffmpeg.org/)** - 强大的音视频处理库,提供 NVENC 硬件编码支持 --- ## 👨‍💻 作者 **夏别** - 一个热爱折腾的开发者 如果这个项目对你有帮助,欢迎 Star ⭐ 和 Fork! 有问题或建议?欢迎提 Issue! 希望这个项目能: - 🎯 推动 AI 安防场景的实时性体验 - 🎯 为有类似需求的开发者提供参考 - 🎯 填补开源 RTSP 服务器在 AI 视频流场景的空白 --- **⭐ 如果有帮助,请 Star!**