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

news2024/12/30 3:03:36

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

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

目录

  • 🎄一、概述
  • 🎄二、SDP 语法结构
  • 🎄三、SDP 描述解析
    • 3.1 会话级别描述(Session description)
    • 3.1 媒体级别描述(Session description)
  • 🎄四、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协议总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1912673.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器视觉理论入门

文章目录 前言一、马尔视觉理论二、图形与图像三、图像基础名词总结 前言 Marr的视觉计算理论立足于计算机科学&#xff0c;系统地概括了心理物理学、神经生理学、临床神经病理学等方面已取得的所有重要成果&#xff0c;是迄今为止最为系统的视觉理论。Marr 的视觉计算理论虽然…

Linux学习——Linux中无法使用ifconfg命令

Linux学习——Linux中无法使用ifconfg命令&#xff1f; &#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅…

内网对抗-基石框架篇单域架构域内应用控制成员组成用户策略信息收集环境搭建

知识点&#xff1a; 1、基石框架篇-单域架构-权限控制-用户和网络 2、基石框架篇-单域架构-环境搭建-准备和加入 3、基石框架篇-单域架构-信息收集-手工和工具1、工作组(局域网) 将不同的计算机按照功能分别列入不同的工作组。想要访问某个部门的资源&#xff0c;只要在“网络…

金蝶部署常见问题解决

金蝶部署常见问题解决 金蝶版本&#xff1a; Apusic Application Server Enterprise Edition 9.0 SP8 kbc build 202312041121 报错信息&#xff1a; 与金蝶官方人员沟通&#xff0c;发现lib包版本太低&#xff0c;升级后可正常使用。替换lib包后重启服务。 下载lib: 链接: …

Data-Juicer:阿里巴巴荣誉出品的大模型数据清洗框架

Diffusion Models专栏文章汇总:入门与实战 前言:如何优雅地进行大规模数据清洗是一门艺术,特别对于大模型,数据的质量是决定模型成功最关键的因素之一。阿里巴巴最近开源了一项专门针对大语言模型和视频生成大模型的数据清洗框架,值得关注! 目录 主要特点 数据处理 分…

代理详解之静态代理、动态代理、SpringAOP实现

1、代理介绍 代理是指一个对象A通过持有另一个对象B&#xff0c;可以具有B同样的行为的模式。为了对外开放协议&#xff0c;B往往实现了一个接口&#xff0c;A也会去实现接口。但是B是“真正”实现类&#xff0c;A则比较“虚”&#xff0c;他借用了B的方法去实现接口的方法。A…

大小端详解

引例 我们知道整形(int)是4个字节&#xff0c;例如随便举个例子&#xff1a;0x01020304&#xff0c;它一共占了四个地址位&#xff0c;01,02,03,04分别占了一个字节&#xff08;一个字节就对应了一个地址&#xff09;。 那么就会有个问题&#xff1a;我们的01到底是存储在高地…

Apache Flink核心特性应用场景

Flink的定义 Apache Flink是一个分布式处理引擎&#xff0c;用于处理 无边界数据流&#xff0c; 有边界数据流上金秀贤有状态的计算。Flink能在所有常见的集群环境中运行&#xff0c;并能以内存速度和任意规模进行计算如下Flink官网的一张图 Flink 与Spark的区别 Flink 中处…

Global Mapper:地理信息的温柔探索

引言 在这纷繁复杂的世界里&#xff0c;地理信息系统&#xff08;GIS&#xff09;如同一把利器&#xff0c;帮助我们剖析、理解和改造这个世界。而在众多GIS软件中&#xff0c;Global Mapper无疑是其中的佼佼者。作为一款功能全面且易于使用的GIS应用程序&#xff0c;Global M…

【Python基础】代码如何打包成exe可执行文件

本文收录于 《一起学Python趣味编程》专栏&#xff0c;从零基础开始&#xff0c;分享一些Python编程知识&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、安装PyInstaller三、使用PyInstaller打包四、验证打包是否成功五、总结 一、前言 本文介绍如何…

Sharding-JDBC分库分表之SpringBoot主从配置

