当前位置: 首页 > ai >正文

音视频学习(五十七):RTSP信令交互流程

什么是 RTSP 信令?

RTSP (Real Time Streaming Protocol) 是一种应用层协议,用于控制实时流媒体服务器。它本身不传输数据,而是像一个“远程遥控器”,负责管理和控制媒体流的传输。RTSP 信令就指服务器与客户端之间,用于建立、控制和终止流媒体会话的命令和响应。

RTSP 的核心信令包括:

  • DESCRIBE:客户端请求服务器,获取媒体流的详细信息。
  • SETUP:客户端通知服务器,准备好接收数据,并协商传输参数。
  • PLAY:客户端请求服务器开始发送数据流。
  • PAUSE:客户端请求服务器暂停数据流。
  • TEARDOWN:客户端请求服务器终止会话,释放资源。
  • OPTIONS:客户端查询服务器支持哪些命令。

SDP描述

在 RTSP 信令中,SDP (Session Description Protocol) 扮演着至关重要的角色。它不是一个传输协议,而是一个纯文本格式的协议,用于描述多媒体会话的参数。你可以把它看作是媒体流的“蓝图”或“说明书”。

会话级描述 (Session-level)

这部分描述了整个会话的全局信息,对会话中的所有媒体流都有效。

示例作用
v=v=0版本号。SDP 的版本号,目前通常为 0。
o=o=- 1587397985834861 1 IN IP4 192.168.1.100会话发起者和会话 ID- 通常表示用户名未知,后面的两个数字是会话 ID 和版本号,用于唯一标识会话。IN IP4 表示网络类型为 IPv4。
s=s=RTSPServer会话名称。一个描述性的会话名称。
c=c=IN IP4 0.0.0.0连接信息。描述了媒体流的发送地址。在 RTSP 中,0.0.0.0 通常表示数据流将从源头(服务器)发送。
t=t=0 0时间信息。描述了会话的开始和结束时间戳。0 0 表示会话没有明确的开始和结束时间,通常用于直播流。
a=a=tool:LIVE555 Streaming Media会话属性。这是一个通用的属性行,可以包含多种会话级别的信息,如使用的工具、会话类型等。

媒体级描述 (Media-level)

这部分描述了会话中包含的每一个媒体流的具体信息,通常以 m= 行开头,并由其后面的 a= 行进行详细说明。一个 SDP 文件可以包含多个媒体级描述,例如一个视频流和一个音频流。

示例作用
m=m=video 0 RTP/AVP 96媒体流类型。这是媒体级描述的起点。video 是媒体类型;0 表示端口号将由传输协议(如 SETUP 信令)指定;RTP/AVP 是传输协议;96 是一个动态负载类型(Payload Type)
a=a=rtpmap:96 H264/90000负载类型映射。将前面 m= 行定义的动态负载类型 96 映射到具体的编码格式 H264,并指定其时钟频率为 90000 Hz (RTP 标准)。这是非常关键的一行,告诉接收端如何解析 RTP 包中的数据。
a=a=fmtp:96 packetization-mode=1;...格式化参数。提供了编码格式的详细参数。对于 H.264,这行会包含 profilelevel 等信息,最重要的是 sprop-parameter-sets,它包含了 SPS (Sequence Parameter Set)PPS (Picture Parameter Set)。这些参数是 Base64 编码的,是解码器成功初始化和解析视频流所必需的。
a=a=control:track1控制 URI。这是 RTSP 特有的,用于指定该媒体流的控制 URI。在后续的 SETUPPLAY 等信令中,客户端会使用这个 URI 来操作特定的媒体流。
a=a=framerate:25.0帧率信息。指定该视频流的帧率。

SDP信息交互流程

SDP 信息的传递通常发生在 DESCRIBE 命令的响应中。下面我们详细拆解一个典型的 RTSP 媒体会话建立过程,看看 SDP 是如何被使用的。

1. OPTIONS(可选)

在建立会话之前,客户端可能会发送一个 OPTIONS 请求来探测服务器的能力。

  • 客户端发送

    OPTIONS rtsp://example.com/stream RTSP/1.0
    CSeq: 1
    
  • 服务器响应

    RTSP/1.0 200 OK
    CSeq: 1
    Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE
    

    服务器告诉客户端,它支持 DESCRIBESETUP 等命令,为后续的会话做准备。

2. DESCRIBE:获取媒体“蓝图” (SDP)

