2023.5.22第二阶段冲刺日报(八)

Arkiya / 2023-05-22 / 原文

通过近几日的学习,同时找到了一个较好的demo实现视频会议,将正式开始实现文本界面的视频会议

 

这是主界面代码

<!DOCTYPE html>
<html>

<head>
    <title>TRTC实时音视频通话</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=0.7, user-scalable=no, shrink-to-fit=no">
    <link rel="stylesheet" href="./css/bootstrap-material-design.min.css">
    <link rel="stylesheet" href="./css/index.css">
    <link rel="stylesheet" href="./css/room.css">
</head>

<body>
    <div id="root">
        <!-- 登录页面 -->
        <div id="login-root">
            <!-- 登录卡片 -->
            <div id="login-card" class="card">
                <!-- 顶部三个蓝条 -->
                <div class="row-div" style="width: 100%; height: 10px">
                    <div style="width: 190px; height: 100%; background-color: #006EFF"></div>
                    <div style="width: 160px; height: 100%; background-color: #00A4FF"></div>
                    <div style="width: 100px; height: 100%; background-color: #5AD5E0"></div>
                </div>
                <!-- 腾讯云logo -->
                <div class="row-div" style="width: 100%; height: 100px; justify-content: center">
                    <img style="height: 23px" src="./img/logo.png" alt="">
                    <div style="width: 9px"></div>
                    <div style="width: 1px; height: 10px; background-color: #D8D8D8"></div>
                    <div style="width: 9px"></div>
                    <div style="width: 86px; height: 23px; font-size: 18px; color: #333333">视频通话</div>
                </div>
                <!-- 用户名 房间号 登录按钮-->
                <div class="col-div" style="width: 320px">
                    <div class="form-group bmd-form-group is-filled" style="width: 100%; height: 80px">
                        <label for="userId" class="bmd-label-floating">用户名:</label>
                        <input type="text" class="form-control" name="userId" id="userId" maxlength="18">
                    </div>
                    <div class="form-group bmd-form-group is-filled" style="width: 100%; height: 80px">
                        <label for="roomId" class="bmd-label-floating">房间号:</label>
                        <input type="text" class="form-control" name="roomId" id="roomId" maxlength="18">
                    </div>
                    <div style="height: 24px"></div>
                    <!-- 登录 -->
                    <button id="login-btn" type="button" class="btn btn-raised btn-primary"
                        style="width: 100%; height: 40px">进入房间
                        <div class="ripple-container"></div>
                    </button>
                    <!-- 摄像头 麦克风 -->
                    <div class="row-div" style="width: 100%; height: 105px; justify-content: center">
                        <img id="camera" style="height: 27px" src="./img/camera.png" onClick="event.cancelBubble = true"
                            data-toggle="popover" data-placement="top" title="" data-content="">
                        <!-- 选择摄像头 -->
                        <div id="camera-option" style="display: none"></div>
                        <div style="width: 100px"></div>
                        <img id="microphone" style="height: 27px" src="./img/mic.png"
                            onClick="event.cancelBubble = true" data-toggle="popover" data-placement="top" title=""
                            data-content="">
                        <!-- 选择麦克风 -->
                        <div id="mic-option" style="display: none"></div>
                    </div>
                    <!-- 设备检测按钮 -->
                    <div id="device-testing-btn" class="device-testing-btn">
                        <div class="device-icon">
                            <svg class="icon" aria-hidden="true">
                                <use xlink:href="#icon-device"></use>
                            </svg>
                        </div>
                        设备检测
                    </div>
                    <div id="device-connect-list" class="device-connect-list" style="display: none;">
                        <div id="connect-camera" class="connect icon-normal">
                            <svg class="icon" aria-hidden="true">
                                <use xlink:href="#icon-cameraIcon"></use>
                            </svg>
                        </div>
                        <div id="connect-voice"  class="connect icon-normal">
                            <svg class="icon" aria-hidden="true">
                                <use xlink:href="#icon-voice"></use>
                            </svg>
                        </div>
                        <div id="connect-mic" class="connect icon-normal">
                            <svg class="icon" aria-hidden="true">
                                <use xlink:href="#icon-microphone"></use>
                            </svg>
                        </div>
                        <div id="connect-network" class="connect icon-normal">
                            <svg class="icon" aria-hidden="true">
                                <use xlink:href="#icon-network"></use>
                            </svg>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        <!-- 设备检测界面弹窗 -->
        <div id="device-testing-root" style="display: none;">
            <!-- 设备检测卡片 -->
            <div class="device-testing-card">
                <!-- 设备检测准备界面 -->
                <div id="device-testing-prepare" class="device-testing-prepare">
                    <div class="testing-title">设备连接</div>
                    <div class="testing-prepare-info">设备检测前请务必给当前页面开放摄像头,麦克风权限哦~</div>
                    <div class="device-display">
                        <div id="device-camera" class="device icon-normal">
                            <svg class="icon" aria-hidden="true">
                                <use xlink:href="#icon-cameraIcon"></use>
                            </svg>
                        </div>
                        <div id="device-voice"  class="device icon-normal">
                            <svg class="icon" aria-hidden="true">
                                <use xlink:href="#icon-voice"></use>
                            </svg>
                        </div>
                        <div id="device-mic" class="device icon-normal">
                            <svg class="icon" aria-hidden="true">
                                <use xlink:href="#icon-microphone"></use>
                            </svg>
                        </div>
                        <div id="device-network" class="device icon-normal">
                            <svg class="icon" aria-hidden="true">
                                <use xlink:href="#icon-network"></use>
                            </svg>
                        </div>
                    </div>
                    <div id="device-loading" class="loading-background">
                        <div class="device-loading"></div>
                    </div>
                    <!-- 连接结果提示 -->
                    <div class="connect-info">
                        <!-- 连接结果 -->
                        <div id="connect-info" style="max-width: 60%;"></div>
                        <!-- 错误icon及错误解决指引 -->
                        <div id="connect-attention-container" class="connect-attention-container" style="display: none;">
                            <div id="connect-attention-icon" class="connect-attention-icon">
                                <svg class="icon" aria-hidden="true">
                                    <use xlink:href="#icon-warn"></use>
                                </svg>
                            </div>
                            <div id="connect-attention-info" class="connect-attention-info" style="display: none;">
                            </div>
                        </div>
                    </div>
                    <!-- 设备连接页面button -->
                    <div class="testing-btn-display">
                        <div id="start-test-btn" class="test-btn start-test start-gray">开始检测</div>
                        <div id="connect-again-btn" class="test-btn connect-again" style="display: none;">重新连接</div>
                    </div>
                </div>
                <!-- 设备检测tab页 -->
                <div id="device-testing" class="device-testing" style="display: none;">
                    <div class="device-testing-title">
                        <div id="camera-testing" class="testing icon-gray">
                            <svg class="icon" aria-hidden="true">
                                <use xlink:href="#icon-cameraIcon"></use>
                            </svg>
                        </div>
                        <div id="voice-testing" class="testing icon-gray">
                            <svg class="icon" aria-hidden="true">
                                <use xlink:href="#icon-voice"></use>
                            </svg>
                        </div>
                        <div id="mic-testing" class="testing icon-gray">
                            <svg class="icon" aria-hidden="true">
                                <use xlink:href="#icon-microphone"></use>
                            </svg>
                        </div>
                        <div id="network-testing" class="testing icon-gray">
                            <svg class="icon" aria-hidden="true">
                                <use xlink:href="#icon-network"></use>
                            </svg>
                        </div>
                    </div>
                    <!-- 设备检测-摄像头检测 -->
                    <div id="camera-testing-body" class="testing-body" style="display: none;">
                        <div class="device-list camera-device-list">
                            <div class="select-title" style="display: block;">摄像头选择</div>
                            <div class="select-list" style="display: block;">
                                <select name="select" id="camera-select" class="device-select"></select>
                            </div>
                        </div>
                        <div id="camera-video" class="camera-video"></div>
                        <div class="testing-info-container">
                            <div class="testing-info">是否可以清楚的看到自己?</div>
                            <div class="button-list">
                                <div id="camera-fail" class="fail-button">看不到</div>
                                <div id="camera-success" class="success-button">可以看到</div>
                            </div>
                        </div>
                    </div>
                    <!-- 设备检测-播放器检测 -->
                    <div id="voice-testing-body" class="testing-body" style="display: none;">
                        <div class="device-list camera-device-list">
                            <div class="select-title" style="display: block;">扬声器选择</div>
                            <div class="select-list" style="display: block;">
                                <select name="select" id="voice-select" class="device-select"></select>
                            </div>
                        </div>
                        <div class="audio-control">
                            <div class="audio-control-info">请调高设备音量, 点击播放下面的音频试试~</div>
                            <audio id="audio-player" src="https://web.sdk.qcloud.com/trtc/webrtc/assets/bgm-test.mp3" controls></audio>
                        </div>
                        <div class="testing-info-container">
                            <div class="testing-info">是否可以听到声音?</div>
                            <div class="button-list">
                                <div id="voice-fail" class="fail-button">听不到</div>
                                <div id="voice-success" class="success-button">可以听到</div>
                            </div>
                        </div>
                    </div>
                    <!-- 设备检测-麦克风检测 -->
                    <div id="mic-testing-body" class="testing-body" style="display: none;">
                        <div class="device-list camera-device-list">
                            <div class="select-title" style="display: block;">麦克风选择</div>
                            <div class="select-list" style="display: block;">
                                <select name="select" id="mic-select" class="device-select"></select>
                            </div>
                        </div>
                        <div class="mic-testing-container">
                            <div class="mic-testing-info">对着麦克风说'哈喽'试试~</div>
                            <div id="mic-bar-container" class="mic-bar-container"></div>
                            <div id="audio-container"></div>
                        </div>
                        <div class="testing-info-container">
                            <div class="testing-info">是否可以看到音量图标跳动?</div>
                            <div class="button-list">
                                <div id="mic-fail" class="fail-button">看不到</div>
                                <div id="mic-success" class="success-button">可以看到</div>
                            </div>
                        </div>
                    </div>
                    <!-- 设备检测-硬件及网速检测 -->
                    <div id="network-testing-body" class="testing-body" style="display: none;">
                        <div class="testing-index-list">
                            <div class="testing-index-group">
                                <div class="testing-index">操作系统</div>
                                <div id="system"></div>
                            </div>
                            <div class="testing-index-group">
                                <div class="testing-index">浏览器版本</div>
                                <div id="browser"></div>
                            </div>
                            <!-- <div class="testing-index-group">
                                <div class="testing-index">IP地址</div>
                                <div id="ip"></div>
                            </div> -->
                            <div class="testing-index-group">
                                <div class="testing-index">屏幕共享能力</div>
                                <div id="screen-share"></div>
                            </div>
                            <div class="testing-index-group">
                                <div class="testing-index">网络延迟</div>
                                <div id="network-rtt" class="network-loading"></div>
                            </div>
                            <div class="testing-index-group">
                                <div class="testing-index">上行网络质量</div>
                                <div id="uplink-network" class="network-loading"></div>
                            </div>
                            <div class="testing-index-group">
                                <div class="testing-index">下行网络质量</div>
                                <div id="downlink-network" class="network-loading"></div>
                            </div>
                            <div class="testing-index-group">
                                <div class="testing-index">检测剩余时间</div>
                                <div id="count-down"></div>
                            </div>
                        </div>
                        <div class="testing-footer">
                            <div id="testing-report-btn" class="test-btn">查看检测报告</div>
                        </div>
                    </div>
                </div>
                <!-- 设备检测报告 -->
                <div id="device-testing-report" class="device-testing-report" style="display: none;">
                    <div class="testing-title">检测报告</div>
                    <!-- 检测报告内容 -->
                    <div class="device-report-list">
                        <!-- 摄像头报告信息 -->
                        <div class="device-report camera-report">
                            <div class="device-info">
                                <div class="report-icon">
                                    <svg class="icon" aria-hidden="true">
                                        <use xlink:href="#icon-cameraIcon"></use>
                                    </svg>
                                </div>
                                <div id="camera-name" class="device-name"></div>
                            </div>
                            <div id="camera-testing-result" class="camera-testing-result"></div>
                        </div>
                        <!-- 扬声器报告信息 -->
                        <div id="voice-report" class="device-report voice-report">
                            <div class="device-info">
                                <div class="report-icon">
                                    <svg class="icon" aria-hidden="true">
                                        <use xlink:href="#icon-voice"></use>
                                    </svg>
                                </div>
                                <div id="voice-name" class="device-name"></div>
                            </div>
                            <div id="voice-testing-result" class="voice-testing-result"></div>
                        </div>
                        <!-- 麦克风报告信息 -->
                        <div class="device-report mic-report">
                            <div class="device-info">
                                <div class="report-icon">
                                    <svg class="icon" aria-hidden="true">
                                        <use xlink:href="#icon-microphone"></use>
                                    </svg>
                                </div>
                                <div id="mic-name" class="device-name"></div>
                            </div>
                            <div id="mic-testing-result" class="mic-testing-result"></div>
                        </div>
                        <!-- 网络报告信息 -->
                        <div class="device-report network-report">
                            <div class="device-info">
                                <div class="report-icon">
                                    <svg class="icon" aria-hidden="true">
                                        <use xlink:href="#icon-network"></use>
                                    </svg>
                                </div>
                                <div id="network-name" class="device-name">网络延迟</div>
                            </div>
                            <div id="rtt-result" class="network-testing-result"></div>
                        </div>
                        <div class="device-report network-report">
                            <div class="device-info">
                                <div class="report-icon">
                                    <svg class="icon" aria-hidden="true">
                                        <use xlink:href="#icon-network"></use>
                                    </svg>
                                </div>
                                <div id="etwork-name" class="device-name">上行网络质量</div>
                            </div>
                            <div id="uplink-network-quality-result" class="network-testing-result"></div>
                        </div>
                        <div class="device-report network-report">
                            <div class="device-info">
                                <div class="report-icon">
                                    <svg class="icon" aria-hidden="true">
                                        <use xlink:href="#icon-network"></use>
                                    </svg>
                                </div>
                                <div id="network-name" class="device-name">下行网络质量</div>
                            </div>
                            <div id="downlink-network-quality-result" class="network-testing-result"></div>
                        </div>
                    </div>
                    <div class="device-report-footer">
                        <div id="testing-again" class="device-report-btn testing-agin">重新检测</div>
                        <div id="testing-finish" class="device-report-btn testing-finish">完成检测</div>
                    </div>
                </div>
                <!-- 设备检测关闭按钮 -->
                <div id="device-testing-close-btn" class="device-testing-close-btn">
                    <svg class="icon" aria-hidden="true">
                        <use xlink:href="#icon-closeIcon"></use>
                    </svg>
                </div>
            </div>
        </div>
        <!-- 聊天室页面 -->
        <div id="room-root" class="col-div">
            <!-- header -->
            <div class="row-div card" style="width: 100%; height: 65px; justify-content: space-between">
                <!-- 腾讯云logo -->
                <div class="row-div" style="height: 100%; width: 230px; justify-content: center">
                    <img style="height: 23px" src="./img/logo.png" alt="">
                    <div style="width: 9px"></div>
                    <div style="width: 1px; height: 10px; background-color: #D8D8D8"></div>
                    <div style="width: 9px"></div>
                    <div style="width: 86px; height: 23px; font-size: 18px; color: #333333">视频通话</div>
                </div>
                <!-- 分享屏幕 退出 按钮 -->
                <div class="row-div" style="height: 100%; width: auto;">
                    <img id="screen-btn" style="width: 65px; height: 65px" src="./img/screen-off.png" alt="">
                    <div style="width: 20px"></div>
                    <img id="logout-btn" style="width: 65px; height: 65px" src="./img/logout.png" alt="">
                </div>

                <!-- 房间号 -->
                <div id="header-roomId"
                    style="width: 230px; justify-content: flex-end; padding-right: 20px; font-size: 14px; color: #888888">
                    房间号: 12345</div>
            </div>
            <!-- content -->
            <div class="row-div" style="height: 100%; width: 100%; padding: 10px">
                <div class="col-div" style="width: 340px; height: 100%; padding: 10px">
                    <div class="col-div card" style="width: 100%; height: 100%">
                        <!-- 成员列表 -->
                        <div id="member-list" class="col-div" style="width: 100%; justify-content: flex-start; flex: 1">
                            <!-- member -->
                            <div id="member-me" style="width: 100%; padding-left: 20px">
                                <div class="row-div member"
                                    style="width: 100%; height: 50px; justify-content: space-between">
                                    <div class="member-id">(我)</div>
                                    <div class="row-div" style="width:100px; height: 26px; justify-content: center">
                                        <img class="member-video-btn" style="height: 100%" src="./img/camera-on.png"
                                            alt="">
                                        <div style="width: 18px"></div>
                                        <div style="width: 28px; height: 28px; display: inline-block; position: relative">
                                            <img class="member-audio-btn" style="width: 100%; height: 100%;" src="./img/mic-on.png" alt="">
                                            <div class="volume-level" style="position: absolute; bottom: 0; left: 0; width: 28px; height: 0%; overflow: hidden; transition: height .1s ease;">
                                                <img style="position: absolute; bottom: 0;" alt="" src="./img/mic-green.png">
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
                <!-- 视频网格 -->
                <div id="video-grid" style="height: 100%; flex: 1">
                    <!-- 主视频 -->
                    <div id="main-video" class="video-box col-div" style="justify-content: flex-end">
                        <!-- 主视频控制按钮 -->
                        <div id="main-video-btns" class="row-div"
                            style="width: 156px; position: absolute; z-index: 10; justify-content: center; align-self: flex-end">
                            <img id="video-btn" style="width: 68px; height: 68px" onClick="event.cancelBubble = true"
                                src="./img/big-camera-on.png" alt="">
                            <img id="mic-btn" style="width: 68px; height: 68px" onClick="event.cancelBubble = true"
                                src="./img/big-mic-on.png" alt="">
                        </div>
                        <div id="mask_main" class="mask col-div">
                            <!-- “摄像头未开启”遮罩 -->
                            <div style="height: 100%; width: 100%; position: absolute; background-color: #D8D8D8; top: 0; left: 0;"></div>
                            <img style="width: 63px; height: 69px; z-index: 10;" src="./img/camera-max.png" alt="">
                            <div style="height: 10px"></div>
                            <div style="z-index: 10">摄像头未打开</div>
                        </div>
                    </div>
                    <!-- 小视频 -->
                </div>
            </div>
        </div>
    </div>
    <!-- 展示不支持webRTC的提示 -->
    <div id="remind-info-container" style="justify-content: center; display: none;">
        <!-- 在ios端webview引导用户打开safari浏览器 -->
        <div id="webview-remind" class="webview-remind">
            <img class="webview-remind-img" src="./img/right-top-arrow.png" alt="right-top-arrow">
            <div class="webview-remind-info">
                <span>点击右上角 ··· 图标</span>
                <span style="display: inline-block; margin-top: 10px;">选择在safari浏览器中打开</span>
            </div>
        </div>
        <!-- 提醒用户用可以使用的浏览器打开 -->
        <div id="browser-remind" class="browser-remind">
            <div id="remind-icon" style="width: 100%; font-size: 28px;">
                <svg class="icon" aria-hidden="true">
                    <use xlink:href="#icon-warn"></use>
                </svg>
                <span style="display: inline-block; margin-left: 5px">提示</span>
            </div>
            <div id="remind-info" class="remind-info"></div>
        </div>
    </div>
    <script src="./js/jquery-3.2.1.min.js"></script>
    <script src="./js/popper.js"></script>
    <script src="./js/bootstrap-material-design.js"></script>
    <script>
        $(document).ready(function () {
            $('body').bootstrapMaterialDesign();
        });
    </script>
    <script src="./js/lib-generate-test-usersig.min.js"></script>	
    <script src="./js/debug/GenerateTestUserSig.js"></script>
    <script src="./js/iconfont.js"></script>
    <script src="./js/trtc.js"></script>
    <script src="./js/common.js"></script>
    <script src="./js/rtc-client.js"></script>
    <script src="./js/share-client.js"></script>
    <script src="./js/presetting.js"></script>
    <script src="./js/rtc-detection.js"></script>
    <script src="./js/device-testing.js"></script>
    <script src="./js/index.js"></script>
