计算机系统应用教程网站

网站首页 > 技术文章 正文

webrtc之一对一通话实战与原理(3)

btikc 2024-10-02 12:12:51 技术文章 11 ℃ 0 评论

0.引言

本篇文章主要是讲解媒体协商的有关知识,为后面实战写代码做好准备。本篇文章也是连载,可以参考前面的文章,参考列表如下:

websocket聊天实战(4)之js补充

WebSocket基础讲解(1)

websocket聊天实战(3)

websocket聊天实战(1)

WebSocket基础讲解(2)

webrtc实战打开摄像头和麦克风

详细讲解webrtc原理(1)

webrtc之一对一通话实战与原理(2)

webrtc之一对一通话原理(1)


1.重要接口讲解

1.1 createOffer

基本格式

aPromise = myPeerConnection.createOffer([options])?

[options]包括以下重要字段,说明如下:

var options = { 
   offerToReceiveAudio: true, // 告诉另一端,你是否想接收音频,默认true 
  offerToReceiveVideo: true, // 告诉另一端,你是否想接收视频,默认true 
  iceRestart: false, // 是否在活跃状态重启ICE网络协商 
  };

https://webrtc.github.io/samples/src/content/peerconnection/restart-ice/

iceRestart:只有在处于活跃的时候,iceRestart=false才有作用。

1.2 createAnswer

在源码中的基本格式,表示如下:

aPromise = RTCPeerConnection .createAnswer([ options ]);

注意:目前createAnswer的options是无效的。


1.3 setLocalDescription

在源码中的基本格式,表示如下:

aPromise = RTCPeerConnection .setLocalDescription(sessionDescription);


1.4 setRemoteDescription

在源码中的基本格式,表示如下:

aPromise = pc.setRemoteDescription(sessionDescription);


1.5 加入Stream/Track

addTrack

在源码中的基本格式,表示如下:

rtpSender = rtcPeerConnection .addTrack(track,stream ...);

track:添加到RTCPeerConnection中的媒体轨(音频track/视频track)

stream:getUserMedia中拿到的流,指定track所在的stream


1.6 网络协商

addIceCandidate

在源码中的基本格式,表示如下:

aPromise = pc.addIceCandidate(候选人);

candidate


为了兼容android和web才做如下设置。


1.7 RTCPeerConnection补充

构造函数

在源码中的基本格式,表示如下:

pc = new RTCPeerConnection([ configuration ]);

对于new RTCPeerConnection([configuration]),如果在公网上使用,configuration就一定要有值。对于configuration的值的选择是,一般都是选用第三种max-bundle,也就是都绑定到同一个传输通道,兼容性会更好。

configuration可选

bundlePolicy 一般用max-bundle

(1)banlanced:音频与视频轨使用各自的传输通道。

(2)max-compat:每个轨使用自己的传输通道。

(3)max-bundle:都绑定到同一个传输通道。


1.8 iceTransportPolicy 一般用all

在测试iceTransportPolicy,一般都是用all,但是在测试的时候,建议用relay模式。只有通过中继的方式通了之后,才能说明网络是正真的通了,到公网才能够成功。如果用all模式的话,在局域网内,couturn就算是没有成功,那也能够通话成功。

指定ICE的传输策略

relay:只使用中继候选者。

all:可以使用任何类型的候选者。


1.9 iceServers

其由RTCIceServer组成,每个RTCIceServer都是一个ICE代理的服务器。属性对应如下:

credential:就表示一个密码的意思。

源码中的turn和stun是一定要注意,使用自己的公网地址。打洞可以使用udp或tcp。

1.10 rtcpMuxPolicy

rtcpMuxPolicy 一般用require,rtcp的复用策略,该选项在收集ICE候选者时使用。属性说明如下:

重要事件

(1)onicecandidate表示 收到候选者时触发的事件。

(2)ontrack 表示获取远端流。

(3)onconnectionstatechange表示PeerConnection的连接状态。可以参考如下链接地址:

https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/connectionState

上面这个链接给出的会有很多关于webrtc的API说明,可以值得参考。

界面如下:

部分源码展示:

pc.onconnectionstatechange = function(event) {
switch(pc.connectionState) {
case "connected":
// The connection has become fully connected
break;
case "disconnected":
case "failed":
 // One or more transports has terminated unexpectedly or in an error
 break;
case "closed":
 // The connection has been closed
 break;
 }
 }

onconnectionstatechange ice连接事件,具体参考链接如下:

https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/iceConnectionState


2.测试

谷歌官方给的一个测试例子,链接如下:

https://webrtc.github.io/samples/src/content/peerconnection/restart-ice/

注意:这个链接必须要翻墙才能打开,国内的网站可能是打不开。

测试网站(可以测试简单的音视频通话),界面如下:



谷歌给的官方案例,在源码里加上打印。如下:



当把音频或视频重新获取时,那就需要重新执行candidate。也就是修改这个值后。只有处于活跃的时候,iceRestart=false才有用。



3.总结

本篇文章讲解了wertc视频通话中的一些常用API,还给出谷歌官方提供的测试网站和API的学习,希望对你有帮助。欢迎关注,转发,收藏,点赞

后面关于项目有关的知识,可以关注微信公众号"记录世界 from antonio"

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表