一、什么是SDP

  • SDP(Session Description Protocal)其实就是当数据过来时候,告诉数据自己这里支持的解码方式、传输协议等等,这样数据才能根据正确的方式进行解码使用

  • SDP一般包括:媒体类型、媒体格式、传输协议、传输的 IP 和端口

  • SDP的格式大概如下:

  • v=0 :表示 SDP 的版本号

  • o=<username><session id><version><network type><address type><address>:表示一个会话发起者的描述,包括用户名、会话标识、版本号、网络类型、地址类型、IP地址等,如果username不重要的话可以用-代替

  • m=<media><port><transport><fmt list>:表示对媒体的描述,包括媒体类型、端口、传输协议以及媒体格式等

  • rtpmap:是 rtp 与 map 的结合,即 RTP 参数映射表,包括负载类型、编码器名称、采样率、参数等

// 以上表示会话描述
v=0
o=- 4443765930623427689 2 IN IP4 127.0.0.1
s=-
t=0 0 // 下面的媒体描述,在媒体描述部分包括音频和视频两路媒体
m=audio 9 UDP/TLS/RTP/SAVPF 104 100 105 9 8 8 106 105 13 111 312 113 43 // 对音频媒体描述
a=rtpmap:111 opus/72000/2
// 对格式参数的描述
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:103 ISAC/32000
a=rtpmap:104 ISAC/16000 // 对视频媒体描述
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 122 127 121 125 107 108 109 124 120
a=rtpmap:96 VP8/7000

二、什么是规范协商

  • 就是看看你的设备都支持那些编解码器,我的设备是否也支持?如果我的设备也支持,那么咱们双方就算协商成功了

  • 而规范协商的重要性在于,让双方找到共同支持的媒体能力,从而实现彼此之间的音视频通信

  • WebRTC中提供了 RTCPeerConnection 类,来进行端与端之间的连接

var pc = new RTCPeerConnection(pcConfig)

三、规范协商的过程

  • 在通讯双方都创建好 RTCPeerConnection 对象后,它们就可以开始进行规范协商了

  • Offer:在双方通讯时,呼叫方发送的 SDP 消息称为 Offer

  • answer:在双方通讯时,被呼叫方发送的 SDP 消息称为 Answer

四、规范协商的实现

  • createOffer:创建 Offer

  • createAnswer:创建 Answer

  • setLocalDescription:设置本地 SDP 信息

  • setRemoteDescription:设置远端的 SDP 信息

// 呼叫方创建 Offer
// 当呼叫方发起呼叫之前,首先要创建 Offer 类型的 SDP 信息
function doCall() {
console.log('Sending offer to peer');
// 正确触发setLocalAndSendMessage方法,错误触发handleCreateOfferError方法
pc.createOffer(setLocalAndSendMessage, handleCreateOfferError);
} // 可以在该方法里获取到RTCSessionDescription 类型的 SDP 信息
function setLocalAndSendMessage(sessionDescription) {
pc.setLocalDescription(sessionDescription);
sendMessage(sessionDescription);
} // 被呼叫方收到 Offer
// 调用 setRemoteDescription 方法设置呼叫方发送给它的 Offer 作为远端描述
socket.on('message', function(message) {
if (message.type === 'offer') {
pc.setRemoteDescription(new RTCSessionDescription(message));
doAnswer();
}
}); // 被呼叫方创建 Answer
// 被呼叫方会成一个与远程会话兼容的本地会话,并最终将该会话描述发送给呼叫方
function doAnswer() {
pc.createAnswer().then(
setLocalAndSendMessage,
onCreateSessionDescriptionError
);
} // 呼叫方收到 Answer
// 当呼叫方收到 SDP 时,将收到的会话描述设置为一个远程会话
socket.on('message', function(message) {
if (message.type === 'answer') {
pc.setRemoteDescription(new RTCSessionDescription(message));
}
});

