From d24dd35d265a0b6bd0620285d226b5bed3d4566e Mon Sep 17 00:00:00 2001
From: czt <czt18638530771@163.com>
Date: 星期四, 11 十二月 2025 19:40:27 +0800
Subject: [PATCH] 大屏提交1:首页、GIS、视频页面

---
 fzzy-igdss-web/src/main/resources/static/group/video.js | 1475 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 1,475 insertions(+), 0 deletions(-)

diff --git a/fzzy-igdss-web/src/main/resources/static/group/video.js b/fzzy-igdss-web/src/main/resources/static/group/video.js
new file mode 100644
index 0000000..5b6a247
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/group/video.js
@@ -0,0 +1,1475 @@
+var time;
+var splitWin = 1;  //鍒嗗睆鏁帮紝榛樿4鍒嗗睆
+var deptCur = null; //褰撳墠搴撳尯
+var cameraList = null;  //鐩戞帶鍒楄〃
+var cameraIndex = -1;  //鐩戞帶涓嬫爣
+var cameraTimer;     // 搴撳尯瀹氭椂
+var selectTag = 0; //鎾斁鏍囩锛�0-鑷姩杞挱锛�1-鎵嬪姩閫夋嫨
+var windowsNum = 1; //鎾斁绐楀彛涓嬫爣锛屾墜鍔ㄩ�夋嫨妯″紡涓嬩娇鐢�
+var handCameraIndex = null;  //鎵嬪姩閫夋嫨鐩戞帶鐨勪笅鏍�
+var gundongTimer;     //鐩戞帶鍒楄〃婊氬姩瀹氭椂鍣�
+
+var playUrl1 = null;
+var videoId1 = null;
+let webrtc1;
+let mediaStream1;
+var playUrl2 = null;
+var videoId2 = null;
+let webrtc2;
+let mediaStream2;
+var playUrl3 = null;
+var videoId3 = null;
+let webrtc3;
+let mediaStream3;
+var playUrl4 = null;
+var videoId4 = null;
+let webrtc4;
+let mediaStream4;
+var playUrl5 = null;
+var videoId5 = null;
+let webrtc5;
+let mediaStream5;
+var playUrl6 = null;
+var videoId6 = null;
+let webrtc6;
+let mediaStream6;
+var playUrl7 = null;
+var videoId7 = null;
+let webrtc7;
+let mediaStream7;
+var playUrl8 = null;
+var videoId8 = null;
+let webrtc8;
+let mediaStream8;
+var playUrl9 = null;
+var videoId9 = null;
+let webrtc9;
+let mediaStream9;
+var playUrl10 = null;
+var videoId10 = null;
+let webrtc10;
+let mediaStream10;
+var playUrl11 = null;
+var videoId11 = null;
+let webrtc11;
+let mediaStream11;
+var playUrl12 = null;
+var videoId12 = null;
+let webrtc12;
+let mediaStream12;
+var playUrl13 = null;
+var videoId13 = null;
+let webrtc13;
+let mediaStream13;
+var playUrl14 = null;
+var videoId14 = null;
+let webrtc14;
+let mediaStream14;
+var playUrl15 = null;
+var videoId15 = null;
+let webrtc15;
+let mediaStream15;
+var playUrl16 = null;
+var videoId16 = null;
+let webrtc16;
+let mediaStream16;
+
+$(function () {
+    // 鍒濆鍖栭〉闈�
+    initHtml();
+});
+
+// 鍒濆鍖栭〉闈�
+function initHtml() {
+    // 鏃堕棿
+    initTime();
+
+    //鐩戞帶鐐逛俊鎭�傚簲婊氬姩
+    initScrollbar(60);
+    //搴撳尯淇℃伅
+    // renderDeptArea();
+    //
+    // renderCamera();
+}
+
+
+// 娓叉煋搴撳尯淇℃伅
+function renderDeptArea() {
+    if (deptCur) {
+        $("#deptName").html(deptCur.deptName);
+        $("#deptAddress").html(deptCur.addr == null ? "---" : deptCur.addr);
+        $("#cameraSum").html(deptCur.cameraSum == null ? "---" : deptCur.cameraSum);
+        $("#cameraCn").html(deptCur.cameraCn == null ? "---" : deptCur.cameraCn);
+        $("#cameraYw").html(deptCur.cameraYw == null ? "---" : deptCur.cameraYw);
+        $("#cameraAf").html(deptCur.cameraAf == null ? "---" : deptCur.cameraAf);
+    }
+}
+
+// 娓叉煋鐩戞帶鍒楄〃
+function renderCamera() {
+    var html = '';
+    if (cameraList != null && cameraList.length > 0) {
+        var divcameraIndex = "";
+        $.each(cameraList, function (index, item) {
+            divcameraIndex = "divCamera" + index;
+            html += '<div class="panel-content-body-tr" id="' + divcameraIndex + '" ondblclick="selectHand(' + index + ')">';
+            html += '<span class="body-item" style="flex: 1.4">';
+            html += item.name;
+            html += '</span>';
+            html += '<span class="body-item" style="flex: 0.6">';
+            if (item.spjklx == "02") {
+                html += '鐞冩満';
+            } else {
+                html += '鏋満';
+            }
+            html += '</span></div>';
+        })
+    } else {
+        html += '<div class="panel-content-body-tr">';
+        html += '<span class="body-item" style="flex: 1.4">鏆傛棤鏁版嵁</span>';
+        html += '<span class="body-item" style="flex: 0.6"></span>';
+        html += '</div>';
+    }
+    $("#inventoryInfo").html(html);
+    if (selectTag == 0) {
+        cameraSwitch1();
+    }
+}
+
+/* ---------- 鐩戞帶鍒囨崲 ---------- */
+function cameraSwitch1() {
+    clearInterval(cameraTimer);
+    cameraSwitch2()
+    //5鍒嗛挓鍒囨崲瑙嗛
+    cameraTimer = setInterval(function () {
+        cameraSwitch2()
+    }, 60000);
+}
+
+function cameraSwitch2() {
+    for (var i = 1; i <= splitWin; i++) {
+        cameraIndex++;
+        //鎾斁瑙嗛
+        startPlay(i);
+    }
+}
+
+//瑙嗛鎾斁-璇锋眰鎽勫儚澶翠俊鎭�
+/**
+ *
+ * @param cameraNum   鎽勫儚澶村垪琛ㄤ笅鏍�
+ * @param windowsNum 鎾斁绐楀彛涓嬫爣
+ */
+function startPlay(windowsNum) {
+    if (cameraIndex === cameraList.length) {
+        cameraIndex = 0;
+    }
+
+    var data = cameraList[cameraIndex];
+    if (!data) {
+        $("#f" + splitWin + "_d" + windowsNum).html("鏈幏鍙栧埌鎽勫儚澶存挱鏀句俊鎭紒锛�");
+        return;
+    }
+    if (data.urlIn) {
+        if (windowsNum === 1) {
+            playUrl1 = null;
+            mediaStream1 = null;
+            playUrl1 = cameraList[cameraIndex].urlIn;
+            videoId1 = cameraList[cameraIndex].id;
+            webRtcToPlay1();
+        }else if (windowsNum === 2) {
+            playUrl2 = null;
+            mediaStream2 = null;
+            playUrl2 = cameraList[cameraIndex].urlIn;
+            videoId2 = cameraList[cameraIndex].id;
+            webRtcToPlay2();
+        }else if (windowsNum === 3) {
+            playUrl3 = null;
+            mediaStream3 = null;
+            playUrl3 = cameraList[cameraIndex].urlIn;
+            videoId3 = cameraList[cameraIndex].id;
+            webRtcToPlay3();
+        }else if (windowsNum === 4) {
+            playUrl4 = null;
+            mediaStream4 = null;
+            playUrl4 = cameraList[cameraIndex].urlIn;
+            videoId4 = cameraList[cameraIndex].id;
+            webRtcToPlay4();
+        }else if (windowsNum === 5) {
+            playUrl5 = null;
+            mediaStream5 = null;
+            playUrl5 = cameraList[cameraIndex].urlIn;
+            videoId5 = cameraList[cameraIndex].id;
+            webRtcToPlay5();
+        }else if (windowsNum === 6) {
+            playUrl6 = null;
+            mediaStream6 = null;
+            playUrl6 = cameraList[cameraIndex].urlIn;
+            videoId6 = cameraList[cameraIndex].id;
+            webRtcToPlay6();
+        }else if (windowsNum === 7) {
+            playUrl7 = null;
+            mediaStream7 = null;
+            playUrl7 = cameraList[cameraIndex].urlIn;
+            videoId7 = cameraList[cameraIndex].id;
+            webRtcToPlay7();
+        }else if (windowsNum === 8) {
+            playUrl8 = null;
+            mediaStream8 = null;
+            playUrl8 = cameraList[cameraIndex].urlIn;
+            videoId8 = cameraList[cameraIndex].id;
+            webRtcToPlay8();
+        }else if (windowsNum === 9) {
+            playUr9 = null;
+            mediaStream9 = null;
+            playUrl9 = cameraList[cameraIndex].urlIn;
+            videoId9 = cameraList[cameraIndex].id;
+            webRtcToPlay9();
+        }else if (windowsNum === 10) {
+            playUrl10 = null;
+            mediaStream10 = null;
+            playUrl10 = cameraList[cameraIndex].urlIn;
+            videoId10 = cameraList[cameraIndex].id;
+            webRtcToPlay10();
+        }else if (windowsNum === 11) {
+            playUrl11 = null;
+            mediaStream11 = null;
+            playUrl11 = cameraList[cameraIndex].urlIn;
+            videoId11 = cameraList[cameraIndex].id;
+            webRtcToPlay11();
+        }else if (windowsNum === 12) {
+            playUrl12 = null;
+            mediaStream12 = null;
+            playUrl12 = cameraList[cameraIndex].urlIn;
+            videoId12 = cameraList[cameraIndex].id;
+            webRtcToPlay12();
+        }else if (windowsNum === 13) {
+            playUrl13 = null;
+            mediaStream13 = null;
+            playUrl13 = cameraList[cameraIndex].urlIn;
+            videoId13 = cameraList[cameraIndex].id;
+            webRtcToPlay13();
+        }else if (windowsNum === 14) {
+            playUrl14 = null;
+            mediaStream14 = null;
+            playUrl14 = cameraList[cameraIndex].urlIn;
+            videoId14 = cameraList[cameraIndex].id;
+            webRtcToPlay14();
+        }else if (windowsNum === 15) {
+            playUrl15 = null;
+            mediaStream15 = null;
+            playUrl15 = cameraList[cameraIndex].urlIn;
+            videoId15 = cameraList[cameraIndex].id;
+            webRtcToPlay15();
+        }else if (windowsNum === 16) {
+            playUrl16 = null;
+            mediaStream16 = null;
+            playUrl16 = cameraList[cameraIndex].urlIn;
+            videoId16 = cameraList[cameraIndex].id;
+            webRtcToPlay16();
+        }
+    } else {
+        $("#f" + splitWin + "_d" + windowsNum).html("鏈幏鍙栧埌鎽勫儚澶�(" + data.name + ")鎾斁淇℃伅锛侊紒");
+    }
+}
+
+/**
+ * 鍒嗗睆鍒囨崲
+ * @param tagNum  鍒嗗睆鏁�
+ */
+function fenping(tagNum) {
+    //閲嶇疆鍒囨崲鍓嶇殑鍒嗗睆绐楀彛
+    reloadView(splitWin);
+
+    //璧嬪�煎綋鍓嶅垎灞忔暟
+    splitWin = tagNum;
+
+    //閲嶇疆鍒囨崲鍚庣殑鍒嗗睆绐楀彛
+    reloadView(splitWin);
+
+    //鍒囨崲鍒嗗睆鍥炬爣鍙婇〉闈�
+    if (tagNum == 1) {
+        $("#f_1").attr("src", "/img/web/group/fp_1_active.png");
+        $("#f_4").attr("src", "/img/web/group/fp_4.png");
+        $("#f_9").attr("src", "/img/web/group/fp_9.png");
+        $("#f_16").attr("src", "/img/web/group/fp_16.png");
+        $("#video_1").css('display', 'block');
+        $("#video_4").css('display', 'none');
+        $("#video_9").css('display', 'none');
+        $("#video_16").css('display', 'none');
+    }
+    if (tagNum == 4) {
+        $("#f_1").attr("src", "/img/web/group/fp_1.png");
+        $("#f_4").attr("src", "/img/web/group/fp_4_active.png");
+        $("#f_9").attr("src", "/img/web/group/fp_9.png");
+        $("#f_16").attr("src", "/img/web/group/fp_16.png");
+        $("#video_1").css('display', 'none');
+        $("#video_4").css('display', 'block');
+        $("#video_9").css('display', 'none');
+        $("#video_16").css('display', 'none');
+    }
+    if (tagNum == 9) {
+        $("#f_1").attr("src", "/img/web/group/fp_1.png");
+        $("#f_4").attr("src", "/img/web/group/fp_4.png");
+        $("#f_9").attr("src", "/img/web/group/fp_9_active.png");
+        $("#f_16").attr("src", "/img/web/group/fp_16.png");
+        $("#video_1").css('display', 'none');
+        $("#video_4").css('display', 'none');
+        $("#video_9").css('display', 'block');
+        $("#video_16").css('display', 'none');
+    }
+    if (tagNum == 16) {
+        $("#f_1").attr("src", "/img/web/group/fp_1.png");
+        $("#f_4").attr("src", "/img/web/group/fp_4.png");
+        $("#f_9").attr("src", "/img/web/group/fp_9.png");
+        $("#f_16").attr("src", "/img/web/group/fp_16_active.png");
+        $("#video_1").css('display', 'none');
+        $("#video_4").css('display', 'none');
+        $("#video_9").css('display', 'none');
+        $("#video_16").css('display', 'block');
+    }
+    //褰撳墠搴撳尯閲嶆柊鎾斁锛岀洃鎺у垪琛ㄦ挱鏀句笅鏍囬噸缃负0
+    cameraIndex = 0;
+    clearInterval(cameraTimer);
+    windowsNum = 1;
+    //鍒ゆ柇鎾斁鏂瑰紡
+    if (selectTag == 0) {
+        cameraSwitch1();
+    }
+}
+
+//閲嶇疆4鍒嗗睆鍜�9鍒嗗睆鐨勫悇涓挱鏀剧獥鍙�
+function reloadView(num) {
+    var html;
+    for (var i = 1; i <= num; i++) {
+        html = '';
+        html += '<video className="video" id="video' + num + '_' + i + ' autoPlay="" muted="" playsInline=""></video>';
+        $("#f" + num + "_d" + i).html(html);
+    }
+}
+
+/**
+ * 鎵嬪姩閫夋嫨鎾斁
+ * @param index 閫夋嫨鐩戞帶鐨勭洃鎺у垪琛ㄤ笅鏍�
+ */
+function selectHand(index) {
+    if (selectTag == 0) {
+
+        //娓呴櫎鍒楄〃婊氬姩锛岄噸鏂拌缃粴鍔ㄦ椂闂�
+        clearInterval(gundongTimer);
+        initScrollbar(1000 * 30);
+
+        showTip("宸插垏鎹㈡墜鍔ㄦ挱鏀炬ā寮忥紒鍙屽嚮宸︿晶鍒楄〃鐩戞帶杩涜鎾斁锛�");
+
+        windowsNum = 1;
+        selectTag = 1;
+        reloadView(splitWin);
+    }
+
+    if (windowsNum > splitWin) {
+        windowsNum = 1;
+    }
+    cameraIndex = index;
+    startPlay(windowsNum);
+    windowsNum++;
+
+    //娓呴櫎涓婃閫変腑鏁堟灉锛岃祴鍊兼柊閫変腑鏁堟灉
+    $("#divCamera" + handCameraIndex).removeClass("handSelect");
+    $("#divCamera" + index).addClass("handSelect");
+    handCameraIndex = index;
+}
+
+// 鍒锋柊鏃堕棿
+function initTime() {
+    setInterval(function () {
+        $("#navBarDate").html(formatDate('mm鏈坉d鏃�', new Date()));
+        $("#navBarTime").html(formatDate('HH:MM:SS', new Date()));
+        $("#navBarWeek").html(getWeekDate());
+    }, 1000);
+}
+
+/**
+ * 鏍煎紡鍖栨棩鏈�
+ *
+ * @param fmt
+ * @param date
+ * @return {*}
+ */
+function formatDate(fmt, date) {
+    var ret;
+    var opt = {
+        "Y+": date.getFullYear().toString(),        // 骞�
+        "m+": (date.getMonth() + 1).toString(),     // 鏈�
+        "d+": date.getDate().toString(),            // 鏃�
+        "H+": date.getHours().toString(),           // 鏃�
+        "M+": date.getMinutes().toString(),         // 鍒�
+        "S+": date.getSeconds().toString()          // 绉�
+        // 鏈夊叾浠栨牸寮忓寲瀛楃闇�姹傚彲浠ョ户缁坊鍔狅紝蹇呴』杞寲鎴愬瓧绗︿覆
+    };
+    for (var k in opt) {
+        ret = new RegExp("(" + k + ")").exec(fmt);
+        if (ret) {
+            fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
+        }
+    }
+    return fmt;
+}
+
+/**
+ * 鑾峰彇褰撳墠鏄熸湡鍑�
+ */
+function getWeekDate() {
+    var now = new Date();
+    var day = now.getDay();
+    var weeks = new Array("鏄熸湡鏃�", "鏄熸湡涓�", "鏄熸湡浜�", "鏄熸湡涓�", "鏄熸湡鍥�", "鏄熸湡浜�", "鏄熸湡鍏�");
+    var week = weeks[day];
+    return week;
+}
+
+//鐩戞帶鐐逛俊鎭粴鍔�
+function initScrollbar(num) {
+    gundongTimer = setInterval(function () {
+        if (!hasScrollbar()) {
+            document.getElementById('inventoryInfoBox').scrollTop = 0;
+        } else {
+            if (document.getElementById('inventoryInfoBox').scrollTop >= (document.getElementById('inventoryInfo').clientHeight - document.getElementById('inventoryInfoBox').clientHeight)) {
+                document.getElementById('inventoryInfoBox').scrollTop = 0;
+            } else {
+                document.getElementById('inventoryInfoBox').scrollTop++;
+            }
+        }
+    }, num);
+}
+
+//鍒ゆ柇搴曢儴鏄惁鍑虹幇婊氬姩鏉�
+function hasScrollbar() {
+    return document.getElementById('inventoryInfo').clientHeight > document.getElementById('inventoryInfoBox').clientHeight;
+}
+
+// 鍙充笅瑙掓彁閱掍俊鎭�
+function showTip(msg) {
+    layer.msg(msg);
+}
+
+
+/*============= webRtc瑙嗛鎾斁1 ----- 寮�濮� ===============*/
+/**
+ * 寮�濮嬫挱鏀�
+ * @param winTag  鎾斁绐楀彛
+ * @returns {Promise<void>}
+ */
+async function webRtcToPlay1() {
+    if (playUrl1) {
+        mediaStream1 = new MediaStream();
+        $("#video" + splitWin + "_" + windowsNum)[0].srcObject = mediaStream1;
+        webrtc1 = new RTCPeerConnection({
+            iceServers: [{
+                urls: ["stun:stun.l.google.com:19302"]
+            }],
+            sdpSemantics: "unified-plan"
+        });
+        webrtc1.onsignalingstatechange = signalingstatechange1;
+
+        webrtc1.ontrack = ontrack1
+        let offer = await webrtc1.createOffer({
+
+            offerToReceiveAudio: true,
+            offerToReceiveVideo: true
+        });
+        await webrtc1.setLocalDescription(offer);
+    }
+}
+
+function ontrack1(event) {
+    mediaStream1.addTrack(event.track);
+}
+
+async function signalingstatechange1() {
+    switch (webrtc1.signalingState) {
+        case 'have-local-offer':
+            // let uuid = $('#uuid').val();
+            let url = playUrl1 + "?uuid=" + videoId1 + "&channel=0";
+            $.post(url, {
+                data: btoa(webrtc1.localDescription.sdp)
+            }, function (data) {
+                try {
+                    console.log(data);
+                    webrtc1.setRemoteDescription(new RTCSessionDescription({
+                        type: 'answer',
+                        sdp: atob(data)
+                    }))
+                } catch (e) {
+                    console.warn(e);
+                }
+
+            });
+            break;
+        case 'stable':
+            break;
+        case 'closed':
+            break;
+        default:
+            console.log(`unhandled signalingState is ${webrtc1.signalingState}`);
+            break;
+    }
+}
+
+/*============= 瑙嗛鎾斁 ----- 缁撴潫 ===============*/
+
+/*============= webRtc瑙嗛鎾斁2 ----- 寮�濮� ===============*/
+/**
+ * 寮�濮嬫挱鏀�
+ * @param winTag  鎾斁绐楀彛
+ * @returns {Promise<void>}
+ */
+async function webRtcToPlay2() {
+    if (playUrl2) {
+        mediaStream2 = new MediaStream();
+        $("#video" + splitWin + "_" + windowsNum)[0].srcObject = mediaStream2;
+        webrtc2 = new RTCPeerConnection({
+            iceServers: [{
+                urls: ["stun:stun.l.google.com:19302"]
+            }],
+            sdpSemantics: "unified-plan"
+        });
+        webrtc2.onsignalingstatechange = signalingstatechange2;
+
+        webrtc2.ontrack = ontrack2
+        let offer = await webrtc2.createOffer({
+
+            offerToReceiveAudio: true,
+            offerToReceiveVideo: true
+        });
+        await webrtc2.setLocalDescription(offer);
+    }
+}
+
+function ontrack2(event) {
+    mediaStream2.addTrack(event.track);
+}
+
+async function signalingstatechange2() {
+    switch (webrtc2.signalingState) {
+        case 'have-local-offer':
+            // let uuid = $('#uuid').val();
+            let url = playUrl2 + "?uuid=" + videoId2 + "&channel=0";
+            $.post(url, {
+                data: btoa(webrtc2.localDescription.sdp)
+            }, function (data) {
+                try {
+                    console.log(data);
+                    webrtc2.setRemoteDescription(new RTCSessionDescription({
+                        type: 'answer',
+                        sdp: atob(data)
+                    }))
+                } catch (e) {
+                    console.warn(e);
+                }
+
+            });
+            break;
+        case 'stable':
+            break;
+        case 'closed':
+            break;
+        default:
+            console.log(`unhandled signalingState is ${webrtc2.signalingState}`);
+            break;
+    }
+}
+
+/*============= 瑙嗛鎾斁 ----- 缁撴潫 ===============*/
+
+/*============= webRtc瑙嗛鎾斁3 ----- 寮�濮� ===============*/
+/**
+ * 寮�濮嬫挱鏀�
+ * @param winTag  鎾斁绐楀彛
+ * @returns {Promise<void>}
+ */
+async function webRtcToPlay3() {
+    if (playUrl3) {
+        mediaStream3 = new MediaStream();
+        $("#video" + splitWin + "_" + windowsNum)[0].srcObject = mediaStream3;
+        webrtc3 = new RTCPeerConnection({
+            iceServers: [{
+                urls: ["stun:stun.l.google.com:19302"]
+            }],
+            sdpSemantics: "unified-plan"
+        });
+        webrtc3.onsignalingstatechange = signalingstatechange3;
+
+        webrtc3.ontrack = ontrack3
+        let offer = await webrtc3.createOffer({
+
+            offerToReceiveAudio: true,
+            offerToReceiveVideo: true
+        });
+        await webrtc3.setLocalDescription(offer);
+    }
+}
+
+function ontrack3(event) {
+    mediaStream3.addTrack(event.track);
+}
+
+async function signalingstatechange3() {
+    switch (webrtc3.signalingState) {
+        case 'have-local-offer':
+            // let uuid = $('#uuid').val();
+            let url = playUrl3 + "?uuid=" + videoId3 + "&channel=0";
+            $.post(url, {
+                data: btoa(webrtc3.localDescription.sdp)
+            }, function (data) {
+                try {
+                    console.log(data);
+                    webrtc3.setRemoteDescription(new RTCSessionDescription({
+                        type: 'answer',
+                        sdp: atob(data)
+                    }))
+                } catch (e) {
+                    console.warn(e);
+                }
+
+            });
+            break;
+        case 'stable':
+            break;
+        case 'closed':
+            break;
+        default:
+            console.log(`unhandled signalingState is ${webrtc3.signalingState}`);
+            break;
+    }
+}
+
+/*============= 瑙嗛鎾斁 ----- 缁撴潫 ===============*/
+
+/*============= webRtc瑙嗛鎾斁4 ----- 寮�濮� ===============*/
+/**
+ * 寮�濮嬫挱鏀�
+ * @param winTag  鎾斁绐楀彛
+ * @returns {Promise<void>}
+ */
+async function webRtcToPlay4() {
+    if (playUrl4) {
+        mediaStream4 = new MediaStream();
+        $("#video" + splitWin + "_" + windowsNum)[0].srcObject = mediaStream4;
+        webrtc4 = new RTCPeerConnection({
+            iceServers: [{
+                urls: ["stun:stun.l.google.com:19302"]
+            }],
+            sdpSemantics: "unified-plan"
+        });
+        webrtc4.onsignalingstatechange = signalingstatechange4;
+
+        webrtc4.ontrack = ontrack4
+        let offer = await webrtc4.createOffer({
+
+            offerToReceiveAudio: true,
+            offerToReceiveVideo: true
+        });
+        await webrtc4.setLocalDescription(offer);
+    }
+}
+
+function ontrack4(event) {
+    mediaStream4.addTrack(event.track);
+}
+
+async function signalingstatechange4() {
+    switch (webrtc4.signalingState) {
+        case 'have-local-offer':
+            // let uuid = $('#uuid').val();
+            let url = playUrl4 + "?uuid=" + videoId4 + "&channel=0";
+            $.post(url, {
+                data: btoa(webrtc4.localDescription.sdp)
+            }, function (data) {
+                try {
+                    console.log(data);
+                    webrtc4.setRemoteDescription(new RTCSessionDescription({
+                        type: 'answer',
+                        sdp: atob(data)
+                    }))
+                } catch (e) {
+                    console.warn(e);
+                }
+
+            });
+            break;
+        case 'stable':
+            break;
+        case 'closed':
+            break;
+        default:
+            console.log(`unhandled signalingState is ${webrtc4.signalingState}`);
+            break;
+    }
+}
+
+/*============= 瑙嗛鎾斁 ----- 缁撴潫 ===============*/
+/*============= webRtc瑙嗛鎾斁5 ----- 寮�濮� ===============*/
+/**
+ * 寮�濮嬫挱鏀�
+ * @param winTag  鎾斁绐楀彛
+ * @returns {Promise<void>}
+ */
+async function webRtcToPlay5() {
+    if (playUrl5) {
+        mediaStream5 = new MediaStream();
+        $("#video" + splitWin + "_" + windowsNum)[0].srcObject = mediaStream5;
+        webrtc5 = new RTCPeerConnection({
+            iceServers: [{
+                urls: ["stun:stun.l.google.com:19302"]
+            }],
+            sdpSemantics: "unified-plan"
+        });
+        webrtc5.onsignalingstatechange = signalingstatechange5;
+
+        webrtc5.ontrack = ontrack5
+        let offer = await webrtc4.createOffer({
+
+            offerToReceiveAudio: true,
+            offerToReceiveVideo: true
+        });
+        await webrtc5.setLocalDescription(offer);
+    }
+}
+
+function ontrack5(event) {
+    mediaStream5.addTrack(event.track);
+}
+
+async function signalingstatechange5() {
+    switch (webrtc5.signalingState) {
+        case 'have-local-offer':
+            // let uuid = $('#uuid').val();
+            let url = playUrl5 + "?uuid=" + videoId5 + "&channel=0";
+            $.post(url, {
+                data: btoa(webrtc5.localDescription.sdp)
+            }, function (data) {
+                try {
+                    console.log(data);
+                    webrtc5.setRemoteDescription(new RTCSessionDescription({
+                        type: 'answer',
+                        sdp: atob(data)
+                    }))
+                } catch (e) {
+                    console.warn(e);
+                }
+
+            });
+            break;
+        case 'stable':
+            break;
+        case 'closed':
+            break;
+        default:
+            console.log(`unhandled signalingState is ${webrtc5.signalingState}`);
+            break;
+    }
+}
+
+/*============= 瑙嗛鎾斁 ----- 缁撴潫 ===============*/
+/*============= webRtc瑙嗛鎾斁4 ----- 寮�濮� ===============*/
+/**
+ * 寮�濮嬫挱鏀�
+ * @param winTag  鎾斁绐楀彛
+ * @returns {Promise<void>}
+ */
+async function webRtcToPlay6() {
+    if (playUrl6) {
+        mediaStream6 = new MediaStream();
+        $("#video" + splitWin + "_" + windowsNum)[0].srcObject = mediaStream6;
+        webrtc6 = new RTCPeerConnection({
+            iceServers: [{
+                urls: ["stun:stun.l.google.com:19302"]
+            }],
+            sdpSemantics: "unified-plan"
+        });
+        webrtc6.onsignalingstatechange = signalingstatechange6;
+
+        webrtc6.ontrack = ontrack6
+        let offer = await webrtc4.createOffer({
+
+            offerToReceiveAudio: true,
+            offerToReceiveVideo: true
+        });
+        await webrtc6.setLocalDescription(offer);
+    }
+}
+
+function ontrack6(event) {
+    mediaStream6.addTrack(event.track);
+}
+
+async function signalingstatechange6() {
+    switch (webrtc6.signalingState) {
+        case 'have-local-offer':
+            // let uuid = $('#uuid').val();
+            let url = playUrl6 + "?uuid=" + videoId6 + "&channel=0";
+            $.post(url, {
+                data: btoa(webrtc6.localDescription.sdp)
+            }, function (data) {
+                try {
+                    console.log(data);
+                    webrtc6.setRemoteDescription(new RTCSessionDescription({
+                        type: 'answer',
+                        sdp: atob(data)
+                    }))
+                } catch (e) {
+                    console.warn(e);
+                }
+
+            });
+            break;
+        case 'stable':
+            break;
+        case 'closed':
+            break;
+        default:
+            console.log(`unhandled signalingState is ${webrtc6.signalingState}`);
+            break;
+    }
+}
+
+/*============= 瑙嗛鎾斁 ----- 缁撴潫 ===============*/
+
+/*============= webRtc瑙嗛鎾斁7 ----- 寮�濮� ===============*/
+/**
+ * 寮�濮嬫挱鏀�
+ * @param winTag  鎾斁绐楀彛
+ * @returns {Promise<void>}
+ */
+async function webRtcToPlay7() {
+    if (playUrl7) {
+        mediaStream7 = new MediaStream();
+        $("#video" + splitWin + "_" + windowsNum)[0].srcObject = mediaStream7;
+        webrtc7 = new RTCPeerConnection({
+            iceServers: [{
+                urls: ["stun:stun.l.google.com:19302"]
+            }],
+            sdpSemantics: "unified-plan"
+        });
+        webrtc7.onsignalingstatechange = signalingstatechange7;
+
+        webrtc7.ontrack = ontrack7
+        let offer = await webrtc7.createOffer({
+
+            offerToReceiveAudio: true,
+            offerToReceiveVideo: true
+        });
+        await webrtc7.setLocalDescription(offer);
+    }
+}
+
+function ontrack7(event) {
+    mediaStream7.addTrack(event.track);
+}
+
+async function signalingstatechange7() {
+    switch (webrtc7.signalingState) {
+        case 'have-local-offer':
+            // let uuid = $('#uuid').val();
+            let url = playUrl7 + "?uuid=" + videoId7 + "&channel=0";
+            $.post(url, {
+                data: btoa(webrtc7.localDescription.sdp)
+            }, function (data) {
+                try {
+                    console.log(data);
+                    webrtc7.setRemoteDescription(new RTCSessionDescription({
+                        type: 'answer',
+                        sdp: atob(data)
+                    }))
+                } catch (e) {
+                    console.warn(e);
+                }
+
+            });
+            break;
+        case 'stable':
+            break;
+        case 'closed':
+            break;
+        default:
+            console.log(`unhandled signalingState is ${webrtc7.signalingState}`);
+            break;
+    }
+}
+
+/*============= 瑙嗛鎾斁 ----- 缁撴潫 ===============*/
+
+/*============= webRtc瑙嗛鎾斁8 ----- 寮�濮� ===============*/
+/**
+ * 寮�濮嬫挱鏀�
+ * @param winTag  鎾斁绐楀彛
+ * @returns {Promise<void>}
+ */
+async function webRtcToPlay8() {
+    if (playUrl8) {
+        mediaStream8 = new MediaStream();
+        $("#video" + splitWin + "_" + windowsNum)[0].srcObject = mediaStream8;
+        webrtc8 = new RTCPeerConnection({
+            iceServers: [{
+                urls: ["stun:stun.l.google.com:19302"]
+            }],
+            sdpSemantics: "unified-plan"
+        });
+        webrt8.onsignalingstatechange = signalingstatechange8;
+
+        webrtc8.ontrack = ontrack8
+        let offer = await webrtc8.createOffer({
+
+            offerToReceiveAudio: true,
+            offerToReceiveVideo: true
+        });
+        await webrtc8.setLocalDescription(offer);
+    }
+}
+
+function ontrack8(event) {
+    mediaStream8.addTrack(event.track);
+}
+
+async function signalingstatechange8() {
+    switch (webrtc8.signalingState) {
+        case 'have-local-offer':
+            // let uuid = $('#uuid').val();
+            let url = playUrl8 + "?uuid=" + videoId8 + "&channel=0";
+            $.post(url, {
+                data: btoa(webrtc8.localDescription.sdp)
+            }, function (data) {
+                try {
+                    console.log(data);
+                    webrtc8.setRemoteDescription(new RTCSessionDescription({
+                        type: 'answer',
+                        sdp: atob(data)
+                    }))
+                } catch (e) {
+                    console.warn(e);
+                }
+
+            });
+            break;
+        case 'stable':
+            break;
+        case 'closed':
+            break;
+        default:
+            console.log(`unhandled signalingState is ${webrtc8.signalingState}`);
+            break;
+    }
+}
+
+/*============= 瑙嗛鎾斁 ----- 缁撴潫 ===============*/
+
+/*============= webRtc瑙嗛鎾斁9 ----- 寮�濮� ===============*/
+/**
+ * 寮�濮嬫挱鏀�
+ * @param winTag  鎾斁绐楀彛
+ * @returns {Promise<void>}
+ */
+async function webRtcToPlay9() {
+    if (playUrl9) {
+        mediaStream9 = new MediaStream();
+        $("#video" + splitWin + "_" + windowsNum)[0].srcObject = mediaStream9;
+        webrtc9 = new RTCPeerConnection({
+            iceServers: [{
+                urls: ["stun:stun.l.google.com:19302"]
+            }],
+            sdpSemantics: "unified-plan"
+        });
+        webrtc9.onsignalingstatechange = signalingstatechange9;
+
+        webrtc9.ontrack = ontrack9
+        let offer = await webrtc4.createOffer({
+
+            offerToReceiveAudio: true,
+            offerToReceiveVideo: true
+        });
+        await webrtc9.setLocalDescription(offer);
+    }
+}
+
+function ontrack9(event) {
+    mediaStream9.addTrack(event.track);
+}
+
+async function signalingstatechange9() {
+    switch (webrtc9.signalingState) {
+        case 'have-local-offer':
+            // let uuid = $('#uuid').val();
+            let url = playUrl9 + "?uuid=" + videoId9 + "&channel=0";
+            $.post(url, {
+                data: btoa(webrt9.localDescription.sdp)
+            }, function (data) {
+                try {
+                    console.log(data);
+                    webrtc9.setRemoteDescription(new RTCSessionDescription({
+                        type: 'answer',
+                        sdp: atob(data)
+                    }))
+                } catch (e) {
+                    console.warn(e);
+                }
+
+            });
+            break;
+        case 'stable':
+            break;
+        case 'closed':
+            break;
+        default:
+            console.log(`unhandled signalingState is ${webrtc9.signalingState}`);
+            break;
+    }
+}
+
+/*============= 瑙嗛鎾斁 ----- 缁撴潫 ===============*/
+
+/*============= webRtc瑙嗛鎾斁10 ----- 寮�濮� ===============*/
+/**
+ * 寮�濮嬫挱鏀�
+ * @param winTag  鎾斁绐楀彛
+ * @returns {Promise<void>}
+ */
+async function webRtcToPlay10() {
+    if (playUrl10) {
+        mediaStream10 = new MediaStream();
+        $("#video" + splitWin + "_" + windowsNum)[0].srcObject = mediaStream10;
+        webrtc10 = new RTCPeerConnection({
+            iceServers: [{
+                urls: ["stun:stun.l.google.com:19302"]
+            }],
+            sdpSemantics: "unified-plan"
+        });
+        webrtc10.onsignalingstatechange = signalingstatechange10;
+
+        webrtc10.ontrack = ontrack10
+        let offer = await webrtc10.createOffer({
+
+            offerToReceiveAudio: true,
+            offerToReceiveVideo: true
+        });
+        await webrtc10.setLocalDescription(offer);
+    }
+}
+
+function ontrack10(event) {
+    mediaStream10.addTrack(event.track);
+}
+
+async function signalingstatechange10() {
+    switch (webrtc10.signalingState) {
+        case 'have-local-offer':
+            // let uuid = $('#uuid').val();
+            let url = playUrl10 + "?uuid=" + videoId10 + "&channel=0";
+            $.post(url, {
+                data: btoa(webrtc10.localDescription.sdp)
+            }, function (data) {
+                try {
+                    console.log(data);
+                    webrtc10.setRemoteDescription(new RTCSessionDescription({
+                        type: 'answer',
+                        sdp: atob(data)
+                    }))
+                } catch (e) {
+                    console.warn(e);
+                }
+
+            });
+            break;
+        case 'stable':
+            break;
+        case 'closed':
+            break;
+        default:
+            console.log(`unhandled signalingState is ${webrtc10.signalingState}`);
+            break;
+    }
+}
+
+/*============= 瑙嗛鎾斁 ----- 缁撴潫 ===============*/
+
+/*============= webRtc瑙嗛鎾斁11 ----- 寮�濮� ===============*/
+/**
+ * 寮�濮嬫挱鏀�
+ * @param winTag  鎾斁绐楀彛
+ * @returns {Promise<void>}
+ */
+async function webRtcToPlay11() {
+    if (playUrl11) {
+        mediaStream11 = new MediaStream();
+        $("#video" + splitWin + "_" + windowsNum)[0].srcObject = mediaStream11;
+        webrtc11 = new RTCPeerConnection({
+            iceServers: [{
+                urls: ["stun:stun.l.google.com:19302"]
+            }],
+            sdpSemantics: "unified-plan"
+        });
+        webrtc11.onsignalingstatechange = signalingstatechange11;
+
+        webrtc11.ontrack = ontrack11
+        let offer = await webrtc11.createOffer({
+
+            offerToReceiveAudio: true,
+            offerToReceiveVideo: true
+        });
+        await webrtc11.setLocalDescription(offer);
+    }
+}
+
+function ontrack11(event) {
+    mediaStream11.addTrack(event.track);
+}
+
+async function signalingstatechange11() {
+    switch (webrtc11.signalingState) {
+        case 'have-local-offer':
+            // let uuid = $('#uuid').val();
+            let url = playUrl11 + "?uuid=" + videoId11 + "&channel=0";
+            $.post(url, {
+                data: btoa(webrtc11.localDescription.sdp)
+            }, function (data) {
+                try {
+                    console.log(data);
+                    webrtc11.setRemoteDescription(new RTCSessionDescription({
+                        type: 'answer',
+                        sdp: atob(data)
+                    }))
+                } catch (e) {
+                    console.warn(e);
+                }
+
+            });
+            break;
+        case 'stable':
+            break;
+        case 'closed':
+            break;
+        default:
+            console.log(`unhandled signalingState is ${webrtc11.signalingState}`);
+            break;
+    }
+}
+
+/*============= 瑙嗛鎾斁 ----- 缁撴潫 ===============*/
+
+/*============= webRtc瑙嗛鎾斁12 ----- 寮�濮� ===============*/
+/**
+ * 寮�濮嬫挱鏀�
+ * @param winTag  鎾斁绐楀彛
+ * @returns {Promise<void>}
+ */
+async function webRtcToPlay12() {
+    if (playUrl12) {
+        mediaStream12 = new MediaStream();
+        $("#video" + splitWin + "_" + windowsNum)[0].srcObject = mediaStream12;
+        webrtc12 = new RTCPeerConnection({
+            iceServers: [{
+                urls: ["stun:stun.l.google.com:19302"]
+            }],
+            sdpSemantics: "unified-plan"
+        });
+        webrtc12.onsignalingstatechange = signalingstatechange12;
+
+        webrtc12.ontrack = ontrack12
+        let offer = await webrtc12.createOffer({
+
+            offerToReceiveAudio: true,
+            offerToReceiveVideo: true
+        });
+        await webrtc12.setLocalDescription(offer);
+    }
+}
+
+function ontrack12(event) {
+    mediaStream12.addTrack(event.track);
+}
+
+async function signalingstatechange12() {
+    switch (webrtc12.signalingState) {
+        case 'have-local-offer':
+            // let uuid = $('#uuid').val();
+            let url = playUrl12 + "?uuid=" + videoId12 + "&channel=0";
+            $.post(url, {
+                data: btoa(webrtc12.localDescription.sdp)
+            }, function (data) {
+                try {
+                    console.log(data);
+                    webrtc12.setRemoteDescription(new RTCSessionDescription({
+                        type: 'answer',
+                        sdp: atob(data)
+                    }))
+                } catch (e) {
+                    console.warn(e);
+                }
+
+            });
+            break;
+        case 'stable':
+            break;
+        case 'closed':
+            break;
+        default:
+            console.log(`unhandled signalingState is ${webrtc12.signalingState}`);
+            break;
+    }
+}
+
+/*============= 瑙嗛鎾斁 ----- 缁撴潫 ===============*/
+
+/*============= webRtc瑙嗛鎾斁13 ----- 寮�濮� ===============*/
+/**
+ * 寮�濮嬫挱鏀�
+ * @param winTag  鎾斁绐楀彛
+ * @returns {Promise<void>}
+ */
+async function webRtcToPlay13() {
+    if (playUrl13) {
+        mediaStream13 = new MediaStream();
+        $("#video" + splitWin + "_" + windowsNum)[0].srcObject = mediaStream13;
+        webrtc13 = new RTCPeerConnection({
+            iceServers: [{
+                urls: ["stun:stun.l.google.com:19302"]
+            }],
+            sdpSemantics: "unified-plan"
+        });
+        webrtc13.onsignalingstatechange = signalingstatechange13;
+
+        webrtc13.ontrack = ontrack13
+        let offer = await webrtc13.createOffer({
+
+            offerToReceiveAudio: true,
+            offerToReceiveVideo: true
+        });
+        await webrtc13.setLocalDescription(offer);
+    }
+}
+
+function ontrack13(event) {
+    mediaStream13.addTrack(event.track);
+}
+
+async function signalingstatechange13() {
+    switch (webrtc13.signalingState) {
+        case 'have-local-offer':
+            // let uuid = $('#uuid').val();
+            let url = playUrl13 + "?uuid=" + videoId13 + "&channel=0";
+            $.post(url, {
+                data: btoa(webrtc13.localDescription.sdp)
+            }, function (data) {
+                try {
+                    console.log(data);
+                    webrtc13.setRemoteDescription(new RTCSessionDescription({
+                        type: 'answer',
+                        sdp: atob(data)
+                    }))
+                } catch (e) {
+                    console.warn(e);
+                }
+
+            });
+            break;
+        case 'stable':
+            break;
+        case 'closed':
+            break;
+        default:
+            console.log(`unhandled signalingState is ${webrtc13.signalingState}`);
+            break;
+    }
+}
+
+/*============= 瑙嗛鎾斁 ----- 缁撴潫 ===============*/
+
+/*============= webRtc瑙嗛鎾斁14 ----- 寮�濮� ===============*/
+/**
+ * 寮�濮嬫挱鏀�
+ * @param winTag  鎾斁绐楀彛
+ * @returns {Promise<void>}
+ */
+async function webRtcToPlay14() {
+    if (playUrl14) {
+        mediaStream14 = new MediaStream();
+        $("#video" + splitWin + "_" + windowsNum)[0].srcObject = mediaStream14;
+        webrtc14 = new RTCPeerConnection({
+            iceServers: [{
+                urls: ["stun:stun.l.google.com:19302"]
+            }],
+            sdpSemantics: "unified-plan"
+        });
+        webrtc14.onsignalingstatechange = signalingstatechange14;
+
+        webrtc14.ontrack = ontrack14
+        let offer = await webrtc14.createOffer({
+
+            offerToReceiveAudio: true,
+            offerToReceiveVideo: true
+        });
+        await webrtc14.setLocalDescription(offer);
+    }
+}
+
+function ontrack14(event) {
+    mediaStream14.addTrack(event.track);
+}
+
+async function signalingstatechange14() {
+    switch (webrtc14.signalingState) {
+        case 'have-local-offer':
+            // let uuid = $('#uuid').val();
+            let url = playUrl14 + "?uuid=" + videoId14 + "&channel=0";
+            $.post(url, {
+                data: btoa(webrtc14.localDescription.sdp)
+            }, function (data) {
+                try {
+                    console.log(data);
+                    webrtc14.setRemoteDescription(new RTCSessionDescription({
+                        type: 'answer',
+                        sdp: atob(data)
+                    }))
+                } catch (e) {
+                    console.warn(e);
+                }
+
+            });
+            break;
+        case 'stable':
+            break;
+        case 'closed':
+            break;
+        default:
+            console.log(`unhandled signalingState is ${webrtc14.signalingState}`);
+            break;
+    }
+}
+
+/*============= 瑙嗛鎾斁 ----- 缁撴潫 ===============*/
+
+/*============= webRtc瑙嗛鎾斁15 ----- 寮�濮� ===============*/
+/**
+ * 寮�濮嬫挱鏀�
+ * @param winTag  鎾斁绐楀彛
+ * @returns {Promise<void>}
+ */
+async function webRtcToPlay15() {
+    if (playUrl15) {
+        mediaStream15 = new MediaStream();
+        $("#video" + splitWin + "_" + windowsNum)[0].srcObject = mediaStream15;
+        webrtc15 = new RTCPeerConnection({
+            iceServers: [{
+                urls: ["stun:stun.l.google.com:19302"]
+            }],
+            sdpSemantics: "unified-plan"
+        });
+        webrtc15.onsignalingstatechange = signalingstatechange15;
+
+        webrtc15.ontrack = ontrack15
+        let offer = await webrtc15.createOffer({
+
+            offerToReceiveAudio: true,
+            offerToReceiveVideo: true
+        });
+        await webrtc15.setLocalDescription(offer);
+    }
+}
+
+function ontrack15(event) {
+    mediaStream15.addTrack(event.track);
+}
+
+async function signalingstatechange15() {
+    switch (webrtc15.signalingState) {
+        case 'have-local-offer':
+            // let uuid = $('#uuid').val();
+            let url = playUrl15 + "?uuid=" + videoId15 + "&channel=0";
+            $.post(url, {
+                data: btoa(webrtc15.localDescription.sdp)
+            }, function (data) {
+                try {
+                    console.log(data);
+                    webrtc15.setRemoteDescription(new RTCSessionDescription({
+                        type: 'answer',
+                        sdp: atob(data)
+                    }))
+                } catch (e) {
+                    console.warn(e);
+                }
+
+            });
+            break;
+        case 'stable':
+            break;
+        case 'closed':
+            break;
+        default:
+            console.log(`unhandled signalingState is ${webrtc15.signalingState}`);
+            break;
+    }
+}
+
+/*============= 瑙嗛鎾斁 ----- 缁撴潫 ===============*/
+
+/*============= webRtc瑙嗛鎾斁16 ----- 寮�濮� ===============*/
+/**
+ * 寮�濮嬫挱鏀�
+ * @param winTag  鎾斁绐楀彛
+ * @returns {Promise<void>}
+ */
+async function webRtcToPlay16() {
+    if (playUrl16) {
+        mediaStream16 = new MediaStream();
+        $("#video" + splitWin + "_" + windowsNum)[0].srcObject = mediaStream16;
+        webrtc16 = new RTCPeerConnection({
+            iceServers: [{
+                urls: ["stun:stun.l.google.com:19302"]
+            }],
+            sdpSemantics: "unified-plan"
+        });
+        webrtc16.onsignalingstatechange = signalingstatechange16;
+
+        webrtc16.ontrack = ontrack16
+        let offer = await webrtc16.createOffer({
+
+            offerToReceiveAudio: true,
+            offerToReceiveVideo: true
+        });
+        await webrtc16.setLocalDescription(offer);
+    }
+}
+
+function ontrack16(event) {
+    mediaStream16.addTrack(event.track);
+}
+
+async function signalingstatechange16() {
+    switch (webrtc16.signalingState) {
+        case 'have-local-offer':
+            // let uuid = $('#uuid').val();
+            let url = playUrl16 + "?uuid=" + videoId16 + "&channel=0";
+            $.post(url, {
+                data: btoa(webrtc16.localDescription.sdp)
+            }, function (data) {
+                try {
+                    console.log(data);
+                    webrtc16.setRemoteDescription(new RTCSessionDescription({
+                        type: 'answer',
+                        sdp: atob(data)
+                    }))
+                } catch (e) {
+                    console.warn(e);
+                }
+
+            });
+            break;
+        case 'stable':
+            break;
+        case 'closed':
+            break;
+        default:
+            console.log(`unhandled signalingState is ${webrtc16.signalingState}`);
+            break;
+    }
+}
+
+/*============= 瑙嗛鎾斁 ----- 缁撴潫 ===============*/

--
Gitblit v1.9.3