什么是RTSP?

RTSP 全称 Real-Time Streaming Protocol(实时流传输协议),是应用层的 流媒体控制协议。

它本身 不传输数据,而是负责 建立和控制流媒体会话(比如播放、暂停、快进)。

真正的音视频数据一般通过 RTP(Real-time Transport Protocol) 传输,RTCP(RTP Control Protocol)用于质量反馈和同步。

RTSP 的作用

类似“远程遥控器”,可以告诉流媒体服务器:

  • SETUP:建立传输会话
  • PLAY:开始播放流
  • PAUSE:暂停播放
  • TEARDOWN:结束会话
  • DESCRIBE:获取媒体描述信息(通常是 SDP 格式)

常见应用场景

网络摄像头/监控:IP 摄像机通常提供一个 RTSP 地址,客户端通过拉流获取实时视频。

点播/直播系统:流媒体服务器(如 Wowza、SRS、MediaMTX)可用 RTSP 作为接入协议。

视频分析/AI 识别:实时从摄像机拉取视频帧,送入检测/识别算法。

拉流的常见实现方式(库与工具)

OpenCV(cv2.VideoCapture):最简单,适合快速开发与原型。优点:易用;缺点:对 rtsp 参数/缓冲控制不细,性能/稳定性受后端(FFmpeg)编译选项影响。

FFmpeg / ffplay / libav / PyAV:最常用的工程工具,支持细粒度参数调优、硬件加速、转码、转封装。

GStreamer:用于低延迟流水线、灵活的插件化处理(rtspsrc、rtp…depay、appsink),非常适合把拉流与推理组件(appsink -> 应用)连接。
gstreamer.freedesktop.org

专用服务器 / 桥接工具:如 Ant Media、Janus、webrtc-streamer、SRS、MediaMTX 等,常用于把 RTSP 转 WebRTC/RTMP 或做分发/转码。若需要把摄像头推到浏览器,通常会用这些网关将 RTSP 转为 WebRTC。

典型拉流命令与代码片段(实用示例)

OpenCV (Python)

import cv2

rtsp_url = “rtsp://user:pass@192.168.1.10:554/stream”
cap = cv2.VideoCapture(rtsp_url, cv2.CAP_FFMPEG) # 强制用 FFmpeg 后端(如果可用)
# 有些后端支持设置缓冲:cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)

while True:
ret, frame = cap.read()
if not ret:
break
# 这里做预处理 -> 推理 -> 后处理
cv2.imshow(‘frame’, frame)
if cv2.waitKey(1) & 0xFF == ord(‘q’):
break

cap.release()
cv2.destroyAllWindows()

FFmpeg(降低客户端缓冲的常用选项)

把 RTSP 解码为原始帧并输出到 stdout(示例 — 适合接 pipe 给后端程序):

ffmpeg -rtsp_transport tcp -i “rtsp://user:pass@cam” \
-fflags nobuffer -flags low_delay -probesize 32 -analyzeduration 0 \
-f rawvideo -pix_fmt bgr24 –

-fflags nobuffer、-flags low_delay 等能显著减少播放器/客户端的缓冲,但可能丢帧(适用于对延迟要求严的识别场景)。相关用法在文献和测试里经常采用。

GStreamer(把 RTSP 拉入应用的典型 pipeline)

gst-launch-1.0 rtspsrc location=rtsp://user:pass@cam latency=100 protocols=tcp \
! rtph264depay ! h264parse ! avdec_h264 \
! videoconvert ! videoscale \
! appsink name=appsink max-buffers=1 drop=true sync=false

关键点:appsink max-buffers=1 drop=true 帮助降缓冲、丢旧帧优先保证实时性;latency/rtpjitterbuffer 可调。
gstreamer.freedesktop.org

实时识别(Video Analytics)流水线拆解

典型 pipeline:

拉流(RTSP) → 2. 解码(软件/硬件) → 3. 帧提取/预处理(resize/crop/normalize) → 4. 推理(检测/识别/分类/分割) → 5. 跟踪(跟踪器减少检测频率) → 6. 告警/记录/下游处理

工程化要点:

帧率策略:不一定对每帧都推理。常见做法是“检测频率降低 + 跟踪填帧”(e.g., 每 5 帧检测一次,用 SORT/DeepSORT 在中间帧做跟踪),可以大幅降低推理成本。

预处理靠近解码:尽量在解码器输出(CPU 或 GPU 内存)就做 resize/crop,避免多次内存拷贝(zero-copy)。

硬件解码:对大量相机同时识别,建议使用 GPU/NVDEC 等硬件解码以节省 CPU 并提高并发能力(后面有专门说明)。
NVIDIA Docs

推理加速:用 ONNXRuntime / TensorRT / OpenVINO / TFLite,对模型做量化、剪枝、batching 和流水线(producer-consumer)设计。

低延迟 & 稳定性的工程技巧(最关键的那些)