</body>

</html>

  

/* eslint-disable no-global-assign */
/* global $ TRTC Presetting deviceTestingInit cameraId micId rtcDetection*/

// presetting of login card
const presetting = new Presetting();
presetting.init();

rtcDetection().then(detectionResult => {
  detectionResult && deviceTestingInit();
});

// setup logging stuffs
TRTC.Logger.setLogLevel(TRTC.Logger.LogLevel.DEBUG);
TRTC.Logger.enableUploadLog();

TRTC.getDevices()
  .then(devices => {
    devices.forEach(item => {
      console.log('device: ' + item.kind + ' ' + item.label + ' ' + item.deviceId);
    });
  })
  .catch(error => console.error('getDevices error observed ' + error));

// populate camera options
TRTC.getCameras().then(devices => {
  devices.forEach(device => {
    if (!cameraId) {
      cameraId = device.deviceId;
    }
    let div = $('<div></div>');
    div.attr('id', device.deviceId);
    div.html(device.label);
    div.appendTo('#camera-option');
  });
});

// populate microphone options
TRTC.getMicrophones().then(devices => {
  devices.forEach(device => {
    if (!micId) {
      micId = device.deviceId;
    }
    let div = $('<div></div>');
    div.attr('id', device.deviceId);
    div.html(device.label);
    div.appendTo('#mic-option');
  });
});