对SDP的理解

article/2025/9/23 12:18:31

一、SDP 是什么

SDP(Session Description Protocal)会话描述协议
主要用于两个会话开始之前的媒体协商,用于建立会话的。
这里要分清会话:SIP协议也是只是用来建立会话的,真正的会话说白了是媒体传输,而在媒体传输之前的工作都时为这个会话建立做的准备工作
SDP就是用文本描述的通信各端(PC 端、Mac 端、Android 端、iOS 端等)的能力。这里的能力指的是各端所支持的音频编解码器是什么,这些编解码器设定的参数是什 么,使用的传输协议是什么,以及包括的音视频媒体是什么等等。

v=0 o=- 3409821183230872764 2 IN IP4 127.0.0.1... 
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126 
...
a=rtpmap:111 opus/48000/2 
a=rtpmap:103 ISAC/16000 
a=rtpmap:104 ISAC/32000 
...

上面的 SDP 片段所示,该 SDP 中描述了一路音频流,即m=audio,该音频支持的 Payload ( 即数据负载 ) 类型包括 111、103、104 等等。 在该 SDP 片段中又进一步对 111、103、104 等 Payload 类型做了更详细的描述,如 a=rtpmap:111 opus/48000/2 表示 Payload 类型为 111 的数据是 OPUS 编码的音频数 据,并且它的采样率是 48000,使用双声道。以此类推,你也就可以知道 a=rtpmap:104 ISAC/32000 的含义是音频数据使用 ISAC 编码,采样频率是 32000,使用单声道。

二、SDP 作用

RTSP用到的SDP主要用来描述服务端和客服端通信的端口等信息。
这里先拓展说一些sip中用到的sdp:
sip两个客户端 进行 1 对 1 通话时,首先要进行信令交互,而交互的一 个重要信息就是 SDP 的交换。 交换 SDP 的目的是为了让对方知道彼此具有哪些能力,然后根据双方各自的能力进行协 商,协商出大家认可的音视频编解码器、编解码器相关的参数(如音频通道数,采样率 等)、传输协议等信息。 举个例子,A 与 B 进行通讯,它们先各自在 SDP 中记录自己支持的音频参数、视频参数、 传输协议等信息,然后再将自己的 SDP 信息通过信令服务器发送给对方。当一方收到对端 传来的 SDP 信息后,它会将接收到的 SDP 与自己的 SDP 进行比较,并取出它们之间的交 集,这个交集就是它们协商的结果,也就是它们最终使用的音视频参数及传输协议了。
所以对于pjsip这个库,如果我想用自己的RTP库传输媒体流:
1、SDP可以进行协商传输
2、PJSIP库中有RTP传输部分,只需要将这部分RTP传输换成自己的。

无论你是用微信进行视频电话还是开Zoom视频会议,按照OSI网络七层参考模型,我们进行这些活动之前一般都要先建立一组会话。在建立会话的过程中,我们需要描述下会话的一些信息,描述这种会话能力时用到了SDP协议,也就是会话描述协议Session Description Protocol,协议详细内容在RFC4566中规定。
这么说可能不够直白,大白话解释就是:由于Web端、IOS、Android、PC、MAC端的差异性导致它们对音视频的支持能力不同,所以我们进行一些音视频会话之前,需要交互下彼此的音视频编解码能力、网络带宽和传输协议等信息,这些需要协商的信息需要用SDP来描述。
注意的是SDP虽然具备这些能力参数信息的描述功能,但是SDP并不是传输协议,需要用RTSP、SIP、HTTP等协议进行承载传输、交换,如果大家协调好了之后,就可以建立会话,完成真实的音视频码流传输,再完成解码和播放。
这篇文章主要讲下SDP协议格式和规范、具备哪些描述能力、最后再通过在RTSP和基于SIP的国标协议进行实例分析下,当然目前比较火的WebRTC在建立音视频会话前也是通过这套协议描述会话信息的。SDP应用在任何场景和行业标准中,一般都进行了裁剪和进一步的规范,如果你要了解所有的SDP信息,你可以参考RFC4566文档
SDP格式和规范
SDP场景:
SDP一般用在媒体会话建立之前,可以适用于实时流媒体、点播、直播等领域,特别在音视频通话、视频会议、VoIP、视频监控等领域应用较多。媒体码流一般基于RTP传输,服务质量用RTCP协议保障。
但是SDP的交互不是所有音视频会话建立时都是必须的,假如双方提前约定好这些音视频会话创建需要的信息就不用这个步骤来交互彼此的SDP信息,比如HTTP-FLV、RTMP-FLV直播和点播方案,因为一旦采用了这套方案,这些音视频会话建立需要的信息都是确定的,但是这样会降低或者说没有充分发挥端到端的音视频能力,协商显得更加灵活点。
SDP作用:
SDP作用包括以下一些方面1)建立会话的详细信息,包括名称,网络,带宽等信息3)包含在会话中的媒体信息,包括: 媒体类型(video, audio, etc) 传输协议(RTP/UDP/IP, H.320, etc) 媒体格式(H.261 video, MPEG video, etc) 多播或远端(单播)地址和端口4)为接收媒体而需的信息5)使用的带宽信息6)可信赖的接洽信息
SDP格式:
标准的SDP规范主要包括SDP描述格式和SDP结构,其中SDP结构里面最重要的两项内容是会话描述信息和媒体描述信息。
说了这么多,先上个SDP的示例,有个SDP的直观认识:
示例分析:

RTSP中的SDP:
RTSP即Real Transport Stream Protocol实时流媒体传输协议,一般和RTP、RTCP搭配使用,该协议用来进行媒体的控制和会话的建立,比如开始、暂停、倍速控制媒体文件的播放,RTP协议用来进行码流的传输,RTCP保障服务的Qos质量。该协议的应用场景在视频监控最多,一般的视频监控产品如摄像机、NVR等都原生支持RTSP协议,同时该协议在一些智能家居方面如智能音箱也有所使用,比如AWS Alexa在进行视频投屏时就支持该协议。
这里只探讨下RTSP协议的创建媒体会话时,用SDP交互会话信息时的情况,顺便给大家一个测试地址,然后用VLC播放视频抓包就可以学习RTSP、RTP协议,RTSP协议默认端口554

这是抓包在DESCRIBE信令的SDP信息:
在这里插入图片描述
会话描述协议:
v=0
解释:版本号,一般默认是0;
o=- 1422341101 1422341101 IN IP4 3.84.6.190
解释:会话发起者信息会话名称 网络类型 IP地址等信息;
s=BigBuckBunny_115k.mov
解释:会话名称
c=IN IP4 3.84.6.190
解释:
格式:c=


链接信息,包含网络类型和IP地址等信息;
a=range:npt=0- 596.48
解释:用来表示媒体流的长度为596.48秒
音频媒体描述信息:
m=audio 0 RTP/AVP 96
解释:表示该路会话的的audio是通过RTP来格式传送的,其payload值为96但是传送的端口还没有定。
a=rtpmap:96 mpeg4-generic/12000/2
解释:rtpmap的信息,表示音频为AAC的其sample采样率为12000双通道音频,其中mpeg4-generic代表了AAC的互联网媒体类型。
a=fmtp:96 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3;config=1490
解释:这里面是AAC的详细编码和封装信息:
profile-level-id=1;mode=AAC-hbr;
profile中指定1表示低复杂度类型,mode=AAC-hbr代表编码模式;
sizelength=13;indexlength=3;indexdeltalength=3
涉及到AAC的AU Header,如果一个RTP包则只包含一个AAC包,则没有这三个字段,有则说明是含有AU Header字段,具体参考RTP对音频AAC的封装。
AU-size由sizeLength决定表示本段音频数据占用的字节数
AU-Index由indexLength决定表示本段的序号, 通常0开始
AU-Index-delta由indexdeltaLength 决定表示本段序号与上一段序号的差值
;config=1490十六进制:1490
二进制:0001 0100 1001 0000
十进制:2、9、2
分别代表aac的profile是2、9代表采样率是12000,通道个数是2立体声,具体参考AAC的ADTS头定义。
a=control:trackID=1
解释:通过媒体流1来发送音频;
视频媒体描述信息:
m=video 0 RTP/AVP 97
解释:表示该路会话的的audio是通过RTP来格式传送的,其payload值为97但是传送的端口还没有定。
a=rtpmap:97 H264/90000
解释:表示该路会话的的Video是通过RTP来格式传送的,其payload值为97,编码器是H264,采样率90000。
a=fmtp:97 packetization-mode=1;profile-level-id=42C01E;sprop-parameter-sets=Z0LAHtkDxWhAAAADAEAAAAwDxYuS,aMuMsg==
解释:这里面包含一些RTP封包模式,视频质量等级,视频的SPS、PPS等信息。
表示该路会话的的audio是通过RTP来格式传送的,其payload值为97。
当 packetization-mode 的值为 1 时RTP打包H.264的NALU单元必须使用非交错(non-interleaved)封包模式.
当 profile-level-id的值为 42C01E 时, 第一个字节0x42表示 H.264 的 profile_idc类型Baseline profile , 第二字节代表profile_iop,各个Bit代表视频序列遵循的条款,第三个字节表示 H.264 的 Profile 级别,0x1E即30代表了levle_idc为3,即30/3,具体信息参考H.264的SPS PPS即可。
sprop-parameter-sets是SPS和PPS的的Base64之后的字符串,中间以逗号分割,后面会专门写篇文章介绍下,主要描述了编码器的参数信息,对初始化播放器有帮助;
a=cliprect:0,0,160,240
解释:一些offer和answer的加密属性;
a=framesize:97 240-160
解释:RTP负载类型97,帧宽和高分别为240*160
a=framerate:24.0
解释:最大帧率速度为24帧/s
a=control:trackID=2
解释:通过媒体流1来发送视频;
基于SIP协议国标GB28181中的SDP:
国标协议也是基于SIP协议开发的,所以这里的SDP协议是在给前端设备下发INVITE信令的回复中带上来的,这里的SDP主要是为了不同的厂家,使用 GB 对接的时候,上级要能正常看下级推送过来的摄像头的视频,回放,以及球机控制等等的功能。