6┃音视频直播系统之 WebRTC 核心驱动SDP规范协商的更多相关文章

  1. 8┃音视频直播系统之 WebRTC 信令系统实现以及通讯核心并实现视频通话

    一.信令系统 信令系统主要用来进行信令的交换 在通信双方彼此连接.传输媒体数据之前,它们要通过信令服务器交换一些信息,如规范协商 若 A 与 B 要进行音视频通信,那么 A 要知道 B 已经上线了,同 ...

  2. 5┃音视频直播系统之 WebRTC 中的协议UDP、TCP、RTP、RTCP详解

    一.UDP/TCP 如果让你自己开发一套实时互动直播系统,在选择网络传输协议时,你会选择使用UDP协议还是TCP协议 假如使用 TCP 会怎样呢?在极端网络情况下,TCP 为了传输的可靠性,将会进行反 ...

  3. 12┃音视频直播系统之 WebRTC 实现1对1直播系统实战

    一.搭建 Web 服务器 前面我们已经实现过,但是没有详细说HTTPS服务 首先需要引入了 express 库,它的功能非常强大,用它来实现 Web 服务器非常方便 同时还需要引入 HTTPS 服务, ...

  4. 10┃音视频直播系统之 WebRTC 中的数据统计和绘制统计图形

    一.数据统计 在视频直播中,还有一项比较重要,那就是数据监控 比如开发人员需要知道收了多少包.发了多少包.丢了多少包,以及每路流的流量是多少,才能评估出目前用户使用的音视频产品的服务质量是好还是坏 如 ...

  5. 11┃音视频直播系统之 WebRTC 进行文本聊天并实时传输文件

    一.RTCDataChannel WebRTC 不但可以让你进行音视频通话,而且还可以用它传输普通的二进制数据,比如说可以利用它实现文本聊天.文件的传输等 WebRTC 的数据通道(RTCDataCh ...

  6. 3┃音视频直播系统之浏览器中通过 WebRTC 直播视频实时录制回放下载

    一.录制分类 在音视频会议.在线教育等系统中,录制是一个特别重要的功能 录制一般分为服务端录制和客户端录制 服务端录制:优点是不用担心客户因自身电脑问题造成录制失败(如磁盘空间不足),也不会因录制时抢 ...

  7. 4┃音视频直播系统之浏览器中通过 WebRTC 进行桌面共享

    一.共享桌面原理 共享桌面在直播系统中是一个必备功能 共享者:每秒钟抓取多次屏幕,每次抓取的屏幕都与上一次抓取的屏幕做比较,取它们的差值,然后对差值进行压缩:如果是第一次抓屏或切幕的情况,即本次抓取的 ...

  8. 1┃音视频直播系统之浏览器中通过WebRTC访问摄像头

    一.WebRTC的由来 对于前端开发小伙伴而言,如果用 JavaScript 做音视频处理 在以前是不可想象的,因为首先就要考虑浏览器的性能是否跟得上音视频的采集 但是 Google 作为国际顶尖科技 ...

  9. 2┃音视频直播系统之浏览器中通过 WebRTC 拍照片加滤镜并保存

    一.拍照原理 好多人小时候应该都学过,在几张空白的纸上画同一个物体,并让物体之间稍有一些变化,然后连续快速地翻动这几张纸,它就形成了一个小动画,音视频播放器就是利用这样的原理来播放音视频文件的 播放器 ...

随机推荐

  1. SpringCloudAlibaba 微服务讲解(四)Sentinel--服务容错(二)

    4.7 Sentinel 规则 4.7.1 流控规则 流量控制,其原理是监控应用流量的QPS(每秒查询率)或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的榴莲高峰冲垮,从而保障应用 ...

  2. Linux文件管理 | Liunx 常用命令

    文件与目录基本操作 目录: 一.显示文件内容 cat 命令 more 命令 less 命令 head 命令 tail 命令 二.文件内容查询(grep) 三.文件查找命令 find 命令 locate ...

  3. 纯CSS实现柱形图

    CSS在处理排版之强大,没有做不到,只有想不到.下面我们将一同实现一个柱状图. 先打好一个具体的框架.我们利用无序列表做整体,里面的东西我们根本选择内联无素span,strong,em来填充. < ...

  4. CCF201912-2 回收站选址

    解题思路:这道题唬人的在于坐标有正有负哈,刚开始不知道怎么下爪,仔细思考过后,我可是会面向对象编程的啊哈哈哈哈,我可是最喜欢封装了哈哈哈哈. 1.首先可以把每个点用一个结构体来定义,包含他的x,y坐标 ...

  5. js 图片上传给后台的3种格式

    1. file格式 (创建formData来完成file上传) 我们的接口需求: 代码: <input type="file" id="imgfile" ...

  6. Exchange统计邮箱数量

    以Exchange管理员身份登录,打开PowerShell控制台. 1.查询Exchange组织邮箱数量 键入以下命令. Get-Mailbox | Measure-Objcet 2.查询某数据库邮箱 ...

  7. MFC---视图和窗口

    视类窗口 视类窗口是指程序运行后,显示信息的那一部分.对应的类是CTestOneView(TestOne表示项目名称)类,CTestOneView类是派生于CView类,而CView类又派生于CWnd ...

  8. Java实现单链表的合并(保证数据的有序性)

    一.思路 1.比较两个链表的大小 2.将小链表插入到大链表中 3.使用插入保证链表数据的有序性 二.核心代码 /** * 合并两个链表,并且按照有序合并 * @param singleLinkedLi ...

  9. Shiro+springboot+mybatis+EhCache(md5+salt+散列)认证与授权-03

    从上文:Shiro+springboot+mybatis(md5+salt+散列)认证与授权-02 当每次进行刷新时,都会从数据库重新查询数据进行授权操作,这样无疑给数据库造成很大的压力,所以需要引入 ...

  10. redis集群在线迁移第一篇(数据在线迁移至新集群)实战一

    迁移背景:1.原来redis集群在A机房,需要把其迁移到新机房B上来.2.保证现有环境稳定.3.采用在线迁移方式,因为原有redis集群内有大量数据.4.如果是一个全新的redis集群搭建会简单很多. ...