【音视频 | RTSP】SDP(会话描述协议)详解 及 抓包例子分析

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍 SDP (会话描述协议)🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你------泰戈尔🍭
⏰发布时间⏰:2024-07-09 08:31:22

本文未经允许,不得转发!!!

目录

  • 🎄一、概述
  • [🎄二、SDP 语法结构](#🎄二、SDP 语法结构)
  • [🎄三、SDP 描述解析](#🎄三、SDP 描述解析)
    • [3.1 会话级别描述(Session description)](#3.1 会话级别描述(Session description))
    • [3.1 媒体级别描述(Session description)](#3.1 媒体级别描述(Session description))
  • [🎄四、SDP 抓包分析](#🎄四、SDP 抓包分析)
  • 🎄五、总结


🎄一、概述

SDP,全称Session Description Protocol,会话描述协议,是一种用于描述多媒体会话参数的文本协议。

SDP对应的官方文档是RFC2327 ,文档链接:SDP: Session Description Protocol

SDP定义了一种标准的格式,用于描述会话的各种参数,这些参数对于会话的参与者来说至关重要,因为它们需要根据这些信息来正确配置和连接到会话。SDP可包括以下媒体信息:

  • 媒体类型(音频、视频等);
  • 传送协议(RTP/UDP/IP, H.320等);
  • 媒体格式(H264视频,AAC音频等);
  • 传输地址和端口;

在RTSP框架中,SDP协议主要在响应DESCRIBE请求时,为客户端提供启动和控制媒体流所需的所有必要信息。


🎄二、SDP 语法结构

SDP完全是文本形式的,采样UTF-8(RFC 2044)编码的ISO 10646字符集。选用文本形式,是为了提高便携性和传送方式的多样性。

一个SDP会话描述由多个形式为<type>=<value>的文本行组成。
<type>:一般是一个字符,并且区分大小写。
<value>:是一个结构化的文本字符串,其格式取决于<type>

另外,在=两侧都不能有空格。

SDP通常分为两大部分:会话级别描述 (Session description)和媒体级别描述(Media description)。会话级别描述涵盖了整个会话的通用信息,比如:所有者、会话标识、网络地址、时间范围等。媒体级别描述则针对每个媒体流提供具体的传输协议、端口、编解码器参数等信息,确保客户端能够正确地建立和控制各个媒体流。

下面是RFC2327中给出的SDP结构,其中带星号*表示可选的。

Session description
        v=  (protocol version)
        o=  (owner/creator and session identifier).
        s=  (session name)
        i=* (session information)
        u=* (URI of description)
        e=* (email address)
        p=* (phone number)
        c=* (connection information - not required if included in all media)
        b=* (bandwidth information)
        One or more time descriptions (see below)
        z=* (time zone adjustments)
        k=* (encryption key)
        a=* (zero or more session attribute lines)
        Zero or more media descriptions (see below)

Time description
        t=  (time the session is active)
        r=* (zero or more repeat times)

Media description
        m=  (media name and transport address)
        i=* (media title)
        c=* (connection information - optional if included at session-level)
        b=* (bandwidth information)
        k=* (encryption key)
        a=* (zero or more media attribute lines)

下图是中文的,可以对比学习:


🎄三、SDP 描述解析

3.1 会话级别描述(Session description)

  • 版本号 (version)------必选

    版本号是必选的,指定SDP消息遵循的协议版本。目前SDP仅有一个正式版本,即v=0

    v=0
    
  • 所有者/创建者(Origin)------必选

    "会话发起者"行的语法格式如下:

    o=<username> <session id> <version> <network type> <address type> <address>
    

    共6个部分,每部分以单空格区分。

    • <username>始发主机用户名,如果始发主机不支持用户标识的概念,则该字段填"-"。中不能包含空格。
    • <sess-id>是一个数字串。建议使用时间戳以保证唯一性。
    • <sess-version>当前会话描述的版本号。如果会话数据做了修改,则这个会话的版本号要增加,具体做法取决于开发工具。建议但不强制要求使用时间戳。
    • <nettype>描述网络类型。目前先定义"IN",它表示互联网,其他值待定。
    • <addrtype>描述网络地址类型,这里先定义两种取值:"IP4"和"IP6"。
    • <unicast-address>描述创建会话的主机地址。

    总之,o=给出了这个版本会话描述的全球唯一标识。

  • 会话名称(Session Name)------必选
    s=字段描述会话名称,是基于文本的。每个会话描述中有且仅有一个s=字段,且不能为空。如果一个会话没有实际意义,可以这样表述:s=(通过一个空格来表示会话名称)。格式如下:

    s=<session name>
    
  • 会话信息(Session Information)

    提供会话的更详细描述或说明,可以包含额外的上下文信息、摘要、版权声明等。这是一个扩展字段,用于增强参与者对会话的理解,格式如下:

     i=<session information>
    
  • URI(Uniform Resource Identifier)

    指向外部资源的统一资源标识符(URI),比如:网页、文档或其他相关材料,这可以为参与者提供会话的补充信息或进一步指导。格式如下:

    u=<uri>
    
  • 电子邮件地址(Email Address)

    提供所有者或会话管理员的电子邮件联系方式,以便参与者在需要时能够通过电子邮件进行沟通。格式如下:

    e=<email-address>
    
  • 电话号码(Phone Number)

    提供所有者或会话管理员的电话联系方式,作为另一种与会话相关的辅助联系方式。格式如下:

    p=<phone-number>
    
  • 连接信息(Connection Data)

    描述会话使用的网络类型、地址类型以及连接地址,这些信息用于帮助参与者找到并接入会话。在网络类型和地址类型与o=字段相同的情况下,这一字段可以省略。比如:"c=IN IP4 236.255.1.1"表示会话使用Internet网络,地址类型为IPv4,连接地址为组播地址236.255.1.1。格式如下:

    c=<nettype> <addrtype> <connection-address>
    
  • 带宽信息(Bandwidth Information)

    指定会话所需的总体带宽或特定类型的带宽。<bwtype>可以是AS(应用层信号,Application-Specific),表示总体带宽需求,或者是CT(会议总带宽,Conference Total)等特定类型。<bandwidth>是带宽值,单位为kpbs。比如:"b=AS:1024"表示会话请求1024 kbps的总体带宽。格式如下:

     b=<bwtype>:<bandwidth>
    
  • 时间描述(Timing)

    格式: t=<start-time> <stop-time>

    作用: 定义会话的开始时间和结束时间,时间以NTP格式的绝对时间戳表示,单位为秒。如果<stop-time>为0,表示过了<start-time>之后,会话一直持续。如果<start-time><stop-time>都为0,表示持久会话。

  • 加密密钥(Encryption Key)

    格式: k=<method>[:<encryption key>]

  • 属性(Attributes)

    格式: a=<attribute>[:<value>]

    作用: a=字段用于携带会话级的其他属性或参数,比如:会话控制信息、安全设置、服务质量要求等。属性可以是预定义的标准属性,也可以是扩展属性,多个属性可以单独列出多行。


3.1 媒体级别描述(Session description)

SDP可以包含许媒体描述(Session description)。 每个媒体描述都以"m="字段开始,然后到下一个"m="字段或到会话结束时 描述终止 。媒体字段也有几个子字段:

  • 媒体描述(Media description)------必选
    定义了媒体流的基本属性,包括:类型、接收端口、传输协议以及支持的编解码器列表。格式如下:

    m=<media> <port> <transport> <fmt list>
    
    • <media>:媒体类型,取值为:audio、video、text、application等,用于标识媒体流的内容类别。
    • <port>:接收媒体流的端口号。如果是单播传输,通常是一个具体的端口号。如果是组播传输,可能是端口范围。
    • <number of ports>:可选部分,用于指定端口数量,通常用于RTP/RTCP复用同一个端口范围的情况。
    • <proto>:传输协议,取值为:RTP/AVP、RTP/SAVP等。
    • <fmt list>:媒体格式列表,即RTP负载类型(Payload Type,PT),每个PT对应一种编解码器或编码格式。具体格式为逗号分隔的整数列表,比如:"96, 97, 98"。
  • 媒体标题(Media title)
    格式:i=<media title>
    作用: 可选字段,提供媒体流的简短标题或说明,帮助参与者理解媒体流的内容

  • 连接信息(Connection Information)
    格式: c=<nettype> <addrtype> <connection-address>
    作用: 在与会话级别c=字段不同的情况下,提供媒体流的特定连接信息。这些信息包括:网络类型、地址类型以及连接地址,用于指导客户端如何访问媒体流。如果与会话级别c=字段相同,则可以省略。

  • 带宽信息(Bandwidth Information)
    格式: b=<bwtype>:<bandwidth>
    作用: 指定媒体流所需的特定带宽类型和带宽值。与会话级别b=字段类似,但针对单个媒体流。比如:"b=AS:512"表示该媒体流请求512 kbps的应用层带宽。

  • 密钥(Encryption Key)

  • 属性(Attributes)
    格式: a=<attribute>[:<value>]
    常见的媒体描述属性:

    • a=rtpmap:<payload type> <encoding name>/<clock rate>[/<encoding parameters>]
      将RTP负载类型(payload type)映射到具体的编码名称、采样率(或时钟频率)以及可能的编码参数。
    • a=fmtp:<format> <format specific parameters>
      这个属性允许特定的格式参数能在SDP不能识别它们的前提下依然能够传递。这种格式必须是媒体定义的格式中的一种
    • a=control:<URI>
      在RTSP中,a=control:字段尤为重要,它提供了媒体流的控制URI。客户端可以通过该URI对特定媒体流执行独立的控制操作,如PLAY、PAUSE等。比如:"a=control:trackID=1"表示该媒体流的控制路径为"trackID=1",客户端可以通过向服务器发送如"PLAY rtsp://example.com/path/to/stream/trackID=1"这样的命令来单独控制该媒体流。

🎄四、SDP 抓包分析

下面是RTSP取流过程中,服务端响应DESCRIBE方法的一个SDP截图:

  • v=0:表示版本号0;
  • o=- 1720014950032000 1 IN IP4 192.168.3.225:表示 主机不支持用户名,会话ID为 8913478,会话版本为1,网络类型为internet,地址类型为IPv4,所有者网络地址为192.168.3.225。
  • s=LIVE555 Streaming Media v2016.07.19:会话名称为 LIVE555 Streaming Media v2016.07.19;
  • t=0 0<start-time><stop-time>都为0,表示持久会话
  • a=tool:LIVE555 Streaming Media v2016.07.19:创建SDP的工具的名称和版本号;
    a=type:broadcast:会议类型为 broadcast;
    a=control:*:控制URL通配符,*表示所有控制命令都适用于该会话。
    a=range:npt=0-:表示可用播放范围,npt=0-意味着从会话开始(0秒)到无穷大(即整个会话)
    a=x-qt-text-nam:LIVE555 Streaming Media v2016.07.19:为QuickTime兼容性提供额外的会话名,内容与s字段相同
    a=x-qt-text-inf:1080:为QuickTime兼容性提供额外的会话信息,内容与i字段相同
  • m=video 0 RTP/AVP 96:video,表示这是一个视频媒体流;端口为0表示使用动态端口分配,实际端口在SETUP请求中确定;传输协议为RTP/AVP,表示使用RTP(实时传输协议)传输,通过UDP进行封装,并允许在会话中协商负载类型;负载类型为96,表示视频流使用编号为96的负载类型,对应H.264编码。
  • c=IN IP4 0.0.0.0:网络类型为IN,表示Internet。地址类型为IP4,表示IPv4地址。地址为0.0.0.0,通常表示接收端地址待定,实际地址在SETUP请求中确定。
  • b=AS:5000:指定媒体流所需的带宽,此处为5000 kbps
  • a=rtpmap:96 H264/90000:映射PT为96的负载类型到H.264编码,采样率为90000 Hz(表示视频帧率为90 kHz,实际为假定的值,视频帧率通常以fps为单位)。
  • a=fmtp:96 packetization-mode=1;profile-level-id=64002A;sprop-parameter-sets=Z2QAKq2EAQwgCGEAQwgCGEAQwgCEO1A8ARPyoA==,aO48sA==:提供PT为96的H.264编码的详细参数;packetization-mode=1表示采用单NALU(网络抽象层单元)模式;profile-level-id=64002A:指定H.264的Profile和Level;sprop-parameter-sets包含两个参数集(SPS和PPS),它们是解码视频流所必需的额外参数。
  • a=control:track1:指定媒体流的控制URI,trackID=1表示客户端可以通过此标识符对视频流进行独立的控制操作
  • m=audio 0 RTP/AVP 97:audio,表示这是一个音频流;端口为0表示使用动态端口分配,实际端口在SETUP请求中确定;传输协议为RTP/AVP,表示使用RTP(实时传输协议)传输,通过UDP进行封装,并允许在会话中协商负载类型;
  • c=IN IP4 0.0.0.0:网络类型为IN,表示Internet。地址类型为IP4,表示IPv4地址。地址为0.0.0.0,通常表示接收端地址待定,实际地址在SETUP请求中确定。
  • b=AS:768:指定媒体流所需的带宽,此处为768 kbps
  • a=rtpmap:97 PCMA/48000/2:映射PT为97的负载类型到PCMA编码;采样率为48000HZ,双通道;
    a=control:track2:指定媒体流的控制URI,trackID=2表示客户端可以通过此标识符对视频流进行独立的控制操作

🎄五、总结

本文主要介绍 SDP(会话描述协议)的格式、语法结构、描述解析等。

如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

参考:
从零开始精通RTSP之SDP格式详解
SDP协议总结

相关推荐
darkdragonking3 小时前
FLV视频封装格式详解
音视频
元争栈道4 小时前
webview和H5来实现的android短视频(短剧)音视频播放依赖控件
android·音视频
元争栈道6 小时前
webview+H5来实现的android短视频(短剧)音视频播放依赖控件资源
android·音视频
MediaTea9 小时前
Pr:音频仪表
音视频
桃园码工9 小时前
13_HTML5 Audio(音频) --[HTML5 API 学习之旅]
音视频·html5·audio
cuijiecheng201815 小时前
音视频入门基础:MPEG2-TS专题(21)——FFmpeg源码中,获取TS流的视频信息的实现
ffmpeg·音视频
γ..16 小时前
基于MATLAB的图像增强
开发语言·深度学习·神经网络·学习·机器学习·matlab·音视频
cuijiecheng201816 小时前
音视频入门基础:AAC专题(13)——FFmpeg源码中,获取ADTS格式的AAC裸流音频信息的实现
ffmpeg·音视频·aac
悟纤19 小时前
Suno Api V4模型无水印开发「高清音频WAV下载」 —— 「Suno Api系列」第6篇
音视频·suno·suno v4·suno ai
gomogomono1 天前
HDR视频技术之八:色域映射
音视频·hdr·yuv