407 lines
15 KiB
JavaScript
407 lines
15 KiB
JavaScript
import { layuiObj } from "./index.js";
|
||
import { sosSdk } from "./sosVideoAndAudio.js";
|
||
var sosVideoIndex = null;
|
||
var currentSosVideo = null;
|
||
var sosAlarmVideo = {};
|
||
function popSosVideo(obj) {
|
||
currentSosVideo = JSON.parse(JSON.stringify(obj));
|
||
sosVideoIndex = layuiObj["layer"].open({
|
||
type: 1,
|
||
title: false, //不显示标题栏
|
||
closeBtn: false,
|
||
area: ['640px', '480px'],
|
||
shade: 0.4,
|
||
id: new Date().getTime(), //设定一个id,防止重复弹出
|
||
btnAlign: 'c',
|
||
move: '.layui-move',
|
||
moveType: 1, //拖拽模式,0或者1
|
||
content: `<div class="popWindows">
|
||
<div class="popInfoContent">
|
||
|
||
<div class="popInfoTitle">
|
||
<span class="layui-move">${currentSosVideo["pointAddress"]}</span>
|
||
<img src="./pages/cmddispatch/image/closeInfoWindow.png">
|
||
</div>
|
||
|
||
<div id="sosVideoContent">
|
||
<video id="sosVideo" autoplay="" controls muted=""></video>
|
||
<audio id='sosAudio' autoplay="" /> </audio>
|
||
<div class="sosVideoOpera">
|
||
<div class="sosVideoOperaTime">
|
||
<p>视频观看剩余时间:<span class="sosVideoTime">0</span></p>
|
||
<p>
|
||
<span></span>
|
||
<span>正在录制</span>
|
||
</p>
|
||
</div>
|
||
<div class="sosVideoOperaTool">
|
||
<p class="sosVideoMonitoring" state="open">
|
||
<img src="./pages/cmddispatch/sosVideo/stopMonitor.png" alt="/">
|
||
<span>监听</span>
|
||
</p>
|
||
<p class="sosVideoTalk" state="open">
|
||
<img src="./pages/cmddispatch/sosVideo/stopTalk.png" alt="/">
|
||
<span>对讲</span>
|
||
</p>
|
||
<p class="sosVideoRecording" state="open">
|
||
<img src="./pages/cmddispatch/sosVideo/stopRecord.png" alt="/">
|
||
<span>录制</span>
|
||
</p>
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
</div>`,
|
||
success: function () {
|
||
sosVideo();
|
||
addVideoEvent();
|
||
}
|
||
});
|
||
|
||
$(".popInfoTitle>img").on('click', function () {
|
||
layuiObj["layer"].close(sosVideoIndex)
|
||
sosVideoIndex = null;
|
||
closeSosVideo();
|
||
stopAudioListen();
|
||
sosAudioStop();
|
||
})
|
||
}
|
||
function addVideoEvent() {
|
||
|
||
$(".sosVideoMonitoring").on('click', function () {
|
||
//如果对讲开着,需要去关闭对讲
|
||
if ("audioListenTaskCode" in currentSosVideo) {
|
||
$(".sosVideoTalk").attr("state","open");
|
||
$(".sosVideoTalk>span").css("color", "#fff");
|
||
$(".sosVideoTalk>img").attr("src","./pages/cmddispatch/sosVideo/stopTalk.png");
|
||
sosAudioStop();
|
||
}
|
||
|
||
var state = $(this).attr("state");
|
||
sosBtnOperaSlide(this);
|
||
if (state == "open") {
|
||
$(this).children("img").attr("src", "./pages/cmddispatch/sosVideo/startMonitor.png");
|
||
startAudioListen();
|
||
}else if(state == "close") {
|
||
$(this).children("img").attr("src", "./pages/cmddispatch/sosVideo/stopMonitor.png");
|
||
stopAudioListen();
|
||
}
|
||
})
|
||
|
||
$(".sosVideoTalk").on('click', function () {
|
||
//如果监听开着需要去关闭监听
|
||
if ("audioListenTaskCode" in currentSosVideo) {
|
||
$(".sosVideoMonitoring").attr("state","open");
|
||
$(".sosVideoMonitoring>span").css("color", "#fff");
|
||
$(".sosVideoMonitoring>img").attr("src","./pages/cmddispatch/sosVideo/stopMonitor.png");
|
||
stopAudioListen();
|
||
}
|
||
var state = $(this).attr("state");
|
||
sosBtnOperaSlide(this);
|
||
if (state == "open") {
|
||
$(this).children("img").attr("src", "./pages/cmddispatch/sosVideo/startTalk.png");
|
||
sosAudioStart();
|
||
} else if (state == "close") {
|
||
$(this).children("img").attr("src", "./pages/cmddispatch/sosVideo/stopTalk.png");
|
||
sosAudioStop();
|
||
}
|
||
})
|
||
|
||
$(".sosVideoRecording").on('click', function () {
|
||
var state = $(this).attr("state");
|
||
sosBtnOperaSlide(this);
|
||
if (state == "open") {
|
||
$(this).children("img").attr("src", "./pages/cmddispatch/sosVideo/startRecord.png");
|
||
$(".sosVideoOperaTime>p:last-child").css("display", "block");
|
||
startRecording();
|
||
} else if (state == "close") {
|
||
$(this).children("img").attr("src", "./pages/cmddispatch/sosVideo/stopRecord.png");
|
||
$(".sosVideoOperaTime>p:last-child").css("display", "none");
|
||
stopRecording();
|
||
}
|
||
})
|
||
|
||
}
|
||
function sosBtnOperaSlide(that){
|
||
var state = $(that).attr("state");
|
||
if (state == "open") {
|
||
$(that).attr("state", "close");
|
||
$(that).children("span").css("color", "#01E9FD");
|
||
} else if (state == "close") {
|
||
$(that).attr("state", "open");
|
||
$(that).children("span").css("color", "#fff");
|
||
}
|
||
}
|
||
|
||
//开始录像
|
||
var recordBlob = [];
|
||
async function startRecording() {
|
||
const stateCb = (videoDomId, state) => {
|
||
// 视频录制状态回调函数,videoDomId-->启动时传入的video标签id, state有'inprogress', 'failed', 'finished' 3种状态
|
||
console.log('videoDomId = %s, state = %s', videoDomId, state);
|
||
}
|
||
const dataCb = (videoDomId, blob) => {
|
||
// 视频录制数据回调函数,该回调会1s调用一次,把这1s录制的视频数据通过 blob参数传入回调,blob为js的Blob对象类型
|
||
// 这里进行数据保存或者转发相关操作
|
||
console.log(videoDomId, blob);
|
||
recordBlob.push(blob)
|
||
}
|
||
sosSdk.videoRecordStart({
|
||
// 必选参数
|
||
VideoDomId: 'sosVideo',
|
||
StateCb: stateCb,
|
||
DataCb: dataCb,
|
||
}).then((rsp) => {
|
||
layuiObj.layer.msg("视频录制启动成功",
|
||
{
|
||
color:"#fff"
|
||
}
|
||
);
|
||
}).catch((e) => {
|
||
layuiObj.layer.msg("视频录制启动失败",
|
||
{
|
||
color:"#fff"
|
||
});
|
||
})
|
||
}
|
||
//结束录像
|
||
async function stopRecording() {
|
||
sosSdk.videoRecordStop({ VideoDomId: 'sosVideo' }).then(() => {
|
||
var tmpBlob = new Blob(recordBlob, { type: 'video/webm' });
|
||
// 创建 URL 对象
|
||
const url = URL.createObjectURL(tmpBlob);
|
||
// 创建链接
|
||
const link = document.createElement('a');
|
||
link.href = url;
|
||
link.download = "录像.mp4";
|
||
// 模拟点击链接进行下载
|
||
document.body.appendChild(link);
|
||
link.click();
|
||
document.body.removeChild(link);
|
||
}).catch((error) => {
|
||
console.error('停止视频录制失败', error);
|
||
})
|
||
}
|
||
//显示时间
|
||
var showTimeTimer=null;
|
||
function showVideoTime() {
|
||
var ExpireIn = Math.floor(currentSosVideo["task"]["ExpireIn"]);
|
||
$(".sosVideoTime").html(ExpireIn+"秒");
|
||
showTimeTimer = setInterval(() => {
|
||
if (ExpireIn <= 0) {
|
||
closeVideoClearTime();
|
||
}
|
||
ExpireIn--;
|
||
if (ExpireIn <= 0) {
|
||
ExpireIn = 0;
|
||
}
|
||
$(".sosVideoTime").html(ExpireIn+"秒");
|
||
}, 1000)
|
||
}
|
||
//关闭定时器
|
||
function closeVideoClearTime(){
|
||
if(showTimeTimer!=null){
|
||
clearInterval(showTimeTimer)
|
||
showTimeTimer=null;
|
||
}
|
||
}
|
||
//开始监听
|
||
async function startAudioListen() {
|
||
const disconnectedCallback = (SipNum) => {
|
||
// 开始监听之后,有设备或自己退出监听
|
||
console.warn(SipNum, '已退出监听', sosSdk && sosSdk.isMe(SipNum));
|
||
}
|
||
const stopCallback = () => {
|
||
// 开始监听之后,服务器结束了监听
|
||
console.warn('服务器结束监听');
|
||
}
|
||
sosSdk.audioListenStart({
|
||
// 必填参数
|
||
DeviceId: parseInt(currentSosVideo["deviceId"]),
|
||
AudioDomId: 'sosAudio',
|
||
// 非必填参数
|
||
Force: true,
|
||
OnDisconnected: disconnectedCallback,
|
||
OnStop: stopCallback,
|
||
}).then((ret) => {
|
||
currentSosVideo["audioListenTaskCode"] = ret.TaskCode
|
||
layuiObj.layer.msg("监听开启成功",
|
||
{
|
||
color:"#fff"
|
||
});
|
||
}).catch((e) => {
|
||
console.log('监听失败', e)
|
||
switch (e.code) {
|
||
case 2005:
|
||
layuiObj.layer.msg('监听失败,设备不存在,检查一下SipNum或DeviceId是否错误')
|
||
break;
|
||
case 3551:
|
||
layuiObj.layer.msg('监听失败,本端坐席忙(本端已在另外的一个会话任务中)')
|
||
break;
|
||
case 3552:
|
||
layuiObj.layer.msg('监听失败,设备忙(设备已在另外的一个会话任务中),被其他人坐席端对讲/监听了')
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
})
|
||
}
|
||
//结束监听
|
||
async function stopAudioListen() {
|
||
if ("audioListenTaskCode" in currentSosVideo) {
|
||
const rsp = await sosSdk.audioListenStop({
|
||
TaskCode: currentSosVideo["TaskCode"]
|
||
});
|
||
delete currentSosVideo["audioListenTaskCode"]
|
||
//sosSdk.audioListenStop({
|
||
// TaskCode: currentSosVideo["audioListenTaskCode"]
|
||
//}).then(() => {
|
||
// delete currentSosVideo["audioListenTaskCode"]
|
||
// console.log('停止监听成功');
|
||
//}).catch((error) => {
|
||
// console.log('停止监听失败', error);
|
||
//})
|
||
}
|
||
}
|
||
//开始对讲
|
||
function sosAudioStart() {
|
||
if (sosSdk) {
|
||
let disconnectedCallback = (SipNum) => {
|
||
// 开始对讲之后,有设备或自己退出对讲
|
||
console.warn(SipNum, "已退出对讲", sosSdk && sosSdk.isMe(SipNum));
|
||
}
|
||
let stopCallback = () => {
|
||
// 开始对讲之后,服务器结束了对讲
|
||
console.warn("服务器结束对讲");
|
||
}
|
||
sosSdk.audioSpeakStart({
|
||
// 必填参数
|
||
DeviceId: parseInt(currentSosVideo["deviceId"]),
|
||
AudioDomId: "sosAudio", // 要保证document.getElementById("html_audio_remote")非null,你的audio标签,一定要存在
|
||
// 非必填参数
|
||
Force: true,
|
||
OnDisconnected: disconnectedCallback,
|
||
OnStop:stopCallback,
|
||
}).then((ret) => {
|
||
currentSosVideo["audioSpeakTaskCode"] = ret.TaskCode
|
||
layuiObj.layer.msg("对讲开启成功",
|
||
{icon: 1});
|
||
}).catch((e) => {
|
||
switch (e.code) {
|
||
case 2005:
|
||
layuiObj.layer.msg('对讲失败,设备不存在,检查一下SipNum或DeviceId是否错误',{icon: 2})
|
||
break;
|
||
case 3551:
|
||
layuiObj.layer.msg('对讲失败,本端坐席忙(本端已在另外的一个对讲任务中)',{icon: 2})
|
||
break;
|
||
case 3552:
|
||
layuiObj.layer.msg('对讲失败,设备忙(设备已在另外的一个对讲任务中),被其他人坐席端对讲了',{icon: 2})
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
})
|
||
} else {
|
||
alert("对讲失败,请先启动SDK",{icon: 2})
|
||
}
|
||
}
|
||
// 结束对讲
|
||
async function sosAudioStop() {
|
||
if ("audioSpeakTaskCode" in currentSosVideo) {
|
||
if (sosSdk) {
|
||
const rsp = await sosSdk.audioSpeakStop({
|
||
TaskCode: currentSosVideo["TaskCode"]
|
||
});
|
||
delete currentSosVideo["audioSpeakTaskCode"]
|
||
//sosSdk.audioSpeakStop({
|
||
// TaskCode: currentSosVideo["audioSpeakTaskCode"]
|
||
//}).then(() => {
|
||
// delete currentSosVideo["audioSpeakTaskCode"]
|
||
// console.log("对讲停止成功");
|
||
//}).catch((error) => {
|
||
// console.log("对讲停止失败");
|
||
//})
|
||
}else{
|
||
console.log("对讲停止失败,请先启动SDK")
|
||
}
|
||
}
|
||
}
|
||
|
||
//调用视频的
|
||
async function sosVideo() {
|
||
const stopCallback = () => {
|
||
// 开始监控之后,服务器结束了监控
|
||
console.log('监控结束');
|
||
}
|
||
try {
|
||
const task = await sosSdk.videoMonitorStart({
|
||
DeviceId: parseInt(currentSosVideo["deviceId"]),
|
||
VideoDomId: 'sosVideo',
|
||
OnStop: stopCallback,
|
||
});
|
||
if (!("task" in currentSosVideo)) {
|
||
currentSosVideo["task"] = task;
|
||
}
|
||
showVideoTime();
|
||
} catch (error) {
|
||
layer.msg("获取监控视频失败",{icon: 2});
|
||
}
|
||
}
|
||
//关闭视频
|
||
async function closeSosVideo() {
|
||
if("task" in currentSosVideo){
|
||
try {
|
||
const rsp = await sosSdk.videoMonitorStop({
|
||
TaskCode: currentSosVideo["task"]["TaskCode"]
|
||
});
|
||
delete currentSosVideo["task"];
|
||
closeVideoClearTime();
|
||
} catch (error) {
|
||
console.log('停止监控视频失败', error)
|
||
}
|
||
}
|
||
}
|
||
//调用告警的视频
|
||
async function openSosAlarmVideo(obj) {
|
||
console.log(obj);
|
||
var deviceId=obj["deviceId"];
|
||
const stopCallback = () => {
|
||
// 开始监控之后,服务器结束了监控
|
||
console.log('监控结束')
|
||
}
|
||
try {
|
||
const task = await sosSdk.videoMonitorStart({
|
||
DeviceId:parseInt(deviceId),
|
||
VideoDomId: `sosAlarmVideo${deviceId}`,
|
||
OnStop: stopCallback,
|
||
});
|
||
if (!(deviceId in sosAlarmVideo)) {
|
||
sosAlarmVideo[deviceId] = task.TaskCode
|
||
}
|
||
// console.log(currentSosVideo);
|
||
// console.log('获取监控视频成功 taskCode:', task.TaskCode)
|
||
} catch (error) {
|
||
console.log('获取监控视频失败', error)
|
||
}
|
||
}
|
||
//调用告警关闭视频
|
||
async function closeSosAlarmVideo(deviceId) {
|
||
try {
|
||
const rsp = await sosSdk.videoMonitorStop({
|
||
TaskCode: currentSosVideo["TaskCode"]
|
||
});
|
||
if (deviceId in sosAlarmVideo) {
|
||
delete sosAlarmVideo[deviceId]
|
||
}
|
||
console.log('停止监控视频成功')
|
||
} catch (error) {
|
||
console.log('停止监控视频失败', error)
|
||
}
|
||
}
|
||
export {
|
||
popSosVideo,
|
||
openSosAlarmVideo,
|
||
closeSosAlarmVideo
|
||
} |