1. 课程导入

各位同学好。我是老张,在流媒体这行摸爬滚打了十多年。今天咱们聊RTSP协议基础,我尽量用大白话把这事讲透。

先讲个故事。2018年我帮某安防厂商做项目,客户要求把2000路摄像头画面实时推送到指挥中心。当时团队有人提议用RTMP,结果上线第一天就崩了——延迟高、连接不稳定,指挥员看到的画面比现场慢了快10秒。后来换成RTSP,问题全解决了。

为什么会这样?因为RTSP天生就是为这种场景设计的。咱们今天就把这事掰开揉碎讲清楚。

1.1 RTSP协议概述

RTSP全称Real Time Streaming Protocol,中文叫实时流协议。它由IETF在1998年标准化,RFC编号2326。说白了,它就是用来控制音视频流的「遥控器」。

你想想看,我们看视频时需要的操作无非就是:播放、暂停、快进、后退、停止。RTSP就是干这个的。它不负责传输视频数据本身,只负责「指挥」——告诉服务器:现在给我发第5秒到第10秒的数据。

核心要点:RTSP是一个应用层协议,默认端口554。它基于文本,类似HTTP的请求/响应模式。但和HTTP最大的区别是——RTSP是有状态的。服务器会记住每个会话的状态:当前播放到哪了、用了什么编码、传输方式是什么。

我刚开始学RTSP时,总把它和RTP搞混。这里澄清一下:RTSP负责控制,RTP负责传输实际音视频数据,RTCP负责质量反馈。三者配合使用,缺一不可。

1.2 RTSP与RTMP/HTTP对比

很多新手会问:市面上这么多流媒体协议,我该选哪个?

我个人习惯,先看场景再选协议。下面这张表是我多年总结的对比,你直接拿去用。

特性 RTSP RTMP HTTP(HLS/DASH)
传输层 TCP/UDP TCP TCP
延迟 低(200ms-1s) 中(1-3s) 高(5-30s)
状态管理 有状态 有状态 无状态
控制能力 强(播放/暂停/快进) 弱(仅播放) 弱(仅播放)
防火墙友好 差(需开放554端口) 中(需开放1935端口) 好(80/443端口)
典型场景 安防监控、IP摄像头 直播推流、互动直播 点播、OTT、短视频

看到没?RTSP在延迟和控制能力上完胜。但代价是防火墙配置麻烦。我在项目中遇到过,客户内网只开放80和443端口,RTSP死活连不上。最后没办法,只能走HTTP隧道。

避坑指南:我曾经在安防项目中,因为没注意RTSP的UDP模式,导致视频花屏。后来发现是防火墙把UDP包丢了。解决方案很简单:强制RTSP走TCP模式。在FFmpeg命令里加 -rtsp_transport tcp 就行。

1.3 RTSP应用场景分析

RTSP不是万能的,但在某些领域,它确实是首选。我按经验排了个优先级:

  1. 安防监控(第一优先级)
    • 海康、大华、宇视的摄像头几乎都支持RTSP
    • 延迟要求高:200ms以内
    • 需要VCR操作:回放、快进、暂停
  2. IP电话/视频通话
    • 需要双向实时通信
    • RTSP配合RTP可以实现低延迟
    • 但SIP协议更常用,RTSP偏小众
  3. 视频点播(VOD)
    • 支持Seek操作(跳转到任意时间点)
    • 但HLS更流行,因为CDN支持好
  4. 直播推流
    • RTMP是主流,RTSP较少
    • 除非你有特殊需求:比如低延迟+控制能力

我个人的经验是:如果你做安防,闭眼选RTSP。如果你做直播,优先考虑RTMP或SRT。如果你做点播,HLS最省心。

注意:RTSP在公网环境下表现不佳。因为UDP穿透困难,TCP模式又容易丢包。我曾经在跨国项目中,RTSP延迟飙到5秒以上。后来改用SRT协议才解决。所以,RTSP更适合局域网或专线环境。

1.4 RTSP协议栈全景图

下面这张图是我手绘的RTSP协议栈结构。你把它存下来,后面章节会反复用到。

RTSP协议栈全景图 应用层:RTSP(控制) + SDP(描述) 传输层:RTP(数据) + RTCP(质量) 网络层:TCP(可靠) / UDP(实时) 链路层:以太网 / WiFi / 4G/5G 说明:RTSP不直接传输数据,它通过SDP描述会话,通过RTP传输数据,通过RTCP监控质量 TCP模式适合公网,UDP模式适合局域网(延迟更低)

嗯,这里要注意:RTSP和RTP是分开的。RTSP走TCP(控制命令),RTP可以走UDP(数据流)。这种分离设计的好处是——控制命令必须可靠,数据流可以容忍少量丢包。

1.5 一个简单的RTSP交互示例

光说不练假把式。咱们看一个真实的RTSP握手过程。假设客户端要播放一个摄像头视频:

客户端 → 服务器:OPTIONS rtsp://192.168.1.100:554/stream1 RTSP/1.0
服务器 → 客户端:RTSP/1.0 200 OK
                Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE

客户端 → 服务器:DESCRIBE rtsp://192.168.1.100:554/stream1 RTSP/1.0
服务器 → 客户端:RTSP/1.0 200 OK
                Content-Type: application/sdp
                Content-Length: 120
                
                v=0
                o=- 123456 789012 IN IP4 192.168.1.100
                s=Live Stream
                m=video 0 RTP/AVP 96
                a=rtpmap:96 H264/90000

客户端 → 服务器:SETUP rtsp://192.168.1.100:554/stream1/track1 RTSP/1.0
                Transport: RTP/AVP/UDP;unicast;client_port=8000-8001
服务器 → 客户端:RTSP/1.0 200 OK
                Transport: RTP/AVP/UDP;unicast;client_port=8000-8001;server_port=9000-9001
                Session: 12345678

客户端 → 服务器:PLAY rtsp://192.168.1.100:554/stream1 RTSP/1.0
                Session: 12345678
服务器 → 客户端:RTSP/1.0 200 OK
                RTP-Info: url=rtsp://192.168.1.100:554/stream1/track1;seq=0;rtptime=0

看到没?整个过程就是「问清楚→要描述→建连接→开始播」。我刚开始调试时,经常卡在SETUP这一步。后来发现是端口没开放。记住:客户端端口和服务器端口必须一一对应。

调试技巧:用Wireshark抓包时,过滤条件写 rtsp 或 rtp。我习惯先抓一次完整的OPTIONS→DESCRIBE→SETUP→PLAY流程,确认每个步骤都返回200 OK。如果某个步骤返回错误码,比如401(未授权),那就检查认证信息。

1.6 本章小结

RTSP协议基础就讲这么多。你记住三件事:

  • RTSP是控制协议,不是传输协议
  • RTSP适合安防监控、低延迟场景
  • RTSP有状态,需要维护会话