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

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

1、video元素的srcObject属性

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

d1f9bad6f0e783ea9a29d06cda91f2a9392.jpg  9178d931b5703674bb353d9ca729b9bb884.jpg

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

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

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

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

19be9040b8a1fc5631e60034d396a270aa7.jpg

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

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

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

    <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>
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();

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

3c29976a8dc040bdeaf30321d325ac52472.jpg

 

 

 

 

 

转载于:https://my.oschina.net/u/1540190/blog/3025034

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值