webRTC机制和peerjs库的介绍在其他博客中已经有了很多介绍,这里我直接搬运过来

一、webrtc回顾

WebRTC(Web Real-Time Communication)即:网页即时通信。 简单点讲,它可以实现浏览器网页与网页之间的音视频实时通信(或传输其它任何数据),目前主流浏览器都支持该API,WebRTC现在已经纳入W3C标准。

1.1 媒体协商
通信的主要目的之一是彼此交换信息。打个比方:“张三”跟“李四”打了一通电话(语音通讯),整个过程中“张三”说的话被“李四”听到了,“李四”说的话被“张三”听到了,双方交换了语音信息。类似的,一个浏览器要与另一个浏览器发起实时音视频通信,需要交换哪些信息呢? 除了音视频信息外,至少还有2个关键信息要交换:媒体信息和网络信息。

如上图:通常某个浏览器所在的电脑,都会连接具体的多媒体设备(比如:麦克风、摄像头)。如果A电脑上的摄像头只支持VP8,H264格式,而另一台电脑上的摄像头只支持H264、MPEG-4格式,它俩要能正常播放彼此的视频,肯定会选择双方都能识别的H264格式。这就好比:2个不同国籍的人要相互交流,A会说英语、中文;而B只会说英语,毫无悬念,他俩肯定会用双方都能听懂的“英语”来沟通。

网络情况也是类似的,二个浏览器所在的电脑可能在不同的网络环境中,假如A机器具备公网+192内网网段,而B机器只有192+198内网网段,二台电脑要能相互连接,很容易想到,使用双方都能连通的公共192内网网段通信最为方便。
在webrtc中,有一个特定的协议用于描述媒体信息、网络信息和其它一些关键信息,称为SDP(Session Description Protocol-会话描述协议)。而上述介绍的交换媒体信息、网络信息的过程,也被称为媒体协商,即:交换SDP.

这是一张媒体协商过程的经典图例, Amy要跟Bob通信, 要先发一个Offer(即: 描述Amy自己会话的SDP), Bob收到后,做出Answer回应(即:描述Bob自己会话的SDP), 双方完成SDP交换后, 根据前面的分析,取出二份SDP的交集, 即完成了媒体协商.

1.2 主要处理过程

这是mozilla开发者官网上的一张图, 大致描述了webrtc的处理过程:

  • A通过STUN服务器,收集自己的网络信息
  • A创建Offer SDP,通过Signal Channel(信令服务器)给到B
  • B做出回应生成Answer SDP,通过Signal Channel给到A
  • B通过STUN收集自己的网络信息,通过Signal Channel给到A

注:如果A,B之间无法直接穿透(即:无法建立点对点的P2P直连),将通过TURN服务器中转。

二、下载引入peerjs

vue环境下引入第三方库,并且不是使用npm包的形式,在官网下载peer.js,放入src/tools/目录里

在聊天页面的vue中,引入这个函数库

import "../tools/peer.js"

发送语音邀请

在html中增加一个请求通话的按钮,点击的时候调用指定函数,效果如图:

                    <div class="iconExtendBtn" @click="callPhone()"><div class="elIcon el-icon-phone-outline" style="font-size: 22px;"></div><div>语音</div></div>

实现这个点击函数,我们需要获取到当前设备的音频和视频流,需要访问访问用户的音频和视频设备(如摄像头和麦克风),这样我们就拿到了本地音视频流

另一篇文章有介绍最兼容的getUserMedia获取音视频流的函数方法