这是 SDP 信息交互的核心步骤。客户端发送 DESCRIBE 请求,服务器将包含 SDP 的响应返回。

  • 客户端发送

    DESCRIBE rtsp://example.com/stream RTSP/1.0
    CSeq: 2
    Accept: application/sdp
    

    客户端告诉服务器,它接受以 application/sdp 格式返回的会话描述。

  • 服务器响应

    RTSP/1.0 200 OK
    CSeq: 2
    Content-Base: rtsp://example.com/stream/
    Content-Type: application/sdp
    Content-Length: 454v=0
    o=- 1587397985834861 1 IN IP4 192.168.1.100
    s=RTSPServer
    c=IN IP4 0.0.0.0
    t=0 0
    a=tool:LIVE555 Streaming Media
    a=type:broadcast
    a=control:*m=video 0 RTP/AVP 96
    a=rtpmap:96 H264/90000
    a=fmtp:96 packetization-mode=1;profile-level-id=42c016;sprop-parameter-sets=Z0LAHuiwCgk=,aM48gA==
    a=framerate:25.0
    a=control:track1m=audio 0 RTP/AVP 97
    a=rtpmap:97 MPEG4-GENERIC/44100
    a=fmtp:97 streamtype=5;profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3;config=1200
    a=control:track2
    

    响应分析

    • Content-Type: application/sdp:明确说明响应体是 SDP 格式。
    • 会话级描述v=, o=, s= 等行描述了整个流媒体会话。c=IN IP4 0.0.0.0 表示数据流将从源地址(服务器)发送。
    • 媒体级描述
      • m=video 0 RTP/AVP 96:描述了一个视频流。0 表示端口号将由 SETUP 命令指定,RTP/AVP 是传输协议,96 是一个动态的负载类型(Payload Type)
      • a=rtpmap:96 H264/90000:将负载类型 96 映射到 H264 编码格式,时钟频率为 90000 Hz (RTP 标准)。
      • a=fmtp:96 ...:提供 H.264 编码的详细参数。sprop-parameter-sets 是一个关键部分,它包含了 Base64 编码的 SPS (Sequence Parameter Set)PPS (Picture Parameter Set)。客户端需要这些参数来初始化解码器。
      • a=control:track1:这是一个关键的控制 URI,后续的 SETUPPLAY 命令将针对这个 URI 进行操作。

3. SETUP:建立传输通道

客户端根据 DESCRIBE 响应中的 SDP 信息,为每个媒体流(视频和音频)发送独立的 SETUP 请求。

  • 客户端发送(视频)

    SETUP rtsp://example.com/stream/track1 RTSP/1.0
    CSeq: 3
    Transport: RTP/AVP/UDP;unicast;client_port=5000-5001
    

    Transport 头:客户端告知服务器,它希望使用 RTP over UDP 进行单播传输,并指定了用于接收数据的本地端口范围 5000-5001(RTP 端口和 RTCP 端口)。

  • 服务器响应(视频)

    RTSP/1.0 200 OK
    CSeq: 3
    Transport: RTP/AVP/UDP;unicast;client_port=5000-5001;server_port=5002-5003;ssrc=12345678
    Session: 1A2B3C4D
    
    • 服务器响应 server_port,告知客户端它将使用 5002-5003 端口发送数据。

    • Session 头:服务器返回一个唯一的会话 ID,客户端需要在后续的 PLAYTEARDOWN 请求中带上这个 ID。

4. PLAY:开始传输数据

SETUP 成功后,客户端发送 PLAY 请求,告诉服务器可以开始发送数据了。

  • 客户端发送

    PLAY rtsp://example.com/stream/ RTSP/1.0
    CSeq: 4
    Session: 1A2B3C4D
    
  • 服务器响应

    RTSP/1.0 200 OK
    CSeq: 4
    Session: 1A2B3C4D
    RTP-Info: url=rtsp://example.com/stream/track1;seq=123;rtptime=12345
    

    服务器开始向客户端发送 RTP 数据流。

5. TEARDOWN:结束会话

当播放结束时,客户端发送 TEARDOWN 请求以终止整个会话。

  • 客户端发送

    TEARDOWN rtsp://example.com/stream/ RTSP/1.0
    CSeq: 5
    Session: 1A2B3C4D
    
  • 服务器响应

    RTSP/1.0 200 OK
    CSeq: 5
    

    服务器释放相关资源,会话结束。

H.264/H.265 NALU 类型

H.264 NALU 类型总结

H.264 的 NALU 头部是 1 个字节,其结构如下:

F (1 bit)NRI (2 bits)Type (5 bits)
  • F(禁止位): 通常为 0
  • NRI(重要性指示): 指示该 NALU 的重要性,用于丢包时的决策。
  • Type(类型): 决定了 NALU 的具体类型。

常见的 H.264 NALU 类型有:

Type 值NALU 类型名称作用
1-23单 NALU 单元包含一帧图像的一部分或全部数据。1 代表非 IDR 图像的分片,5 代表 IDR 图像的分片。
7SPS (Sequence Parameter Set)序列参数集。包含解码器所需的全局信息,如分辨率、帧率、码流的重要级别等。
8PPS (Picture Parameter Set)图像参数集。包含单个或多个图像共享的参数,如熵编码方式、量化参数等。
9AUD (Access Unit Delimiter)访问单元分隔符。用于分隔不同的帧,标记一帧的开始。
10, 11SEI (Supplemental Enhancement Information)补充增强信息。包含时序、版权等辅助信息。
24STAP-A单一时间聚合包。用于将多个小的 NALU(如 SPS、PPS、AUD)封装在一个 RTP 包中发送。
28FU-A (Fragmentation Unit A)分片单元 A。用于将一个大的 NALU(通常是 I 帧)分成多个小块,以便在 RTP 包中传输。

H.265 (HEVC) NALU 类型总结

H.265 的 NALU 头部是 2 个字节,其结构如下:

F (1 bit)Type (6 bits)LayerId (6 bits)TID (3 bits)
  • F(禁止位): 通常为 0
  • Type(类型): 决定了 NALU 的具体类型。
  • LayerId(层 ID): 用于分层编码。
  • TID (TemporalId): 用于时域可分级编码。

常见的 H.265 NALU 类型有:

Type 值NALU 类型名称作用
0-31视频编码层 (VCL) NALU包含实际的视频数据。19 通常代表 IDR 图像的分片,1 代表普通的分片。
32VPS (Video Parameter Set)视频参数集。H.265 新增,位于 SPS 之上,用于描述多个序列的共享参数,例如分层结构信息。
33SPS (Sequence Parameter Set)序列参数集。与 H.264 类似,但包含更多参数,用于解码。
34PPS (Picture Parameter Set)图像参数集。与 H.264 类似,包含帧级的参数。
35AUD (Access Unit Delimiter)访问单元分隔符。用于标记一帧的开始。
39SEI (Supplemental Enhancement Information)补充增强信息。与 H.264 类似。
48聚合包用于将多个小 NALU 聚合在一个 RTP 包中。
49FU-A (Fragmentation Unit A)分片单元 A。用于将一个大的 NALU 分片传输。

总结

RTSP 信令是一个严谨的、分步骤的控制流程。SDP 在这个流程中扮演了“粘合剂”和“协议协商者”的角色,它通过 DESCRIBE 响应,将复杂而关键的媒体参数(如编码格式、SPS/PPS、时钟频率等)一次性传递给客户端。这使得客户端能够:

  1. 了解服务器提供了哪些媒体流(视频、音频)。
  2. 知道如何配置自己的解码器(通过 SPS/PPS 等参数)。
  3. 通过 SDP 中提供的 control URI,与服务器进行后续的 SETUPPLAY 等操作。
http://www.xdnf.cn/news/18698.html

相关文章:

  • 华为云Stack环境中计算资源,存储资源,网络资源发放前的准备工作(中篇)
  • Spring Boot 结合 Jasypt 实现敏感信息加密(含 Nacos 配置关联思路)
  • Odoo 非标项目型生产行业解决方案:专业、完整、开源
  • 生成式AI的崛起
  • 俄罗斯情报机构推出新型安卓恶意软件,伪装成杀毒软件
  • Fluent Bit系列:字符集转码测试(下)
  • 蛋白质结构信息学大纲
  • Android横竖屏切换的“数据保卫战”:如何优雅地保存和恢复表单数据
  • 深入浅出 Java 多态:从原理到实践的全面解析
  • 程序的“烽火台”:信号的产生与传递
  • 使用 NetworkManager 管理 Wi-Fi 热点
  • 【动态规划】卡特兰数
  • 【leetcode】82. 删除排序链表中的重复元素(二)
  • KubeBlocks for Redis的5种网络模式
  • 计算机大数据技术不会?医院体检数据可视化分析系统Django+Vue全栈方案
  • 第二十二天-TFTLCD驱动原理介绍和配置
  • Vue3使用 DAG 图(AntV X6)
  • Vue 2 中的 v-model和Vue3中的v-model
  • 大数据毕业设计选题推荐-基于大数据的超市销售数据统计分析系统-Hadoop-Spark-数据可视化-BigData
  • 企业在做广告前,需要明确哪些问题?
  • 销售额和营业收入的区别在哪?哪个值应该更大一些?
  • 《零基础入门AI:循环神经网络(Recurrent Neural Networks)(从原理到实现)》
  • Java中的反射机制
  • MyBatis 从入门到精通:一篇就够的实战指南(Java)
  • 3-3〔OSCP ◈ 研记〕❘ WEB应用攻击▸WEB应用安全评估工具
  • 火山引擎配置CDN
  • 【Linux | 网络】多路转接IO之poll
  • 计算机网络课堂笔记
  • AutoCAD Electrical缺少驱动程序“AceRedist“解决方法
  • C++ Core Guidelines 核心理念