6┃音视频直播系统之 WebRTC 核心驱动SDP规范协商
Posted autofelix
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了6┃音视频直播系统之 WebRTC 核心驱动SDP规范协商相关的知识,希望对你有一定的参考价值。
〝 古人学问遗无力,少壮功夫老始成 〞
随着5G技术的发展,音视频直播领域发生了翻天覆地的变化,尤其是 2011 年 Google 推出 WebRTC 技术后,大大降低了音视频技术的门槛,你再也不必自己去实现回音消除算法了,也不用自己去实现各种音视频的编解码器了,更不必去考虑跨平台的问题了。如果这篇文章能给你带来一点帮助,希望给飞兔小哥哥一键三连,表示支持,谢谢各位小伙伴们。
目录
一、什么是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规范协商的主要内容,如果未能解决你的问题,请参考以下文章
4┃音视频直播系统之浏览器中通过 WebRTC 进行桌面共享
10┃音视频直播系统之 WebRTC 中的数据统计和绘制统计图形
12┃音视频直播系统之 WebRTC 实现1对1直播系统实战
2┃音视频直播系统之浏览器中通过 WebRTC 拍照片加滤镜并保存