Sharding-JDBC系列 1、Sharding-JDBC分库分表的基本使用 2、Sharding-JDBC分库分表之SpringBoot分片策略 3、Sharding-JDBC分库分表之SpringBoot主从配置 前言 在开发中&#xff0c;如果对数据库的读和写都在一个数据服务器中操作&#xff0c;面对日益增加的访问量&#x…

在Windows中使用开源高性能编辑器Zed(持续更新)

简介 “Zed is a high-performance, multiplayer code editor from the creators of Atom and Tree-sitter. It’s also open source.” “Zed是一款高性能的支持多人协作的代码编辑器&#xff0c;由Atom和Tree-sitter的创建者开发。它也是开源的。” Zed主打“高性能”&…

4. kvm存储虚拟化

kvm存储虚拟化 一、命令行工具管理虚拟磁盘1、查看虚拟磁盘2、添加磁盘3、删除磁盘 二、qcow2格式的磁盘文件1、创建磁盘文件2、差量镜像/快速创建虚机2.1 创建差量镜像2.2 准备配置文件2.3 创建虚拟机2.4 批量部署虚拟机 三、存储池 storage pool1、类型2、在线迁移2.1 规划后…

CentOS6用文件配置IP模板

CentOS6用文件配置IP模板 到 CentOS6.9 , 默认还不能用 systemctl , 能用 service chkconfig sshd on 对应 systemctl enable sshd 启用,开机启动该服务 ### chkconfig sshd on 对应 systemctl enable sshd 启用,开机启动该服务 sudo chkconfig sshd onservice sshd start …

LLM应用构建前的非结构化数据处理(三)文档表格的提取

1.学习内容 本节次学习内容来自于吴恩达老师的Preprocessing Unstructured Data for LLM Applications课程&#xff0c;因涉及到非结构化数据的相关处理&#xff0c;遂做学习整理。 本节主要学习pdf中的表格数据处理 2.环境准备 和之前一样&#xff0c;可以参考LLM应用构建前…

墨西哥:海外新闻稿媒体分发-海外pr发稿干货分享-大舍传媒

大舍传媒&#xff1a;海外新闻稿媒体分发平台 墨西哥观查者 (mexicoviewer) 墨西哥观查者是墨西哥一家知名的新闻媒体平台&#xff0c;该平台专注于报道墨西哥国内外的时事新闻、政治、经济、文化等多个领域的内容。其更新速度快&#xff0c;报道对象广泛&#xff0c;深受墨西…

WindowsMac共享文件夹设置

共享文件夹设置 共享文件夹设置Windows系统设置步骤一&#xff1a;设置共享文件夹步骤二: 访问共享文件夹 Mac系统中设置共享文件夹步骤一&#xff1a;设置共享文件夹步骤二&#xff1a;访问共享文件夹 小贴士结论 共享文件夹设置 有时需要在多台电脑之间共享文件夹&#xff0…

14-58 剑和诗人32 - 使用矢量数据库增强 LLM 应用程序

GPT-4、Bloom、LaMDA 等大型语言模型 (LLM) 在生成类似人类的文本方面表现出了令人印象深刻的能力。然而,它们在事实准确性和推理能力等方面仍然面临限制。这是因为,虽然它们的基础是从大量文本数据中提取统计模式,但它们缺乏结构化的知识源来为其输出提供依据。 最近,我们…

生产者消费者模型和线程同步问题

文章目录 线程同步概念生产者消费者模型条件变量使用条件变量唤醒条件变量 阻塞队列 线程同步概念 互斥能保证安全,但是仅有安全不够,同步可以更高效的使用资源 生产者消费者模型 下面就基于生产者消费者来深入线程同步等概念: 如何理解生产消费者模型: 以函数调用为例: 两…

VBA实现Excel数据排序功能

前言 本节会介绍使用VBA如何实现Excel工作表中数据的排序功能。 本节会通过下表数据内容为例进行实操&#xff1a; 1. Sort 单列排序 语法&#xff1a;Sort key1,Order1 说明&#xff1a; Key1&#xff1a;表示需要按照哪列进行排序 Order1&#xff1a;用来指定是升序xlAsce…