前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实践:《从头到脚撸一个多人视频聊天 — 前端 WebRTC 实战)》

实践:《从头到脚撸一个多人视频聊天 — 前端 WebRTC 实战)》

作者头像
申君健
发布2019-03-21 17:10:48
1.6K0
发布2019-03-21 17:10:48
举报
文章被收录于专栏:前端侠2.0

请先阅读原文,链接:从头到脚撸一个多人视频聊天 — 前端 WebRTC 实战(一),本文只涉及实践过程中的问题

1、video元素的srcObject属性

先看chrome时,没看到该属性,查询MDN也显示没有这属性。但后测试Chrome ,Safari,  ff ,又发现都有该属性

2、是否要启动本地服务器

谷歌,ff 不需要,Safari需要!

3、获取音、视频流信息及相应事件

除了文中提到的: getAudioTracks()、getVideoTracks()   ,还有stream.getTracks() 可以获取它们。  通过音、视频的Track,可以监听它们的设备名字,静音或结束时的事件。  注意的是,<video>元素只有play,seek,end,volumechange 等事件,没有mute事件的。   

但是在我测试中,无法监听到Track的onmute事件,  而且muted属性一直是false.

4、本地 1 v 1 对等连接 的过程

整个过程看得不是太懂,由于源码我安装npm不成功,所以把代码摘出来。看一下它的执行流程:

代码语言:javascript
复制
    <div class="demo">
        <div class="rtcBox">
            <div>
                <video src="" id="rtcA" controls autoplay></video>
                <h5>A</h5>
            </div>
            <div>
                <video src="" id="rtcB" controls autoplay></video>
                <h5>B</h5>
                <button  id="call">call</button>
                <button  id="hangup">hangup</button>
            </div>
        </div>
    </div>
代码语言:javascript
复制
let peerA,peerB;
async function init() {
    //1、 保存本地流到全局
    this.localstream = await navigator.mediaDevices.getUserMedia({ audio: true, video: true });
    let video = document.querySelector('#rtcA');
    video.srcObject = this.localstream;

    
    //2、 创建A,B输出端  
    let PeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
    peerA = new PeerConnection();
    peerA.addStream(this.localstream); // 添加本地流
    console.log("1、        打开A 视频流,并放入peerA")
    // 监听 A 的ICE候选信息    如果收集到,就添加给 B
    peerA.onicecandidate = (event) => {
        console.log('9、 10、    A  onicecandidate', event);
        if (event.candidate) {
            peerB.addIceCandidate(event.candidate);
        }
    };

    peerB = new PeerConnection();
    // 监听 B 的ICE候选信息   如果收集到,就添加给 A
    peerB.onicecandidate = (event) => {
        console.log('4、5、12、  B  onicecandidate', event);
        if (event.candidate) {
            peerA.addIceCandidate(event.candidate);
        }
    };
    //3、 监听是否有媒体流接入,如果有就赋值给 rtcB 的 src
    peerB.onaddstream = (event) => {
        console.log('11、        event-stream', event);
        let video = document.querySelector('#rtcB');
        video.srcObject = event.stream;
    };

}
document.getElementById("call").addEventListener("click", async function () {
    //4、B发起呼叫
    let offer = await peerB.createOffer( {
        offerToReceiveAudio: 1,
        offerToReceiveVideo: 1
    }); // 创建 offer
    console.log("2、       创建offer")
    await peerB.setLocalDescription(offer); // 呼叫端设置本地 offer 描述
    console.log("3、       B set offer后")
    await peerA.setRemoteDescription(offer); // 接收端设置远程 offer 描述
    console.log(" 6、       A set offer 后")
    //A响应
    let answer = await peerA.createAnswer(); // 接收端创建 answer
    console.log("7、       创建answer")
    await peerA.setLocalDescription(answer); // 接收端设置本地 answer 描述
    console.log(" 8、       A set answer 后")
    await peerB.setRemoteDescription(answer); // 呼叫端设置远程 answer 描述
    console.log("13、       B set answer 后")
});


document.getElementById("hangup").addEventListener("click", function () {
    //5、 断开
    peerA.close();
    peerB.close();
    peerA = null;
    peerB = null;
    this.allowCall = false;
    this.allowHangup = true
    console.log("14、        断开")
})

    init();

通过打印消息出现的顺序,可以看到执行过程:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、video元素的srcObject属性
  • 2、是否要启动本地服务器
  • 3、获取音、视频流信息及相应事件
  • 4、本地 1 v 1 对等连接 的过程
相关产品与服务
对等连接
对等连接(Peering Connection,PC)是一种大带宽、高质量的云上资源互通服务,可以帮助您打通腾讯云上的资源通信链路。 对等连接具有多区域、多账户、多种网络异构互通等特点,轻松实现云上两地三中心、游戏同服等复杂网络场景;支持 VPC 网络与基础网络、黑石网络互通,满足您不同业务的部署需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档