选择传输模式:RTSP over UDP = 低延迟但可能丢包;RTSP over TCP(interleaved)更可靠,穿透 NAT/防火墙更稳,但在丢包/延迟剧烈时会产生抖动/重传延迟。

减小客户端缓冲:-fflags nobuffer、-flags low_delay、probesize/analyzeduration、GStreamer 的 latency、appsink max-buffers=1 drop=true 等。注意:越小的缓冲越容易丢帧。
VTT’s Research Information Portal
gstreamer.freedesktop.org

硬件解码 NVDEC:使用 GPU 硬件解码能把解码负载从 CPU 卸载,支持“远高于实时”的解码速度,适合并行处理多路摄像头(但具体每卡同时解码的视频数量受卡型号/码率/分辨率限制)。对实现高并发非常有帮助。
NVIDIA Docs

应用层降频 + 跟踪:在不丢重要事件的前提下,减少检测次数(e.g., 每秒 5-10 次检测),跟踪器维持对象 ID,显著降低 GPU 推理压力。

流水线并发:把拉流/解码、预处理、推理、后处理拆成独立线程/进程,用非阻塞队列/环形缓冲(ring buffer)连接,做到 CPU/GPU 最大并行利用。

网络 & 编码端优化:如果可控摄像头端(例如边缘设备)可以降低分辨率/码率,或者把关键区域裁剪、只推 ROI,会极大降低下游解码与推理成本。

监测与回退策略:检测到丢帧或延迟升高时,自动降帧率或暂时只做关键告警(graceful degradation)。

扩展:RTSP → WebRTC(浏览器实时预览)

浏览器不能直接播放 RTSP,常见做法是用 RTSP-to-WebRTC 网关/媒体服务器(Ant Media、Janus、webrtc-streamer、SRS 等)把 RTSP 转成 WebRTC,这能给用户在浏览器端带来低延迟的体验(比 HLS/RTMP 更好)。选择自建或第三方取决于并发、延迟与成本。

并发与扩展(大规模部署考虑)

每路流的资源消耗 = 网络带宽 + 解码(CPU 或 HW) + 缓冲内存 + 推理资源(GPU/CPU)。

硬件解码池化:NVDEC 可并行解多路流,但有上限;可在多台边缘设备上做“拉一部分摄像头、近源识别”,再把结果发送到云中心(边缘优先)。
NVIDIA Docs

流重分发 / 代理:用 RTSP proxy(或 media server)减轻摄像头端负载,并把转码/转封装集中管理(例如把不同摄像头的高码率流转为较低码率以节省带宽)。

容器化 + 自动伸缩:将识别服务拆为拉流服务(轻)和推理服务(重),用消息队列或 Redis 作缓冲/分配,推理服务按负载水平伸缩。

常见坑与 Troubleshooting 快速清单

“能播放但识别延迟大”:检查客户端缓冲、player 参数(ffmpeg/gst),是否在 decode 后做了额外缓冲/等待。

频繁丢帧:尝试切换 TCP/UDP,调整 rtpjitterbuffer、rtsp read buffer,或降低摄像头码率/分辨率。

NAT/防火墙:RTSP (UDP) 穿透困难,优先用 TCP 或通过媒体服务器/relay。

认证/兼容性:不同厂家 RTSP URL/路径差异大(路径、子流、凭证),建议先用 VLC/FFplay 验证 URL 再写代码。

硬件解码不生效:确认 FFmpeg/GStreamer 编译时启用了对应硬件加速插件(cuda/ffnvcodec/nvdec),并测试小样本。

简短实施建议(从零到可用的 6 步)

验证摄像头 RTSP:用 VLC / ffplay 测试 URL、分辨率、FPS。

原型:用 OpenCV 快速拉流并在 CPU 上跑一个小模型(例如 MobileNet/YOLO nano)确认逻辑。

做延迟/吞吐测试:测量 E2E(网络 + 解码 + 推理)延迟,找出瓶颈。

引入优化:若解码瓶颈,启用硬件解码(NVDEC);若推理瓶颈,做模型加速(ONNX/TensorRT)。
NVIDIA Docs

加跟踪与采样:检测频率下降,使用跟踪降低推理量。

部署/扩展:把拉流/解码放在近摄像头的边缘节点,推理可以集中或分散部署;必要时用 RTSP->WebRTC 网关供浏览器查看。
Ant Media

参考(快速入口)

RTSP / RFC 概述(协议规范)— IETF RFC2326。
datatracker.ietf.org

GStreamer rtspsrc 文档(如何处理 jitter/RTCP 等)— GStreamer 文档。
gstreamer.freedesktop.org

低延迟播放示例(ffplay/ffmpeg 的 -fflags nobuffer / -flags low_delay 用法)— 论文/实测。
VTT’s Research Information Portal

RTSP -> WebRTC 方案(Ant Media / Janus 等媒体服务器)— 用于浏览器实时播放。
Ant Media
janus.conf.meetecho.com

NVIDIA NVDEC(硬件解码、并发解码建议)— 官方文档/应用笔记。

作者 admin

百度广告效果展示