multiple-police-situations/public/rtc/js/moveDeviceVideoOne.js

798 lines
21 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import {timestampFormat,getParams,fullScreen,exitFullscreen} from "./timestampFormat.js";
import { mqttUrl } from "../config/url.js";
window.onload=function(){
var locationUrl=window.location.href;
var slider,sliderInit,layer;
layui.use(['slider','layer'], function(){
slider= layui.slider;
layer = layui.layer;
});
var sizeLevel=0;//放大等级
var videotapeStartTime="";//录像开始时间
var videotapeEndTime="";//录像结束时间
var startTimeStamp="";
var endTimeStamp="";
var bApplySign = false;
var applyPage=false;
var keyCode = 32;
var videoTime=60000*12000;
var cdTimeCountFlag="video";//video跟videotape
var cdTimeCount=videoTime;
var countDownTimer=null;
var channelValue=decodeURI(getParams("id"));
var mdDeviceName=decodeURI(getParams("mdDeviceName"));
var station=decodeURI(getParams("station"));
var title=decodeURI(getParams("mdDeviceName"));
var loginUserName=decodeURI(getParams("username"));
var power=decodeURI(getParams("power"));
var rtmName=channelValue;
var client=null;
var buffer=[];
var mediaRecorder =null;
var videoTimer=null;
var options = {
appid: "78846e9910a846688ab959e0f87034e5",
channel: channelValue,
uid: '',
token: null
};
var client=AgoraRTC.createClient({mode: 'live',codec: "vp8"});
var remoteUsers = {};
let localTracks = {
audioTrack: true
};
$("html>head>title").html(title);
videoJoin();
setPower(power);
function setPower(power){
if(power=="null"){
power=0;
}
if(power>=90){
var img="images/power100.png";
}else if(power>=70){
var img="images/power80.png";
}else if(power>=50){
var img="images/power60.png";
}else if(power>=30){
var img="images/power40.png";
}else if(power>=10){
var img="images/power20.png";
}else{
var img="images/power0.png";
}
$(".power>span").html(power+"%");
$(".power>img").attr("src",img);
}
function closePage(){
leaveChannel();//我先离开频道
var obj=getRtmData("videoclose","");//在去关闭
sendMqttData(obj);
window.close();
}
async function leaveChannel() {
// leave the channel
await client.leave();
}
//关闭并退出
$(".videoNav>.nav>img:nth-child(1)").click(function(){
var param = {
"sender":"children",
"receiver":"parent",
"deviceid":channelValue,
"cmd":"closePage"
};
window.parent.postMessage(param,'*');
closePage();
})
window.addEventListener('message', function(e) {
var data=e.data
var cmd=data["cmd"];
var deviceid=data["deviceid"]
if(cmd=="videoclose"){
if(channelValue==deviceid){
closePage();
}
}
})
//如果在全屏
function confClosePage(){
var url=window.location.href;
if(url.indexOf("fullScreenVideo")==-1){
closePage();
}
}
window.onbeforeunload=function(e){
if(locationUrl.indexOf("videoMoitorShow")==-1){
confClosePage();
}
}
window.onresize = function () {
var w=parseFloat(window.innerWidth);
var h=parseFloat(window.innerHeight - 40);
switch(sizeLevel){
case 1:
setVideoSize1280(w,h);
break;
case 2:
setVideoSize720(w,h);
break;
case 3:
setVideoSize480(w,h);
break;
case 4:
setVideoSize640(w,h);
break;
default:
break;
}
}
//1280*720
function setVideoSize1280(w,h){
var f=parseFloat(h/w);
if(f >= 0.5625){
var width=w;
var height=width*0.5625;
var x= 0;
var y=parseFloat(h-height)/2;
}else{
var height=h;
var width=(height*16)/9;
var x=parseFloat(w-width)/2;
var y= 0;
}
setPageSize(x,y,width,height)
}
//720*1280
function setVideoSize720(w,h){
var f=parseFloat(w/h);
if(f>0.5625){
var height=h;
var width=h*0.5625;
var x=parseFloat(w-width)/2;
var y=0;
}else{
var width=w;
var height=(w*16)/9;
var x=0;
var y=parseFloat(h-height)/2;;
}
setPageSize(x,y,width,height)
}
//480*640
function setVideoSize480(w,h){//宽度是480px;height:640px;
var f=parseFloat(w/h);
if(f>0.75){
var height=h;
var width=h*0.75;
var x=parseFloat(w-width)/2;
var y=0;
}else{
var width=w;
var height=(w*4)/3;
var x=0;
var y=parseFloat(h-height)/2;;
}
setPageSize(x,y,width,height)
}
//640*480
function setVideoSize640(w,h){
var f=parseFloat(h/w);
if(f >= 0.75){
var width=w;
var height=width*0.75;
var x= 0;
var y=parseFloat(h-height)/2;
}else{
var height=h;
var width=(height*4)/3;
var x=parseFloat(w-width)/2;
var y= 0;
}
setPageSize(x,y,width,height)
}
function setPageSize(x,y,width,height){
$("#video").css("width",width+"px");
$("#video").css("height",height+"px");
$("#video").css("left",x);
$("#video").css("top",y);
}
$(".videoFullscreen").unbind('click');
$(".videoFullscreen").click(function(){
console.log(123456);
var url=window.location.href;
if(url.indexOf("alarmDeviceVideo")!=-1){
//投一个新的屏幕出去
var width=1280;
var height=760;
window.open("fullScreenVideo.html?id="+encodeURI(channelValue)+"&power="+encodeURI(power)+"&mdDeviceName="+encodeURI(encodeURI(mdDeviceName))+"&station="+encodeURI(encodeURI(station))+"&title="+encodeURI(encodeURI(title))+"&username="+loginUserName,"","width="+width+",height="+height+",top=0,left=0");
}else{
var model=$(this).attr("model");
if(model=="exitfullScreen"){
fullScreen()
$(this).attr("src","images/videoExitFullscreen.png").attr("model","fullScreen").attr("title","退出全屏")
}else{
exitFullscreen()
$(this).attr("src","images/videoFullscreen.png").attr("model","exitfullScreen").attr("title","全屏");
}
}
})
//打开声音
function openMute(select){
$(select).attr("src","images/openMute.png");
$(select).attr("title","音量");
$(select).attr("mute","open");
}
//关闭声音
function closeMute(select){
$(select).attr("src","images/closeMute.png");
$(select).attr("title","静音");
$(select).attr("mute","close");
}
//初始化声音
function videoSlideInit(){
sliderInit=slider.render({
elem: '#slideTest1',
change: function(value){
var select=$(".closeMute");
if(value==0){
closeMute(select);
}else{
openMute(select);
}
setRemoteUserMute(value*10);
}
});
}
function setRemoteUserMute(value){
for(var user in remoteUsers){
remoteUsers[user].audioTrack.setVolume(value);
}
}
let cameraid=0;
let rotateid=0;
//摄像图的操作
$(".carmeOper").on('click',function(){
rotateid=parseInt($(this).attr("rotate"));
$(".carmeOper").removeClass("bgColor");
$(this).addClass("bgColor")
sendCarmeOper();
})
//摄像头的方向调整
$(".carmeDir").on('click',function(){
let dir=$(this).attr("dir");
cameraid=dir;
if(dir=="0"){
$(this).attr("dir","1");
$(this).html("后");
}else{
$(this).attr("dir","0");
$(this).html("前");
}
sendCarmeOper();
})
function sendCarmeOper(){
var obj=getRtmData("videoclose","");
sendMqttData(obj);
setTimeout(()=>{
let data={
"rtmpflag":0,
"camera":cameraid,
"rotation":rotateid
}
var obj=getRtmData("videocall",JSON.stringify(data));
sendMqttData(obj);
videoInfoWind();
},4000)
}
//调节音量大小
$(".closeMute").click(function(){
var mute=$(this).attr("mute");
if(mute=="open"){
setRemoteUserMute(0)
sliderInit.setValue(0) //设置开始值
closeMute(this);
}else{
setRemoteUserMute(1000)
sliderInit.setValue(100) //设置开始值
openMute(this);
}
})
async function videoJoin() {
//订阅用户推送流
client.on("user-published", handleUserPublished);
//订阅用户取消推流
client.on("user-unpublished", handleUserUnpublished);
try {
// join a channel and create local tracks, we can use Promise.all to run them concurrently
[ options.uid] = await Promise.all([
// join the channel
client.join(options.appid, options.channel, options.token || null),
]);
} catch (e) {
console.log("加入频道失败", e);
}
// 使用 Web SDK 4.x,服务器频道禁用以后,客服端需要退出页面跟频道
client.on("connection-state-change", (curState, prevState) => {
closePage();
});
}
async function subscribe(user, mediaType) {
const uid = user.uid;
// subscribe to a remote user
await client.subscribe(user, mediaType);
if (mediaType === 'video') {
const player = $(`
<div id="player-${uid}" class="player"></div>
`);
$("#agora_local").append(player);
user.videoTrack.play(`player-${uid}`);
//设置视频数据
setVideoData();
//初始化视频的尺寸
videoInfoWind();
setInterval(function(){
var obj=getRtmData("videowatching","");
sendMqttData(obj)
//每隔1分钟发送发送1个不关闭视频的指令
},60000)
}
if(mediaType === 'audio'){
setRemoteUserMute(0);
//初始化音量
videoSlideInit();
user.audioTrack.play();
}
}
function handleUserPublished(user, mediaType) {
const id = user.uid;
remoteUsers[id] = user;
subscribe(user, mediaType);
}
function handleUserUnpublished(user) {
const id = user.uid;
delete remoteUsers[id];
$(`#player-wrapper-${id}`).remove();
}
function setVideoData(){
setInterval(()=>{
var evt=client.getRemoteVideoStats();
if(JSON.stringify(evt)!="{}"){
for(var j in evt){
var packetLossRate=evt[j]["packetLossRate"]
var receiveBitrate=parseFloat(evt[j]["receiveBitrate"]/1024).toFixed(2);
var receiveFrameRate=evt[j]["receiveFrameRate"]
var totalDuration=evt[j]["totalDuration"]
var totalFreezeTime=evt[j]["totalFreezeTime"]
var transportDelay=evt[j]["transportDelay"]
$(".PacketLossRate").html(packetLossRate);
$(".RecvBitrate").html(receiveBitrate);
$(".RenderFrameRate").html(receiveFrameRate);
$(".TotalPlayDuration").html(totalDuration);
$(".TotalFreezeTime").html(totalFreezeTime);
$(".TransportDelay").html(transportDelay);
}
}
},1000)
}
function videoInfoWind(){
videoTimer=setInterval(() => {
var evt=client.getRemoteVideoStats();
if(JSON.stringify(evt)!="{}"){
for(var i in evt){
if("receiveResolutionHeight" in evt[i]){
var RecvResolutionHeight=evt[i]["receiveResolutionHeight"];
}
if("receiveResolutionWidth" in evt[i]){
var RecvResolutionWidth=evt[i]["receiveResolutionWidth"];
}
if((RecvResolutionWidth!="0"&&RecvResolutionHeight!="0")&&(RecvResolutionWidth!=undefined&&RecvResolutionHeight!=undefined)){
clearInterval(videoTimer);
var width=RecvResolutionWidth;
var height=parseFloat(RecvResolutionHeight);
if(RecvResolutionWidth=="1280"&&RecvResolutionHeight=="720"){
sizeLevel=1;
setVideoSize1280(width*0.5,height*0.5);
window.resizeTo(width,height);
}else if(RecvResolutionWidth=="720"&&RecvResolutionHeight=="1280"){
if(window.screen.height+200<=height){
width=width*0.8;
height=height*0.8;
}
sizeLevel=2;
setVideoSize720(width*0.5,height*0.5);
window.resizeTo(width,height);
}else if(RecvResolutionWidth=="480"&&RecvResolutionHeight=="640"){
sizeLevel=3;
setVideoSize480(width*0.5,height*0.5);
window.resizeTo("496","750");
}else if(RecvResolutionWidth=="640"&&RecvResolutionHeight=="480"){
sizeLevel=4;
setVideoSize640(width*0.5,height*0.5);
window.resizeTo(RecvResolutionWidth,RecvResolutionHeight);
}
var param={
"deviceid":channelValue,
"cmd":"videoloadedSuccess"
}
parent.postMessage(param,'*');
//启动倒计时
downTime30();
}
}
}
},1000)
}
//设置stream
function setRecStream(){
let mediaStream = new MediaStream();
for(var user in remoteUsers){
mediaStream.addTrack(remoteUsers[user].videoTrack.getMediaStreamTrack())
mediaStream.addTrack(remoteUsers[user].audioTrack.getMediaStreamTrack())
}
window.stream=mediaStream;
}
//开启远程录像
$(".startRecording").unbind();
$(".startRecording").click(function(){
var recordState=$(this).attr("state");
if(recordState=="open"){
setRecStream();
startRecord();
startTimeStamp=new Date().getTime();
videotapeStartTime=timestampFormat();
$(this).attr("state","close");
$(this).attr("src","images/endRecording.png");
$(this).attr("title","结束录像");
layer.msg("录像开启成功");
$(".inTheVideo").css("display","block");
cdTimeCountFlag="videotape";
downTime30();
}else{
endTimeStamp=new Date().getTime();
videotapeEndTime=timestampFormat();
stopRecord();
cdTimeCount=videoTime;
clearInterval(countDownTimer);
countDownTimer=null;
cdTimeCountFlag="video";
}
})
//视频信息
$(".videoReInfo").on('click',function(){
var state=$(this).attr("state");
if(state=="close"){
$(this).attr("state","open");
$(".videoInfo").css("display","block");
}else{
$(this).attr("state","close");
$(".videoInfo").css("display","none");
}
})
async function setClientHost(){
//设置成主播
await client.setClientRole("host");
try {
// join a channel and create local tracks, we can use Promise.all to run them concurrently
[localTracks.audioTrack] = await Promise.all([
// create local tracks, using microphone and camera
AgoraRTC.createMicrophoneAudioTrack()
]);
await client.publish(Object.values(localTracks));
} catch (e) {
console.log("加入频道失败", e);
}
}
async function setClientAudience(){
//先调用取消发布,在设置成观众
await client.unpublish(Object.values(localTracks));
await client.setClientRole("audience");
}
//开启对讲
$(".videoWalk").unbind();
$(".videoWalk").click(function(){
var state=$(this).attr("state");
if(state=="close"){
//开启
$(this).attr("state","open");
$(this).attr("src","images/videoWalkOnline.png");
applyPage=true;
bApplySign=true;
setClientHost();
}else{
applyPage=false;
bApplySign=false;
//关闭
$(this).attr("state","close");
$(this).attr("src","images/videoWalk.png");
setClientAudience();
}
})
//键盘松开
document.onkeyup = function (event) {
var e = event || window.event || arguments.callee.caller.arguments[0];
if(applyPage){
if(e && e.keyCode == keyCode&&!bApplySign) {
bApplySign = true;
//关闭麦克风
localTracks.audioTrack.setEnabled(false);
//开启远程的声音
setRemoteUserMute(100);
var select=$(".closeMute");
openMute(select);
sliderInit.setValue(100) //设置开始值
}
}
}
//键盘按下
document.onkeydown = function (event) {
var e = event || window.event || arguments.callee.caller.arguments[0];
if(applyPage){
if(e && e.keyCode == keyCode&&bApplySign) {
bApplySign = false;
//启用麦克风
localTracks.audioTrack.setEnabled(true);
//关闭远程的声音
setRemoteUserMute(0);
//页面状态改变
sliderInit.setValue(0) //设置开始值
var select=$(".closeMute");
closeMute(select);
}
}
}
//截图,并且把图片保存在云端
$(".videoImg").click(function(){
var video=document.querySelector(".agora_video_player");
var canvas=document.getElementById('canvas');
if(video!=null){
$(".canvasImg").css("display","block");
canvas.width=video.videoWidth;
canvas.height=video.videoHeight;
canvas.getContext('2d').drawImage(video,0,0,canvas.width,canvas.height);
var image = canvas . toDataURL ("image/png") ;
$(".canvasImgBox").css("width",canvas.width*0.3+"px");
$(".canvasImgBox").css("height",canvas.height*0.3+"px");
document.getElementById("save").href=image;
document.getElementById("save").download=mdDeviceName+".jpg";
document.getElementById('save').onclick=function(){
$(".canvasImg").css("display","none");
}
document.getElementById('cancel').onclick=function(){
$(".canvasImg").css("display","none");
}
}else{
layer.msg("用户已离开,无法截图");
}
})
function closeVideoStream(){
var obj=getRtmData("videoclose","");//在去关闭
sendMqttData(obj);
}
//倒计时30分钟以后关闭录像告诉用户,录像已经完成
/*************************观看视频为5分钟1次如果不点击确定就会关闭***********************************/
function downTime30(){
if(countDownTimer!=null){
clearInterval(countDownTimer);
}else{
countDownTimer=setInterval(function(){
cdTimeCount-=1000;
if(cdTimeCount<=0){
clearInterval(countDownTimer);
countDownTimer=null;
if(cdTimeCountFlag=="videotape"){
endTimeStamp=new Date().getTime();
videotapeEndTime=timestampFormat();
stopRecord();
}else{
//倒计时
showCountDownTimer();
}
}
},1000);
}
}
//倒计时*******************************************
var closeTime=10;//倒计时
var closePageTimer=null;
function showCountDownTimer(){
$(".videoTitle").css("display","block");
$(".close_ing_time").html(closeTime);
videoTitleEvent();
closePageTimer=setInterval(function(){
closeTime--;
$(".close_ing_time").html(closeTime);
if(closeTime<=0){
closeVideoStream();//发送关闭指令
leaveChannel();//离开频道
clearInterval(closePageTimer);//退出定时器
}
},1000);
}
function videoTitleEvent(){
$(".videoTitle>p:last-child>button:nth-child(1)").on('click',function(){
var obj=getRtmData("videocall","");//在去关闭
sendMqttData(obj);
$(".videoTitle").css("display","none");
clearInterval(closePageTimer);
closePageTimer=null;
closeTime=10;
cdTimeCount=videoTime;
//再次加入频道
videoJoin()
downTime30()
})
$(".videoTitle>p:last-child>button:nth-child(2)").on('click',function(){
closePage();
})
}
function handleDataAvailable(e){ // 5、获取数据的事件函数 当我们点击录制之后,数据就会源源不断的从这个事件函数中获取到
if(e && e.data && e.data.size > 0){
console.log(e.data);
buffer.push(e.data); // 将e.data放入二进制数组里面
// 这个buffer应该是我们在开始录制的时候创建这个buffer
}
}
//开始录像
function startRecord(){
buffer = []; // 定义数组
if (typeof MediaRecorder.isTypeSupported == 'function') {
if (MediaRecorder.isTypeSupported('video/webm;codecs=vp8')) {
var options = {
mimeType: 'video/webm;codecs=vp9,opus'
}
} else if (MediaRecorder.isTypeSupported('video/webm;codecs=vp9')) {
var options = {
mimeType:'video/webm;codecs=vp9,opus'
};
} else if (MediaRecorder.isTypeSupported('video/webm;codecs=h264')) {
var options = {
mimeType:'video/webm;codecs=h264,opus'
};
}
}
if(!MediaRecorder.isTypeSupported(options.mimeType)){ // 判断录制的视频 mimeType 格式浏览器是否支持
return;
}
try{ // 防止录制异常
// 5、先在上面定义全局对象mediaRecorder以便于后面停止录制的时候可以用到
mediaRecorder = new MediaRecorder(window.stream, options); // 调用录制API // window.stream在gotMediaStream中获取
//4、调用事件 这个事件处理函数里面就会收到我们录制的那块数据 当我们收集到这个数据之后我们应该把它存储起来
mediaRecorder.ondataavailable = handleDataAvailable;
mediaRecorder.start(0); // start方法里面传入一个时间片每隔一个 时间片存储 一块数据
}catch(e){
console.error(e);
return;
}
}
//停止录制
function stopRecord(){
//6、调用停止录制
try{
mediaRecorder.stop();
}catch(e){
console.error(e);
}
$(".startRecording").attr("state","open");
$(".startRecording").attr("src","images/startRecording.png");
$(this).attr("title","开始录像");
layer.msg('录像已保存', {
time: false, //20s后自动关闭
btn: ['知道了']
});
$(".inTheVideo").css("display","none");
var tmpBlob = new Blob(buffer, {type: 'video/webm'});
var duration=endTimeStamp-startTimeStamp;
//调用设置时长代码。该函数基于fix-webm-duration.js
ysFixWebmDuration(tmpBlob, duration, function (fixedBlob) {
var recorderFile = fixedBlob;
let name =`${mdDeviceName}(${videotapeStartTime}---${videotapeEndTime}).mp4`;
var url = window.URL.createObjectURL(recorderFile);
var a = document.createElement('a');
a.href = url;
a.style.display = 'none';
a.download = name;
a.click();
});
}
//构建rtm发送对象
function getRtmData(title,data){
return {
"title":title,
"sender":loginUserName,
"department":"",
"scope":"",
"receiver":[rtmName],
"video":"",
"rtm":(new Date().getTime()).toString(),
"data":data,
"userScope":"",
"userBragide":"",
"userDetachchment":"",
"userBorough":"",
"name":"",
}
}
//发送mqqt接口数据
function sendMqttData(obj){
var mqttObj={
"topic":`${station}/ter_cmd`,
"message":JSON.stringify(obj)
}
$.ajax({
url: mqttUrl,
type: "post",
dataType: "json",
headers: {
"Content-Type": "application/json;charset=utf-8"
},
data: JSON.stringify(mqttObj),
success: function(d) {
//console.error(d);
}
})
}
}