全部开发者教程

企业级在线办公系统

在线会议页面的视频墙分成和很多格子,每个格子的尺寸都不大,我们能不能将某个远端视频放大显示呢?这个功能可以有,所以这节课咱们把切换大屏给实现了,顺便还可以实现开启关闭摄像头和麦克风的功能。

一、熟悉前端页面

视频墙中的其他参会人格子都设置了双击事件,对应的回调函数,我们写代码把视频大屏显示。

<div class="video-list">
    <!--当前用户排在视频墙第一位-->
    <div class="video">
        <div class="user">
            <img class="photo" :src="mine.photo" />
            <span class="name">{{ mine.name }}{{ shareStatus ? '(共享中)' : '' }}</span>
        </div>
        <div id="localStream"></div>
    </div>
    <!--其他参会人-->
    <div class="video" v-for="one in memberList">
        <div class="user">
            <img class="photo" :src="one.photo" />
            <span class="name">{{ one.name }}</span>
        </div>
        <div :id="one.id" class="remote-stream" @dblclick="bigVideoHandle(one.id)"></div>
    </div>
</div>

在页面中隐藏了一个DIV控件,它的尺寸设置成了100%,我们大屏显示视频的时候,就停掉视频墙某个格子中的视频,然后在这个大屏DIV中播放视频。

<div id="videoBig" @dblclick="smallVideoHandle()"></div>
#videoBig{
	display: none;
	width: 100%;
	height: 100%;
}

二、大屏显示远端视频

我们编写JS代码,实现bigVideoHandle()这个双击事件回调函数。

//双击某个远端小视频,切换到大屏显示
bigVideoHandle: function(userId) {
    let that = this;
    //在模型层记录全屏显示的远端用户userId,切回小屏会用到
    that.bigVideoUserId = userId; 
    $('#videoListContainer').hide(); //隐藏视频墙
    $('#videoBig').show(); //显示大屏控件
    //停止该用户的远端视频在屏幕墙格子的播放
    that.stream[userId].stop(); 
    //远端视频在大屏播放
    that.stream[userId].play('videoBig'); 
},

三、关闭大屏显示

大屏DIV控件也有双击事件,我们把该事件的回调函数给实现了。

//双击大屏视频,切换到小屏播放
smallVideoHandle: function() {
    let that = this;
    //停止大屏播放远端视频
    that.stream[that.bigVideoUserId].stop(); 
    //在相应的小屏播放远端视频
    that.stream[that.bigVideoUserId].play(that.bigVideoUserId); 
    that.bigVideoUserId = null;
    //隐藏大屏控件
    $('#videoBig').hide();
    //显示视频墙
    $('#videoListContainer').show();
}

四、退出视频会议自动关闭大屏

当本地用户退出视频会议的时候,页面自动关闭大屏,切换回视频墙界面

//如果是播放大屏视频的时候退出会议,退出会议后需要隐藏大屏,然后显示视频墙界面
if (that.bigVideoUserId != null) {
    $('#videoBig').hide();
    $('#videoListContainer').show();
    that.bigVideoUserId = null;
}

五、开关摄像头和麦克风

在视频会议进行中,本地用户可以开关自己的摄像头和麦克风。

<button :class="videoStatus ? 'video-btn-on' : 'video-btn-off'" @click="videoHandle"/>
<button :class="micStatus ? 'mic-btn-on' : 'mic-btn-off'" @click="micHandle"/>

点击摄像头按钮可以切换开启和关闭摄像头,所以我们要实现videoHandle()函数。

videoHandle: function() {
    let that = this;
    if (that.shareStatus) {
        that.$alert('屏幕共享中无法开关摄像头', '提示信息', {
            confirmButtonText: '确定'
        });
        return;
    }
    if (that.videoStatus) {
        //关闭摄像头
        that.localStream.muteVideo();
    } else {
        //开启摄像头
        that.localStream.unmuteVideo();
    }
    that.videoStatus = !that.videoStatus;
},

开关麦克风的回调函数是micHandle(),这个函数咱们要实现。

micHandle: function() {
    let that = this;
    let stream = that.getStream();
    if (that.micStatus) {
        //关闭话筒
        stream.muteAudio();
    } else {
        //开启话筒
        stream.unmuteAudio();
    }
    that.micStatus = !that.micStatus;
},