var layer; var splitWin = 1; //分屏数,默认1分屏 var windowsNum = null; //播放窗口下标,手动选择模式下使用 var timer; var table; var curCamera = null; var playCamera = null; var playList = {}; 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; $(function () { layui.use(['layer', 'table'], function () { layer = layui.layer; table = layui.table; }); //初始化渲染播放列表 renderList(); }); /** * 渲染监控列表 */ function renderList() { if (!listCamera || listCamera.length == 0) { return; } var eleTable = document.getElementById("cameraList"); var _tr; var _td; $.each(listCamera, function (index, item) { _tr = document.createElement("tr"); _tr.ondblclick = function () { getMedia(index); }; _td = document.createElement("td"); _td.innerText = item.name; _tr.appendChild(_td); _td = document.createElement("td"); _td.innerText = item.type == "01" ? "枪机" : "球机"; _tr.appendChild(_td); _td = document.createElement("td"); _td.innerText = item.status == "OFF" ? "离线" : "在线"; _tr.appendChild(_td); eleTable.appendChild(_tr); }) } /** * 点击获取播放信息 * @param index */ function getMedia(index) { if(windowsNum == null){ windowsNum = 1; } playCamera = null; var camera = listCamera[index]; playList[windowsNum] = camera; var data = { id: camera.id, playType: camera.playType }; $.ajax({ type: 'POST', url: "/security/get-media", dataType: 'JSON', contentType: "application/json;charset=UTF-8", data: JSON.stringify(data), success: function (result) { if (result.code != "SUCCESS") { layer.msg(result.msg); } else { playCamera = result; startPlay(); } }, error: function (result) { layer.msg(result.msg); startPlay(); } }); }; /** * 播放窗口选中 * @param win1 分屏数 * @param win2 选中窗口数 */ function selectWin(win1, win2) { if (windowsNum) { removeSelectCss(); } splitWin = win1; windowsNum = win2; addSelectCss(); curCamera = playList[windowsNum]; } /** * 去除选中CSS */ function removeSelectCss() { const target = document.getElementById("f" + splitWin + "_d" + windowsNum); target.classList.remove('active'); } /** * 增加选中CSS */ function addSelectCss() { const target = document.getElementById("f" + splitWin + "_d" + windowsNum); target.classList.add('active'); } /** * 分屏切换 * @param tagNum 分屏数 */ function fenping(tagNum) { if (windowsNum) { removeSelectCss(); } playList = {}; //重置切换前的分屏窗口 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"); $("#video_1").css('display', 'grid'); $("#video_4").css('display', 'none'); $("#video_9").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"); $("#video_1").css('display', 'none'); $("#video_4").css('display', 'grid'); $("#video_9").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"); $("#video_1").css('display', 'none'); $("#video_4").css('display', 'none'); $("#video_9").css('display', 'grid'); } windowsNum = null; } /** * 重置分屏前的窗口 * @param num */ function reloadView(num) { var html; for (var i = 1; i <= num; i++) { html = ''; html += ''; $("#f" + num + "_d" + i).html(html); } } function startPlay() { if(windowsNum > splitWin){ windowsNum = 1; } if (!playCamera) { $("#f" + splitWin + "_d" + windowsNum).html("未获取到摄像头播放信息!!"); } if (playCamera.playUrl) { if (windowsNum === 1) { playUrl1 = null; mediaStream1 = null; playUrl1 = playCamera.playUrl; videoId1 = playCamera.cameraId; webRtcToPlay1(); }else if (windowsNum === 2) { playUrl2 = null; mediaStream2 = null; playUrl2 = playCamera.playUrl; videoId2 = playCamera.cameraId; webRtcToPlay2(); }else if (windowsNum === 3) { playUrl3 = null; mediaStream3 = null; playUrl3 = playCamera.playUrl; videoId3 = playCamera.cameraId; webRtcToPlay3(); }else if (windowsNum === 4) { playUrl4 = null; mediaStream4 = null; playUrl4 = playCamera.playUrl; videoId4 = playCamera.cameraId; webRtcToPlay4(); }else if (windowsNum === 5) { playUrl5 = null; mediaStream5 = null; playUrl5 = playCamera.playUrl; videoId5 = playCamera.cameraId; webRtcToPlay5(); }else if (windowsNum === 6) { playUrl6 = null; mediaStream6 = null; playUrl6 = playCamera.playUrl; videoId6 = playCamera.cameraId; webRtcToPlay6(); }else if (windowsNum === 7) { playUrl7 = null; mediaStream7 = null; playUrl7 = playCamera.playUrl; videoId7 = playCamera.cameraId; webRtcToPlay7(); }else if (windowsNum === 8) { playUrl8 = null; mediaStream8 = null; playUrl8 = playCamera.playUrl; videoId8 = playCamera.cameraId; webRtcToPlay8(); }else if (windowsNum === 9) { playUr9 = null; mediaStream9 = null; playUrl9 = playCamera.playUrl; videoId9 = playCamera.cameraId; webRtcToPlay9(); } curCamera = playList[windowsNum]; } else { $("#f" + splitWin + "_d" + windowsNum).html("未获取到摄像头(" + playCamera.cameraName + ")播放信息!!"); } } /*============= webRtc视频播放1 ----- 开始 ===============*/ /** * 开始播放 * @param winTag 播放窗口 * @returns {Promise} */ 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} */ 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} */ 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} */ 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} */ 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} */ 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} */ 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} */ 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} */ 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; } } /*============= 视频播放 ----- 结束 ===============*/