拿到音视频流以后再去初始化一下PeerJs服务,拿到peerjs的id,这个ID就是我们通话的身份ID,非常重要

            //语音请求callPhone(){var _this=this;let res=tools.getCompatibleUserMedia({video:true, audio: {noiseSuppression: true,echoCancellation: true,}},function(stream) {_this.initPeerjs(function(peerid){//初始化成功_this.peerjs.peerjsId=peerid;_this.peerjs.localStream=stream;});},function(err) {_this.$message({type: 'error',message: err});});if(!res){_this.$message({type: 'error',message: "Your browser does not support the getUserMedia API."});}},//初始化peerinitPeerjs(callback){let peer = new Peer();this.peerjs.peer=peer;var _this=this;peer.on('open', function(id) {console.log('My peer ID is: ' + id);callback(id);});peer.on('close', function() {console.log('My peer close');});peer.on('disconnected', function() {console.log('My peer disconnected');});peer.on('error', function() {console.log('My peer error');});}

我们想对客服发起语音通话,那么就需要拿到客服的peerid,那怎么才能知道客服的peerid呢?

那么我们在初始化好自己的peerid以后,调用一个后端接口,让客服把他们的peerid发过来,这样我们才能知道客服的peerid

                        //请求客服发送他们的peerid过来_this.$axios.post(_this.ApiHost+'/2/callKefu',{"action":"callpeer",kefu_id:_this.visitor.to_id,visitor_id:_this.visitor.visitor_id});_this.$message({type: 'success',message: "请求通话指令已经发出!"});

同样,后端客服在接收到访客请求通话的指令后,就初始化自己的peerjs ID,然后调用后端接口,把自己的peerjs ID传递过来(这里暂时先略过客服端的操作)

我们在WebSocket中接收到客服的peerjs ID以后进行远程调用操作

                     //客服接受通话if(type=="accept"){_this.peerjs.kefuPeerId=data;//访客调用客服_this.callPeer();}

            //call peercallPeer(){var _this=this;//调用请求远程客服let call = _this.peerjs.peer.call(_this.peerjs.kefuPeerId, _this.peerjs.localStream);call.on('stream', function(remoteStream) {console.log("call stream",remoteStream);});call.on('close', function() {console.log("call close");});call.on('error', function(err) {console.log("call error",err);});this.peerjs.call=call;}

这样就在call.on('stream')中拿到了客服的音视频流,现在只需要把这个音视频流展示到界面上就可以了

界面上加上两个标签video和audio

        <div class="coverMask" v-show="peerjs.remoteVideoStream"><video id="remoteVideo" controls autoplay></video></div><div class="coverMask" v-show="peerjs.remoteAudioStream"><audio id="remoteAudio" controls autoplay></audio></div>