现在看一个抓包文件中INVITE回复携带的SDP描述信息:
在这里插入图片描述会话信息描述国标的规定:

  1. v=0
    v字段给出了 SDP 的版本,当前规范版本是 0,这个版本没有小号版本。
  2. o=
    源(客户端的SIP编号)<用户名><会话 ID><会话版本><网络类型><地址类型><单播地址>
    如 32028100001320000001 0 0 IN IPV4 192.168.0.101
    各个字段解释:
    <用户名> 用户登录的源主机名字,如果不能提供则用"-"表示,用户名不能包含空格。这
    里一般是摄像机的国标 ID
    <会话 ID> 是一个字符串,<用户名><会话 ID><网络类型><单播地址>这个组合形成该会话
    的唯一标识。用 0 标识的居多
    <会话版本> 会话版本号,推荐使用 NTP 时间戳。用 0 标识的居多
    <网络类型> 目前是 IN 代表 internet,未来可能会有其他值。
    <地址类型> 目前只有 IPV4 和 IPV6 两种,目前主要是 IPV4,。
    <单播地址> 创建会话的主机地址。一般为媒体服务器的地址。
    注意:有时候处于某种原因,用户名和 IP 不想明确表示,只要保证 o 字段全球唯一,用户名和 IP 可以随机。
  3. s=
    请求媒体流的操作类型,play 代表实况;playback 代表回放。download 代表下载,Talk
    代表语音。
  4. u=
    行应填写视音频文件的 URI。 该 URI 取值有两种方式: 简捷方式和普通方式。
    简捷方式常用 摄像机 ID:其他参数格式。如 32028100001320000001:10111
    普通方式采用 http://存储设备 ID[/文件夹]* /文件名, [/文件夹]* 为 0-N 级文件夹。
    简捷方式中冒号后面文件类型,如果s=playback时,则0有时代表的全天录像,1代表事件录像等,一般默认为3.有些海康平台这里进行了区分,如果值填错会导致回放录像失败。
  5. c=
    <网络类型><地址裂类型><链接地址>
    如 IN IPV4 192.168.0.100
    6.t=
    t字段在回放和下载时,t 行值为开始时间和结束时间。使用的时间为 UNIX 时间戳,需要
    用 UNIX 时间戳转为北京时间。如果是直播则是0.
    媒体信息描述国标的规定:
  6. m=
    m 字段描述媒体类型,媒体端口,媒体协议,以及媒体负载方式
    例:
    m=video 6000 RTP/AVP 96------媒体类型视频或视音频,传输端口 6000,RTP over UDP,负载
    类型 96
    m=video 6000 TCP/RTP/AVP 96------媒体类型视频或视音频,传输端口 6000,RTP over TCP,负
    载类型 96
    m=audio 6000 RTP/AVP 8------媒体类型为音频,传输端口 6000,RTP over UDP,负载类型 8
  7. a=
    a=rtpmap: / [/ ] 中的这里参考RTSP分析即可,要说的一点是这里可以携带设备厂商的编码类型,如果发现这里不是标准的,则解码和播放一般都存在问题;
    a=downloadspeed: 下载倍速(取值为整型) ;
    a=filesize: 文件大小(单位:Byte) , a 字段可携带文件大小参数, 用于下载时的进度计算。
    下面可以参考IETF RFC4571的规定,解析setup connection recvonly等属性:
    a=setup:TCP 连接方式(表示本 SDP 发送者在 RTP over TCP 连接建立时是主动还是被动发
    起 TCP 连接, “active”为主动, “passive”为被动)
    a=connection:new (表示采用 RTP over TCP 传输时新建或重用原来的 TCP 连接, 可固定采
    用新建 TCP 连接的方式)
    a=recvonly 只接受(收流端)只用于媒体,不用于控制协议
    a=sendonly 只发送(发流端)只用于媒体,不用于控制协议
    y 字段:由 10 位十进制整数组成的字符串,表示 SSRC 值
    第一位为 0 代表实况,为 1 则代表回放, 第二位至第六位由监控域 ID 的第 4 位到第 8 位组成,最后 4 位为不重复的 4 个整数 ;
    有了以上基础分析国标SIP中的SDP信息就非常简单了,不再赘述。

