SDP协议基本分析(RTSP、WebRTC使用)

目录

  • 一、介绍
  • 二、标准 SDP 规范
    • 1. SDP 的格式
    • 2. SDP 的结构
      • (1)会话描述
      • (2)媒体描述
  • 三、WebRTC 中的 SDP

一、介绍

SDP(Session Description Protocal)以文本描述各端(PC 端、Mac 端、Android 端、iOS 端等)的能力,
这里的能力指的是各端所支持的:

  1. 音频编解码器是什么,这些编解码器设定的参数是什么
  2. 使用的传输协议是什么
  3. 以及包括的音视频媒体是什么等等。

例子:

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,使用单声道。

1 对 1 WebRTC 处理过程图:
在这里插入图片描述
如上图所示,两个客户端 / 浏览器进行 1 对 1 通话时,首先要进行信令交互,而交互的一个重要信息就是
SDP 的交换。
交换 SDP 的目的是为了让对方知道彼此具有哪些能力,然后根据双方各自的能力进行协商,协商出大家认可
的音视频编解码器、编解码器相关的参数(如音频通道数,采样率等)、传输协议等信息。
如上图所示,阿花 与 阿强进行通讯,它们先各自在 SDP 中记录自己支持的音频参数、视频参数、传输协议等
信息,然后再将自己的 SDP 信息通过信令服务器发送给对方。当一方收到对端传来的 SDP 信息后,它会将接
收到的 SDP 与自己的 SDP 进行比较,并取出它们之间的交集,这个交集就是它们协商的结果,也就是它们最
终使用的音视频参数及传输协议了。

二、标准 SDP 规范

标准 SDP 规范主要包括SDP 描述格式和SDP 结构,而 SDP 结构由会话描述和媒体信息描述两个部分组成。
其中,媒体信息描述是整个 SDP 规范中最重要的知识,它又包括了:
媒体类型
媒体格式
传输协议
传输的 IP 和端口

1. SDP 的格式

SDP 是由多个 type=value 这样的表达式组成的。其中,type是一个字符,value是一个字符串。需
要特别注意的是,“=” 两边是不能有空格的。如下所示:

v=0
o=7017624586836067756 2 IN IP4 127.0.0.1
s=‐
t=0 0
...
v=0

SDP 由一个会话级描述(session level description)和多个媒体级描述(media level description)组成。
会话级(session level)的作用域是整个会话,其位置是从 v= 行开始到第一个媒体描述为止。
媒体级(media level)是对单个的媒体流进行描述,其位置是从 m= 行开始到下一个媒体描述(即下一个
m=)为止。
另外,除非媒体部分重新对会话级的值做定义,否则会话级的值就是各个媒体的缺省默认值。

例子:

v=0
o=7017624586836067756 2 IN IP4 127.0.0.1
s=‐
t=0 0
// 下面 m= 开头的两行,是两个媒体流:一个音频,一个视频。
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126
...
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 122 127 121 125 107 108 109 124 120 123
119 114 115 116
...

每一行都是以一个字符开头,后面紧跟着等于号(=),等于号后面是一串字
符。
从“v=”开始一直到“m=audio”,这之间的描述是会话级的;而后面的两个“m=”为媒体级。从中可以看出,在该
SDP 描述中有两个媒体流,一个是音频流,另一个是视频流。

2. SDP 的结构

了解了 SDP 的格式,下面我们来看一下 SDP 的结构,它由会话描述和媒体描述两部分组成。

(1)会话描述

会话描述的字段比较多,下面四个字段比较重要,我们来重点介绍一下。

