2. 流媒体基础

在正式动手写 RTSP 推流代码之前,必须先弄清楚一件事:我们到底在“推”什么、数据在网络里是怎么流动的、为什么直播和点播看起来都是“播放视频”,底层却几乎是两套逻辑。这一节把流媒体的地基打牢,后面写 RTSP 客户端、搭 RTSP 服务器、做转发时,你才能知道每一步操作对应的是哪一层。

一、流媒体传输原理:边下边播,而不是下完再播

普通文件下载的逻辑是“先完整拿到文件,再交给播放器”。流媒体则相反:媒体数据被切成一个个小片段(帧或分片),持续地从服务端流向客户端,客户端收到一小段就开始解码播放,同时继续接收后续数据。这种“边接收、边解码、边播放”的模式,就是流媒体的核心。

要理解它,需要抓住三个关键角色和一条数据链路:

  • 采集/编码端:摄像头或文件源产生原始音视频,经过 H.264/H.265 视频编码和 AAC 音频编码,压缩成码流。
  • 封装/传输端:把编码后的裸码流按协议打包,例如 RTP 包、TS 分片、FLV Tag,再通过网络发送。
  • 播放端:接收数据、缓冲、解封装、解码、渲染,并处理抖动、丢包和音视频同步。

其中“缓冲”是流媒体体验的命门。网络不可能绝对稳定,播放器必须先用一小段缓冲吸收抖动。缓冲太小会卡顿,缓冲太大则延迟升高。直播追求低延迟,点播追求流畅,本质就是在缓冲策略上做不同的取舍。

核心公式可以粗略理解为:
端到端延迟 ≈ 编码延迟 + 网络传输延迟 + 缓冲延迟 + 解码渲染延迟
RTSP 推流之所以常用于安防和互动场景,就是因为它能把缓冲压得很低,延迟通常可控制在几百毫秒级。

二、实时流与点播的区别

很多人把“直播”和“点播”混为一谈,其实它们在数据方向、时间轴和协议选择上完全不同。

对比维度 实时流(直播) 点播(VOD)
数据方向 推流端 → 服务端 → 播放端,持续单向推送 播放端主动向服务端请求指定片段
时间轴 只有“现在”,无法回退,内容随采集实时产生 完整时间轴,可任意拖动、暂停、倍速
延迟要求 极敏感,通常要求秒级甚至亚秒级 不敏感,缓冲可以很大
典型协议 RTSP/RTP、RTMP、WebRTC、SRT HLS、DASH、HTTP-FLV(准点播)
服务端行为 转发为主,几乎不落盘或只做短时缓存 切片存储,按索引提供文件
典型场景 安防监控、视频会议、互动直播 影视网站、课程回放、短视频

从工程角度看,实时流最难的不是“传过去”,而是“稳定地低延迟传过去”。点播可以靠大缓冲和 CDN 缓存把问题掩盖掉,直播则必须直面丢包、抖动和时钟漂移。RTSP 正是为实时流设计的协议,它用 RTP 承载媒体、用 RTCP 做质量反馈,天生面向低延迟场景。

三、常见流媒体协议概览

协议没有绝对优劣,只有适不适合。下面这张信号链式的协议关系图,展示了从采集端到播放端,几种主流协议各自所处的位置和典型搭配。

流媒体协议信号链:从采集到播放 采集/编码端 摄像头 · H.264/AAC 推流协议 RTSP / RTMP / SRT WebRTC(上行) 流媒体服务端 转发 · 转封装 · 切片 分发协议 HLS / DASH / HTTP-FLV RTSP(下行) 播放端 VLC · 浏览器 · 播放器 协议特性速览: RTSP/RTP:低延迟、可控制播放(PLAY/PAUSE),安防与互动首选,默认端口 554。 RTMP:基于 TCP,延迟 1~3 秒,推流生态成熟,但浏览器已不再原生支持。 HLS/DASH:基于 HTTP 切片,延迟高(数秒至数十秒),兼容性最好,适合点播与大规模分发。

结合上图,可以把协议选择归纳成几条实用原则:

  • 要低延迟、要控制:选 RTSP/RTP,或 WebRTC。安防球机、云台控制、远程操控都依赖 RTSP 的 DESCRIBE/SETUP/PLAY 交互。
  • 要推流到直播平台:选 RTMP,OBS 等工具默认就是它,生态最成熟。
  • 要覆盖海量观众、兼容浏览器:选 HLS 或 DASH,用 CDN 分发,代价是延迟。
  • 要抗弱网、跨公网:可考虑 SRT,它在 UDP 上做了重传和纠错,适合不稳定链路。

四、案例与实操:一次 RTSP 拉流都发生了什么

假设我们用 FFmpeg 从一台 IP 摄像机拉流并转推到本地 RTSP 服务器,命令如下:

# 从摄像机拉 RTSP 流,转封装后推给本地 RTSP 服务器
ffmpeg -rtsp_transport tcp \
       -i rtsp://admin:pass@192.168.1.64:554/Streaming/Channels/101 \
       -c copy -f rtsp rtsp://127.0.0.1:8554/live/cam01

# 用 ffplay 验证拉流是否成功
ffplay -rtsp_transport tcp rtsp://127.0.0.1:8554/live/cam01

这条命令背后依次发生了:TCP 建连 → RTSP OPTIONS 探测 → DESCRIBE 获取 SDP → SETUP 建立 RTP 会话 → PLAY 开始传输 → RTP 包持续到达 → 播放器解封装解码。如果中间任何一步失败,日志里会明确停在某个方法上,这也是后面排障的重要线索。

调试 RTSP 时,优先加 -rtsp_transport tcp。UDP 模式虽然延迟更低,但在丢包或 NAT 环境下容易出现花屏、卡顿,先用 TCP 确认链路和鉴权没问题,再考虑切回 UDP 优化延迟。

五、常见误区与复盘

误区一:把 RTSP 当成“传输视频数据的协议”。实际上 RTSP 只负责“控制”,真正的音视频数据由 RTP 承载,RTCP 负责质量反馈。理解这一点,才能看懂 SETUP 里协商的端口和 transport 参数。
误区二:认为延迟高就是网络慢。很多时候延迟来自播放器缓冲、编码 B 帧、服务端转码排队。排查时要分段测量,而不是一味怪网络。
误区三:点播协议拿来跑直播。HLS 默认切片 6 秒,端到端延迟轻松超过 10 秒,用在互动场景会直接“没法用”。协议选型错误,后面再怎么优化都事倍功半。