http://chatgpt.dhexx.cn/article/iASXUGeA.shtml

相关文章

RTSP服务器:RTP传输AAC流

工作流程&#xff1a; 1&#xff09;读取ADTS头&#xff08;7字节&#xff09;&#xff0c;解析得到aac帧的信息&#xff08;频率&#xff0c;声道&#xff0c;帧长度&#xff09; 2&#xff09;读取aac原始数据块&#xff0c;使用RTP打包aac原始数据 RTP打包h264码流时&…

webrtc会话建立

WebRTC SDP 解析 还我漂漂拳哒哒哒关注 0.5032019.03.06 13:01:21字数 1,954阅读 3,150 sdp&#xff08;Session Description Protocol&#xff09;是一种会话描述协议&#xff0c;属于文本协议&#xff0c;即WebRTC中常说的信令&#xff08;Signalling&#xff09;&#xff…

H.264视频的RTP有效负载格式 (RFC-3984)

RFC文档链接 本备忘录的状态 略 摘要 本备忘录描述了ITU-T建议的H.264视频编解码器和技术上相同的ISO/IEC国际标准14496-10视频编解码器的RTP有效载荷格式。RTP有效载荷格式允许在每个RTP有效载荷中对H.264视频编码器产生的一个或多个网络抽象层单元&#xff08;NALU&#…

音视频协议-RTP协议打包

目录 H264打包RTP的方法 RTP打包AAC 1. H264打包RTP的方法 RTP的特点不仅仅支持承载在UDP上&#xff0c;这样利于低延迟音视频数据的传输&#xff0c;另外一个特点是它允许通过其它协议接收端和发送端协商音视频数据的封装和编解码格式&#xff0c;这样固定头的playload typ…

webRTC原理及信令简介

WebRtc基本概念及协议介绍 术语 Signaling channel(信令通道) a) 一种资源&#xff0c;使应用程序可以通过交换信令消息来发现&#xff0c;建立&#xff0c;控制和终止对等连接 b) 信令消息是两个应用程序相互交换以建立对等连接的元数据。该元数据包括本地媒体信息&#xff0…

国网B接口调阅实时视频(INVITE)接口描述和消息示例

前面三篇blog分别介绍国网B接口注册、资源上报和资源信息获取&#xff0c;今天过一下国网B接口调阅实时视频相关的接口描述和消息示例&#xff0c;做过GB28181设备接入的都知道&#xff0c;国网B接口调阅实时视频流程和GB28181的基本一致的&#xff0c;区别在于SDP的一些参数描…

SIP协议之PRACK机制

SIP PRACK&#xff08;Provisional Response ACKnowledgement&#xff09;是由SIP的扩展协议RFC3262定义的&#xff0c;旨在为SIP的临时应答提供传输的可靠性。扩展机制使用选项100rel和临时应答方法PRACK实现。该机制同SIP协议中的2xx对INVITE应答的可靠机制类似。 流程图&am…

HackTheBox: Arctic靶场