把获取到的视频流,音频流展示出来

                call.on('stream', function(remoteStream) {console.log("call stream",remoteStream);var videoTracks = remoteStream.getVideoTracks();var audioTracks = remoteStream.getAudioTracks();//视频流if (videoTracks.length > 0) {var remoteVideo = document.getElementById("remoteVideo");remoteVideo.srcObject = remoteStream;remoteVideo.play();_this.peerjs.remoteVideoStream=remoteStream;              return;}//音频流if (audioTracks.length > 0) {var remoteAudio = document.getElementById("remoteAudio");remoteAudio.srcObject = remoteStream;remoteAudio.play();_this.peerjs.remoteAudioStream=remoteStream;}});

网站在线客服系统实时语音视频聊天实战开发,利用peerjs vue.js实现webRTC网页音视频客服系统...相关推荐

  1. 基于webrtc的点对点音视频聊天室开发|spring+vue.js

    WebRTC,名称源自网页即时通信(英语:Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的API.它于2011年6月1日开源并在Goog ...

  2. 【复】基于 WebRTC 的音视频在线监考模块的设计与实现(上)

    文章目录 前言 什么是 WebRTC? WebRTC 架构 WebRTC 通讯内容 WebRTC 通讯协议 WebRTC 连接建立过程 后记 前言 最近在做关于考试系统的项目,其中有一项需求分析是要做 ...

  3. 独家揭秘语音视频聊天室开发顶尖制作教程

    互联网的不断发展,各种新技术的兴起,原本做管理软件 的我也逐渐转向从事着互联网相关的运营产品的开发.尤其是目前抄得最火热的音视频互动平台技术,今天我先列出最基本开发流程,适用于开发视频会议系统.语音视 ...

  4. 视频直播源码在Android端实现1对1音视频实时通话

    我们要使用 WebRTC 进行音视频互动时需要申请访问硬件的权限,至少要申请以下三种权限 Camera 权限 Record Audio 权限 Intenet 权限 在Android中,申请权限分为静态 ...

  5. FlexAir 开源版-多人视频聊天室,网络远程多人视频会议系统((Flex,Fms3联合开发))视频聊天,会议开发实战

    本篇是视频聊天,会议开发实例系列文章的第8篇,该系 列所有文章链接如下:  http://www.cnblogs.com/aierong/archive/2008/12/30/Flex.html#sp ...

  6. mac 苹果电脑升级系统后蓝牙耳机只有一边有声音 苹果电脑连接耳机音质不好 苹果电脑浏览网页音视频嘈杂

    本教程可以解决: mac 苹果电脑升级系统后蓝牙耳机只有一边有声音 苹果电脑连接耳机音质不好 苹果电脑浏览网页音视频嘈杂 环境: 电脑系统: 耳机: 手工定制蓝牙平头耳机 蓝牙模块:高通5141 情况 ...

  7. 视频聊天软件开发技术

    网络视频犹如一个万花筒,它让所有痴迷于可视.可听的人群找到了一条畅快淋漓的途径,它为网民带来了视听的真实和画面灵动的刺激.这个产业的迅速崛起让网络更贴近现实生活,更让信息时代的网络服务焕发出鲜活的魅力 ...

  8. 即时通讯 音视频聊天室开发建议

    目前网上视频聊天室.视频会议软件.可视IP电话软件随处可见,你是否想自己做一个玩玩?其实这类软件无非是视频加上网络而建成的.如果熟悉视频捕 捉和网络传输技术,根本就难不倒你.本文详细介绍了如何利用别人 ...

  9. 一对一视频聊天app开发借助了哪些CDN的服务功能?...

    直播行业的兴起加之各大直播平台对于CDN加速的需求量变大,在进行一对一视频聊天app开发时,不仅要保护数据的安全,还要实时把控直播内容和丰富的特色功能.对于这些用户需求,就需要找到存在低延时和高可用的 ...

最新文章

  1. 2012年12月4期手机网页开发
  2. python pip whl 安装
  3. 这可能是东半球最保姆级的后台服务器开发学习路线
  4. Visual Studio服务器控件被警告问题
  5. HTML去掉列表前面的符号!
  6. ABAP performance学习笔记
  7. docker 添加端口映射_Docker容器修改端口映射
  8. c语言程序的命令行输入,C程序获取命令行参数
  9. xp远程桌面访问 不能复制文件解决办法
  10. c++强制类型转换运算符
  11. Eclipse中 怎么让包分层级显示
  12. Xamarin.Forms Button长按事件
  13. Linux的#和$区别
  14. net core 3.1 跨域 Cors 找不到 “Access-Control-Allow-Origin”
  15. 难道这个会是我的广角选择?
  16. 码神之路博客部署总结补充
  17. 微信机器人之PC微信hook
  18. 【Java】学习日记 Day20
  19. paddlepaddle 9 MC Dropout的使用
  20. 泰山OFFICE技术讲座:为字体调整字间距的研究,设置值何时生效

热门文章

  1. LeCun和马库斯齐喷ChatGPT:大语言模型果然是邪路?
  2. 正则表达式规则(不间断更新)
  3. 备份、还原或移动 SharePoint 网站
  4. androidtv-Leanback开源项目解析
  5. 野外作业机器人四十年:推倒人工智能实验室的围墙
  6. Latex添加缩略词列表
  7. 意气风发的少年第二季 ×「TFOD」青少年街舞公开赛 强强联手 舞力全開
  8. 个人数字助理,平板与智能手机走近
  9. 3种蓝牙架构实现方案(蓝牙协议栈方案)
  10. 必备的Web前端技术有哪些?