第一个,v=(protocol version,必选)。例子:v=0 ,表示 SDP 的版本号,但不包括次版本号。第二个,o=(owner/creator and session identifier,必选)。例子:o=<username> <session id>
<version> <network type> <address type> <address>,该例子是对一个会话发起者的描述。其中,
o= 表示的是对会话发起者的描述;
<username>:用户名,当不关心用户名时,可以用 “-” 代替 ;
<session id> :数字串,在整个会话中,必须是唯一的,建议使用 NTP 时间戳;
<version>:版本号,每次会话数据修改后,该版本值会递增;
<network type> :网络类型,一般为“IN”,表示“internet”;
<address type>:地址类型,一般为 IP4;
<address>:IP 地址。第三个,Session Name(必选)。例子:s=<session name>,该例子表示一个会话,在整个 SDP 中有且只
有一个会话,也就是只有一个 s=。第四个,t=(time the session is active,必选)。例子:t=<start time> <stop time>,该例子描述了会话
的开始时间和结束时间。其中, <start time><stop time> 为 NTP 时间,单位是秒;当<start time><stop time>均为零时,表示持久会话。```

(2)媒体描述

媒体描述的字段也不少,下面我们也重点介绍四个。

第一个,m=(media name and transport address,可选)。例子:m=<media> <port> <transport> <fmt
list>,表示一个会话。在一个 SDP 中一般会有多个媒体描述。每个媒体描述以“m=”开始到下一个“m=”结束。
其中:
<media>:媒体类型,比如 audio/video 等;
<port>:端口;
<transport>:传输协议,有两种——RTP/AVP 和 UDP;
<fmt list>:媒体格式,即数据负载类型 (Payload Type) 列表。第二个,a=*(zero or more media attribute lines,可选)。例子:a=<TYPE>或 a=<TYPE>:<VALUES>, 表示
属性,用于进一步描述媒体信息;在例子中, 指属性的类型, a= 有两个特别的属性类型,即下面要介绍的
rtpmap 和 fmtp。第三个,rtpmap(可选)。例子:a=rtpmap:<payload type> <encoding name>/<clock rate>
[/<encodingparameters>]。
rtpmap 是 rtp 与 map 的结合,即 RTP 参数映射表。
<payload type> :负载类型,对应 RTP 包中的音视频数据负载类型。
<encoding name>:编码器名称,如 VP8、VP9、OPUS 等。
<sample rate>:采样率,如音频的采样率频率 3200048000 等。
<encodingparameters>:编码参数,如音频是否是双声道,默认为单声道。第四个,fmtp。例子:a=fmtp:<payload type> <format specific parameters>。
fmtp,格式参数,即 format parameters;
<payload type> ,负载类型,同样对应 RTP 包中的音视频数据负载类型;
< format specific parameters>指具体参数。

具体的例子:

v=0
o=4007659306182774937 2 IN IP4 127.0.0.1
s=‐
t=0 0
// 以上表示会话描述
...
// 下面的媒体描述,在媒体描述部分包括音频和视频两路媒体
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 // 对 RTP 数据的描述
a=fmtp:111 minptime=10;useinbandfec=1 // 对格式参数的描述
...
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
...
// 上面是音频媒体描述,下面是视频媒体描述
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 122 127 121 125 107 108 109 124 120 123
119 114 115 116
...
a=rtpmap:96 VP8/90000

可以清楚地看到在这段 SDP 片段里包括会话信息与媒体信息。在媒体信息中又包括了音
频流信息和视频流信息。
在音频流和视频流信息中,通过 rtpmap 属性对它们做了进一步的说明。如音频流支持 OPUS 和 ISAC 编码,
OPUS 编码的采样率是 48000,双声道,而 ISAC 编码的采样率可以是 16000 或 32000, 它们都是单声道。
视频流支持 VP8,采样率是 90000(实质是指时钟信息) 。

三、WebRTC 中的 SDP

WebRTC 对标准 SDP 规范做了一些调整,更详细的信息可以看这里,它将 SDP 按功能分成几大块:
Session Metadata,会话元数据
Network Description,网络描述
Stream Description,流描述
Security Descriptions,安全描述
Qos Grouping Descriptions, 服务质量描述

下面这张图清晰地表达了它们之间的关系:
在这里插入图片描述
通过上图我们可以看出,WebRTC 按功能将 SDP 划分成了五部分,即会话元数据、网络描述、流描述、安全
描述以及服务质量描述。WebRTC SDP 中的会话元数据(Session Metadata)其实就是 SDP 标准规范中的
会话层描述;流描述、网络描述与 SDP 标准规范中的媒体层描述是一致的;而安全描述与服务质量描述都是
新增的一些属性描述。
下图我们来看一个具体的例子:

...
//======= 安全描述 ============
a=ice‐ufrag:1uEe // 进入连通性检测的用户名
a=ice‐pwd:RQe+y7SOLQJET+duNJ+Qbk7z// 密码,这两个是用于连通性检测的凭证
a=fingerprint:sha‐256
35:6F:40:3D:F6:9B:BA:5B:F6:2A:7F:65:59:60:6D:6B:F9:C7:AE:46:44:B4:E4:73:F8:60:67:4D:58:E2:EB:
9C //DTLS 指纹认证,以识别是否是合法用户
...
//======== 服务质量描述 =========
a=rtcp‐mux
a=rtcp‐rsiz
a=rtpmap:96 VP8/90000
a=rtcp‐fb:96 goog‐remb // 使用 google 的带宽评估算法
a=rtcp‐fb:96 transport‐cc // 启动防拥塞
a=rtcp‐fb:96 ccm fir // 解码出错,请求关键帧
a=rtcp‐fb:96 nack // 启用丢包重传功能
a=rtcp‐fb:96 nack pli // 与 fir 类似
...
//============= 会话描述 ====================
v=0
o=7017624586836067756 2 IN IP4 127.0.0.1
s=‐
t=0 0
...
//================ 媒体描述 =================
//================ 音频媒体 =================
/*
* 音频使用端口 1024 收发数据
* UDP/TLS/RTP/SAVPF 表示使用 dtls/srtp 协议对数据加密传输
* 111、103 ... 表示本会话音频数据的 Payload Type
*/
m=audio 1024 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126
//============== 网络描述 ==================
// 指明接收或者发送音频使用的 IP 地址,由于 WebRTC 使用 ICE 传输,这个被忽略。
c=IN IP4 0.0.0.0
// 用来设置 rtcp 地址和端口,WebRTC 不使用
a=rtcp:9 IN IP4 0.0.0.0
...
//============== 音频安全描述 ================
//ICE 协商过程中的安全验证信息
a=ice‐ufrag:khLS
a=ice‐pwd:cxLzteJaJBou3DspNaPsJhlQ
a=fingerprint:sha‐256

上面的 SDP 片段是摘取的 WebRTC SDP 中的安全描述与服务质量描述,这两块描述在标准 SDP 规范中没有
明确定义,它更多属于 WebRTC 业务的范畴。
其中,安全描述起到两方面的作用,一方面是进行网络连通性检测时,对用户身份进行认证;另一方面是收发
数据时,对用户身份的认证,以免受到对方的攻击。从中可以看出 WebRTC 对安全有多重视了
服务质量描述指明启动哪些功能以保证音视频的质量,如启动带宽评估,当用户发送数据量太大超过评估的带
宽时,要及时减少数据包的发送;启动防拥塞功能,当预测到要发生拥塞时,通过降低流量的方式防止拥塞的
发生等等,这些都属于服务质量描述的范畴。

为便于你更好地理解和使用 SDP,接下来看一个真实的例子。
下面这段 SDP 是我从一个真实的 1 对 1 场景中截取出来的 WebRTC SDP 的片段。并对 SDP 上做了详细的
注释。

//============= 会话描述 ====================
v=0
o=7017624586836067756 2 IN IP4 127.0.0.1
s=‐
t=0 0
...
//================ 媒体描述 =================
//================ 音频媒体 =================
/*
* 音频使用端口 1024 收发数据
* UDP/TLS/RTP/SAVPF 表示使用 dtls/srtp 协议对数据加密传输
* 111、103 ... 表示本会话音频数据的 Payload Type
*/
m=audio 1024 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126
//============== 网络描述 ==================
// 指明接收或者发送音频使用的 IP 地址,由于 WebRTC 使用 ICE 传输,这个被忽略。
c=IN IP4 0.0.0.0
// 用来设置 rtcp 地址和端口,WebRTC 不使用
a=rtcp:9 IN IP4 0.0.0.0
...
//============== 音频安全描述 ================
//ICE 协商过程中的安全验证信息
a=ice‐ufrag:khLS
a=ice‐pwd:cxLzteJaJBou3DspNaPsJhlQ
a=fingerprint:sha‐256
FA:14:42:3B:C7:97:1B:E8:AE:0C2:71:03:05:05:16:8F:B9:C7:98:E9:60:43:4B:5B:2C:28:EE:5C:8F3:17
...
//============== 音频流媒体描述 ================
a=rtpmap:111 opus/48000/2
//minptime 代表最小打包时长是 10ms,useinbandfec=1 代表使用 opus 编码内置 fec 特性
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:9 G722/8000
...
//================= 视频媒体 =================
m=video 9 UDP/TLS/RTP/SAVPF 100 101 107 116 117 96 97 99 98
...
//================= 网络描述 =================
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
...
//================= 视频安全描述 =================
a=ice‐ufrag:khLS
a=ice‐pwd:cxLzteJaJBou3DspNaPsJhlQ
a=fingerprint:sha‐256
FA:14:42:3B:C7:97:1B:E8:AE:0C2:71:03:05:05:16:8F:B9:C7:98:E9:60:43:4B:5B:2C:28:EE:5C:8F3:17
...
//================ 视频流描述 ===============
a=mid:video
...
a=rtpmap:100 VP8/90000
//================ 服务质量描述 ===============
a=rtcp‐fb:100 ccm fir
a=rtcp‐fb:100 nack // 支持丢包重传,参考 rfc4585
a=rtcp‐fb:100 nack pli
a=rtcp‐fb:100 goog‐remb // 支持使用 rtcp 包来控制发送方的码流
a=rtcp‐fb:100 transport‐cc
...

从上面这段 SDP 中你应该可以总结出:SDP 是由一个会话层和多个媒体层组成的;而对于每个媒体层,
WebRTC 又将其细划为四部分,即媒体流、网络描述、安全描述和服务质量描述。
并且在上面的例子中有两个媒体层——音频媒体层和视频媒体层,而对于每个媒体层,也都有对应的媒体流描
述、网络描述、安全描述及服务质量描述。

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

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

相关文章

MFC六大关键技术(第四部分)——永久保存(串行化)

MFC 六大关键技术 ( 第四部分 ) ——永久保存&#xff08;串行化&#xff09; 先用一句话来说明永久保存的重要&#xff1a;弄懂它以后&#xff0c;你就越来越像个程序员了&#xff01; 如果我们的程序不需要永久保存&#xff0c;那几乎可以肯定是一个小玩儿。那怕我们的记事本…

在网络中配置思科交换机

By default, all ports of a switch are enabled. As we are talking about layer 2 switching, there is no need to configure IP address or any routing protocol on the switch. In such a situation, the configuration is not focused on the switch. 缺省情况下&#…

黑色背景下,描绘照片的轮廓形状并保存

描绘照片的轮廓形状并保存 import cv2 from matplotlib import pyplot as plt # 1.先找到轮廓 img cv2.imread(E:\Python-workspace\OpenCV\OpenCV/beyond.png, 0) _, thresh cv2.threshold(img, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU) image, conturs, hierarchy c…

java pdf合并_Java 合并、拆分PDF文档

本文将介绍如何在Java程序中合并及拆分PDF文档&#xff0c;合并文档时&#xff0c;包括合并多个不同PDF文档为一个文档&#xff0c;以及合并PDF文档的不同页面为一页&#xff1b;拆分文档是&#xff0c;包括将PDF文档按每一页拆分&#xff0c;以及按指定页数范围来拆分。下面将…

HDU4405 期望

对于期望&#xff0c;首先&#xff0c;对于这个公式中p表示概率&#xff0c;x表示随机变量 展开则为 ex p1*x1p2*x2p3*x3....... 对于本题 假设 ex[ i ]表示当前 i 走到 n 的期望值。所以若 i 处没有飞机&#xff0c;ex[ i ]sigma(1/6*ex[ik])1 其中(k1...6) &#xff08;1表示…

调用本地电脑摄像头并进行按P进行捕获照片并保存,按下Q退出

调用本地电脑摄像头并进行按P进行捕获照片并保存&#xff0c;按下Q退出 灰度摄像头显示&#xff1a; import cv2 cap cv2.VideoCapture(0) if not cap.isOpened():print("Cannot open camera")exit() while True:# 逐帧捕获ret, frame cap.read()# 如果正确读取帧…

intersect函数_PHP array_intersect()函数与示例

intersect函数PHP array_intersect()函数 (PHP array_intersect() Function ) array_intersect() function is used to find the matched elements from two or more elements. Function “array_intersect()” compares the values of the first array with the other arrays …

很全的SQL注入语句

1、返回的是连接的数据库名and db_name()>02、作用是获取连接用户名and user>03、将数据库备份到Web目录下面;backup database 数据库名 to diskc:\inetpub\wwwroot\1.db;--4、显示SQL系统版本and 1(select VERSION) 或and 1convert(int,version)--5、判断xp_cmdshell扩展…

使用DataTable更新数据库

1、修改数据 DataRow dr hRDataSet.Tables["emp"].Rows.Find(textBox3.Text);//DataRow dr hRDataSet.Tables["emp"].Select("id"textBox3.Text)[0];dr.BeginEdit();dr["name"] textBox1.Text;dr.EndEdit();SqlCommandBuilder cmdn…

java异常体系_JAVA异常体系结构详解

一、什么是异常异常&#xff1a;程序在运行过程中发生由于硬件设备问题、软件设计错误等导致的程序异常事件。(在Java等面向对象的编程语言中)异常本身是一个对象&#xff0c;产生异常就是产生了一个异常对象。 ——百度百科二、异常体系Java把异常当作对象来处理&#xf…

对照片质量进行压缩

对照片质量进行压缩 其实无论是jpg还是png都是已经压缩编码化的格式罢了&#xff0c;原图片的大小要远远大于压缩编码后的格式 1&#xff0c;像素&#xff1a;图片放大到一定程度之后的一个个的小方块 2&#xff0c;RGB&#xff1a;每一个像素&#xff08;小方块&#xff09;都…

Silverlight访问 Apache服务器(Tomcat,Geronimo)中部署的Webservice

Silverlight 访问 Apache服务器中的Webservice 开发环境 Vs2010 、 Silverlight4 、 Java Jdk1.6 U 21 、 Apache-tomcat-6.0.20 、 Myeclipse8.5 、 Apache-ant-1.8.1 、 Axis2 、 Geronimo-tomcat6-javaee5-2.2. 下载地址&#xff1a; Apache-tomcat &#xff1a; http://apa…

那些帮助你成为优秀前端工程师的讲座——《性能篇》

这篇文章是前端优秀讲座和讨论列表系列连载第七篇&#xff0c;介绍前端性能优化技巧。前端领域发展迅速&#xff0c;只有时刻掌握前端发展趋势和技术动态&#xff0c;学习前沿的开发思想和理念才能让自己跟上时代的步伐&#xff0c;保持自己的技术优势。 您可能感兴趣的相关文章…

mca终端_MCA的完整形式是什么?

mca终端1)MCA&#xff1a;计算机应用硕士 (1) MCA: Master of Computer Application) MCA is an abbreviation of Master of Computer Application. It is a masters degree program for post-graduation in Computer applications. This post-graduate course duration is abo…

钢铁侠java_现代版“钢铁侠”,无所不能的程序员,java工程师实现人造器官!...

一位名叫利亚姆泽贝迪(Liam Zebedee)的软件工程师已经厌倦了糖尿病患者的生活挑战&#xff0c;因此他决定入侵他的胰岛素泵&#xff0c;并将其转变成一种崭新的高科技胰腺胰腺。Zebedee详细介绍了查找和订购零件的过程&#xff0c;为智能胰岛素泵编写软件的代码以及在其博客中组…

Windows下的Memcache安装 (转)

Windows下的Memcache安装&#xff1a;1. 下载memcache的windows稳定版&#xff0c;解压放某个盘下面&#xff0c;比如在c:\memcached2. 在终端&#xff08;也即cmd命令界面&#xff09;下输入 ‘c:\memcached\memcached.exe -d install’ 安装3. 再输入&#xff1a; ‘c:\memca…

C#中实现js中的eval函数功能

在js中有eval函数&#xff0c;比如 eval&#xff08;‘33*4’&#xff09;结果为15&#xff1b; 但C#中想要完成这样的功能&#xff0c;却没有相应的函数&#xff0c;可以用sql语句的方式实现&#xff0c;比如&#xff0c;执行 select 33*4 的方式。 可以先构造公式 Formula …

查看照片的指定位置的像素点值,并在照片中绘制一条指定像素颜色的线段

查看照片的指定位置的像素点值&#xff0c;并在照片中绘制一条指定像素的线段 import cv2 img cv2.imread(E:\Python-workspace\OpenCV\yanyu/beyond.png,1)#1为彩色图片&#xff0c;0为灰度图片 (b,g,r) img[20,20]#取照片的(20,20)处的像素点&#xff0c;左上角为(0,0)&am…

大数据和云计算涉及的技术_云计算涉及的风险

大数据和云计算涉及的技术In todays life using of cloud is very common among people, we use different clouds like Google cloud, cloud Azure etc. to store our photos, Videos, documents, data etc. to save space as well as we think that we will be able to retri…

int 转interger java_Java中Integer和int之间的转换

int到Integer:int a3;Integer Anew Integer(a);或:Integer AInteger.valueOf(a);Integer到int:Integer Anew Integer(5);int aA.intValue();至于Integer.parseInt(String str)则是将String类型转为int类型。int类型是放在栈空间的&#xff0c;Integer是作为对象放在堆空间的;in…