废话不多说直接开始&#xff1a; 第一步是在计算机上运行NMAP&#xff1a; # Nmap 7.80 scan initiated Sat Sep 19 14:54:46 2020 as: nmap -sV -O -sC -p- -oN scan 10.10.10.11 Nmap scan report for 10.10.10.11 Host is up (0.021s latency). Not shown: 65532 filtered…

webrtc sdp详解

SDP&#xff08;Session Description Protocol&#xff09;是一种通用的会话描述协议&#xff0c;主要用来描述多媒体会话&#xff0c;用途包括会话声明、会话邀请、会话初始化等。 WebRTC主要在连接建立阶段用到SDP&#xff0c;连接双方通过信令服务交换会话信息&#xff0c;…

SIP协议之呼叫流程

SIP呼呼叫是SIP协议最基本的功能。一个用户呼叫另外一个用户最终完成多媒体通话。此处以常见的B2BUA的服务器模式进行介绍。 环境说明&#xff1a; 主叫&#xff1a;1006 192.168.1.131 被叫&#xff1a;1012 192.168.0.24 SIP服务器&#xff08;以下简称服务器&#xff09;…

GB/T 28181-2011、2016、2022变更对比

一、GB/T 28181-2016与GB/T 28181-2011变更对比 GB/T 28181-2016与GB/T 28181-2011相比&#xff0c; 除编辑性修改外主要技术变化如下&#xff1a; ----(1) 修改了标准名称&#xff1b; ----(2) 增加了媒体流TCP传输要求(见4.3.1&#xff0c; 5.2&#xff0c;附录F&#xff…

会话描述协议-SDP

目录 一. 前言 二. 标准SDP规范说明 会话级描述 媒体级描述 三. WebRTC的SDP 会话描述 媒体信息描述 网络描述 安全描述 服务质量描述 四. 其他 一. 前言 SDP&#xff08;Session Description Protocol&#xff09; 是一种通用的会话描述协议&#xff0c;例如在音视…

h264和h265视频流SDP描述详解

文章目录 1 SDP概述 2.SDP媒体描述极其扩展属性 2.1 m属性介绍 2.2 acontrol附加属性介绍 2.3 artpmap附加属性介绍 2.4 afmtp附加属性介绍 SDP&#xff08;Session Description Protocol&#xff09;会话描述协议&#xff0c;是一种用来描述信息格式的标准&#xff0c;它…

表格标签

表格标签 规则表格 不规则表格–跨行和跨列 表格的高级标签–标题标签和逻辑分区标签

Android实现Excel表格样式

原理描述&#xff1a; 想写来着&#xff0c;但是似乎描述不太清楚。效果图来着&#xff0c;没找到好的视频录制软件&#xff0c;直接上代码吧。 代码&#xff1a; 1、xml布局文件 自定义控件的包名删除了部分&#xff0c;需要重新导入自定义控件&#xff01;&#xff01;&a…

Apache POI 操作Excel表格使用详解 最全

1.POI结构与常用类 (1)POI介绍 Apache POI是Apache软件基金会的开源项目&#xff0c;POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 .NET的开发人员则可以利用NPOI (POI for .NET) 来存取 Microsoft Office文档的功能。 (2)POI结构说明 包名称 说明 HSSF 提供…

022_Table表格

1. Table表格例子 1.1. Table表格用于展示多条结构类似的数据, 可对数据进行排序、筛选、对比或其他自定义操作。 1.2. Table Attributes 参数 说明 类型 可选值 默认值 data 显示的数据 array 无 无 height Table的高度, 默认为自动高度。如果height为number类型…

java 导入导出excel表格

java 导入导出excel表格 业务上有需求上传excel表格并读取内容&#xff0c;本文记录一下该方法 表格导入 引入相应的工具包 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>4.4.0&l…

python逻辑回归

出现函数重名问题 异常抛出 异常抛出 #逻辑回归测试 import pandas as pd from sklearn.linear_model import LogisticRegression as LR filename C:/Users/29463/OneDrive/桌面/bankloan.xls data pd.read_excel(filename) #print(data) x data.iloc[:,:8].values y data…

实现带标题的ListView

在一些项目中&#xff0c;往往有要求为ListView里的内容分类&#xff0c;比如按日期分类&#xff0c;就要把相同日期的项目放在一起。可以看一些示例图&#xff0c;会清楚一些&#xff1a; 以上根据标题来进行分类&#xff0c;实现代码如下&#xff1a; 首先是数据项的模型…