ucservice 1.4.9 → 1.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12113,6 +12113,13 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
12113
12113
  }
12114
12114
 
12115
12115
  return e.returnValue;
12116
+ },
12117
+
12118
+ /**
12119
+ * 清空事件
12120
+ */
12121
+ removeAllListeners: function () {
12122
+ this._listeners = {};
12116
12123
  }
12117
12124
  };
12118
12125
  let videoListener = new Listener();
@@ -12753,21 +12760,21 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
12753
12760
  * 添加事件
12754
12761
  */
12755
12762
  addListener: function (type, handler, key) {
12756
- videoListener.addListener(type, handler, key);
12763
+ this.videoListener.addListener(type, handler, key);
12757
12764
  },
12758
12765
 
12759
12766
  /**
12760
12767
  * 删除事件
12761
12768
  */
12762
12769
  removeListener: function (type, handler) {
12763
- videoListener.removeListener(type, handler);
12770
+ this.videoListener.removeListener(type, handler);
12764
12771
  },
12765
12772
 
12766
12773
  /**
12767
12774
  * 派发事件
12768
12775
  */
12769
12776
  dispatch: function (e, options) {
12770
- videoListener.dispatch(e, options);
12777
+ this.videoListener.dispatch(e, options);
12771
12778
  },
12772
12779
 
12773
12780
  /**
@@ -13163,11 +13170,14 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13163
13170
  function VideoWebRtc($dom, opts) {
13164
13171
  let _self = this;
13165
13172
 
13173
+ _self.videoListener = new Listener();
13174
+
13166
13175
  if (!opts) {
13167
13176
  console.error('VideoWebRtc的参数opts不能为空');
13168
13177
  return;
13169
13178
  }
13170
13179
 
13180
+ _self.configOpt = opts && opts.configOpt || 3;
13171
13181
  hasMediaDevices(); //检测声卡设备为异步方法,耗时在几十毫秒左右,因此需要做延迟
13172
13182
  //默认检查次数为40 间隔为20ms
13173
13183
 
@@ -13208,6 +13218,13 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13208
13218
  // console.info('该视频正在播放');
13209
13219
  // return false;
13210
13220
  // }
13221
+ // 启用播放队列时,当前位置正在关闭上一个视频,则加入播放队列
13222
+
13223
+ if (me.waitPlayQueueSwitch && me.VIDEO_DATA[index].isClosing) {
13224
+ me._addWaitingVideo(index, video, id, opts);
13225
+
13226
+ return;
13227
+ }
13211
13228
 
13212
13229
  console.log("play >>> " + "video=" + video + "; id=" + id + "; index=" + index);
13213
13230
  me.dispatch('beforeplay', {
@@ -13306,7 +13323,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13306
13323
  */
13307
13324
  playInChoice: function (video, id, opts) {
13308
13325
  let me = this;
13309
- let selView = $('[video-flag="' + me._opts.windowsBeginIndex + '"]>li.sel');
13326
+ let selView = $(me.selector + ' li.sel');
13310
13327
 
13311
13328
  if (selView.length) {
13312
13329
  if (me.VIDEO_DATA[selView.index()].playing) {
@@ -13363,6 +13380,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13363
13380
  this.VIDEO_DATA[index].close();
13364
13381
 
13365
13382
  if (!isSave) {
13383
+ this.VIDEO_DATA[index].closeType = 'close';
13366
13384
  this.dispatch('afterclose', this.VIDEO_DATA[index]);
13367
13385
  }
13368
13386
  },
@@ -13389,6 +13407,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13389
13407
  me.close(videoData[i].index);
13390
13408
 
13391
13409
  if (!isSave) {
13410
+ videoData[i].closeType = 'close';
13392
13411
  me.dispatch('afterclose', videoData[i]);
13393
13412
  }
13394
13413
  }
@@ -13399,13 +13418,17 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13399
13418
  * 关闭所有视频
13400
13419
  */
13401
13420
  closeAll: function (isSave) {
13402
- let me = this;
13421
+ let me = this; // 清除所有等待播放队列
13422
+
13423
+ me._removeAllWaitingVideo();
13424
+
13403
13425
  let openVideos = [];
13404
13426
 
13405
13427
  for (let i = me._opts.windowsBeginIndex; i < me._opts.windowsBeginIndex + me._opts.windowsNum; i++) {
13406
- if (me.VIDEO_DATA[i].playing) {
13407
- me.close(i, isSave);
13408
- }
13428
+ // if(me.VIDEO_DATA[i].playing){
13429
+ // me.close(i, isSave)
13430
+ // }
13431
+ me.close(i, isSave);
13409
13432
  } // if(!openVideos.length) return;
13410
13433
  //
13411
13434
  // //适当延时进行关闭
@@ -13445,9 +13468,9 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13445
13468
  me.setChoiceWindow(me._getMinIndexFreeWindow());
13446
13469
  }
13447
13470
 
13448
- $('[video-flag="' + me._opts.windowsBeginIndex + '"]').removeClass("mode-" + me._opts.windows).addClass("mode-" + num);
13471
+ $(me.selector + ' .video-main').removeClass("mode-" + me._opts.windows).addClass("mode-" + num);
13449
13472
 
13450
- let _li = $('[video-flag="' + me._opts.windowsBeginIndex + '"]>li').hide();
13473
+ let _li = $(me.selector + ' li').hide();
13451
13474
 
13452
13475
  me._opts.windows = num;
13453
13476
 
@@ -13474,7 +13497,11 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13474
13497
  for (let k = 0; k < _li.length; k++) {
13475
13498
  let rotateIndex = _li.eq(k).find('button[name=rotateVideo]').attr('rotate-index');
13476
13499
 
13477
- if (rotateIndex != 0 && rotateIndex != 2) me.videoRotateSize(_li.eq(k)[0], rotateIndex);
13500
+ if (rotateIndex != 0 && rotateIndex != 2) {
13501
+ setTimeout(() => {
13502
+ me.videoRotateSize(_li.eq(k)[0], rotateIndex);
13503
+ }, 200);
13504
+ }
13478
13505
  }
13479
13506
  },
13480
13507
 
@@ -13503,7 +13530,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13503
13530
  me.saveList();
13504
13531
  this._polltimer = new PollTimer(function (firstRun) {
13505
13532
  me.closeAll();
13506
- wait(500).then(function () {
13533
+
13534
+ if (firstRun) {
13507
13535
  for (let i = 0; i < windowNum; i++) {
13508
13536
  if (nowNum == maxNum) {
13509
13537
  nowNum = 0;
@@ -13517,10 +13545,23 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13517
13545
  nowNum++;
13518
13546
  }
13519
13547
 
13520
- if (firstRun) {
13521
- me.dispatch('startpoll', array);
13522
- }
13523
- });
13548
+ me.dispatch('startpoll', array);
13549
+ } else {
13550
+ wait(1500).then(function () {
13551
+ for (let i = 0; i < windowNum; i++) {
13552
+ if (nowNum == maxNum) {
13553
+ nowNum = 0;
13554
+
13555
+ if (maxNum < windowNum) {
13556
+ break;
13557
+ }
13558
+ }
13559
+
13560
+ me.playByOrder(array[nowNum].video, array[nowNum].id, array[nowNum].opts);
13561
+ nowNum++;
13562
+ }
13563
+ });
13564
+ }
13524
13565
  }, time);
13525
13566
  },
13526
13567
 
@@ -13643,10 +13684,10 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13643
13684
  */
13644
13685
  getInChoiceVideo: function () {
13645
13686
  let me = this;
13646
- let selView = $('[video-flag="' + me._opts.windowsBeginIndex + '"]>li.sel');
13687
+ let selView = $(me.selector + ' li.sel');
13647
13688
 
13648
- if (selView.length && me.VIDEO_DATA[selView.index()].video) {
13649
- return me.VIDEO_DATA[selView.index()];
13689
+ if (selView.length && me.VIDEO_DATA[selView.attr("index")].video) {
13690
+ return me.VIDEO_DATA[selView.attr("index")];
13650
13691
  }
13651
13692
 
13652
13693
  return undefined;
@@ -13682,10 +13723,23 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13682
13723
 
13683
13724
  let canvasObj = document.getElementById('myCanvas');
13684
13725
  let videoObj = dataObj.tagBox.get(0);
13685
- canvasObj.width = dataObj.tagBox.parent().width();
13686
- canvasObj.height = dataObj.tagBox.parent().height();
13726
+
13727
+ if (videoObj == undefined) {
13728
+ return;
13729
+ } // 取流中 取视频框尺寸
13730
+ // 播放中 取视频画面尺寸
13731
+
13732
+
13733
+ if (dataObj.tagBox.parent().find(".stream-loading").length != 0) {
13734
+ canvasObj.width = dataObj.tagBox.width();
13735
+ canvasObj.height = dataObj.tagBox.height();
13736
+ } else {
13737
+ canvasObj.width = videoObj.videoWidth;
13738
+ canvasObj.height = videoObj.videoHeight;
13739
+ }
13740
+
13687
13741
  let ctx = canvasObj.getContext("2d");
13688
- ctx.drawImage(videoObj, 0, 0, dataObj.tagBox.parent().width(), dataObj.tagBox.parent().height());
13742
+ ctx.drawImage(videoObj, 0, 0, videoObj.videoWidth, videoObj.videoHeight);
13689
13743
  let dataUrl = canvasObj.toDataURL('image/jpeg');
13690
13744
  callback ? callback(dataUrl) : null;
13691
13745
  },
@@ -13732,8 +13786,10 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13732
13786
 
13733
13787
  if (index < 0) {
13734
13788
  console.error('窗口编号获取失败!');
13735
- }
13789
+ } //保存对讲号码
13790
+
13736
13791
 
13792
+ window.pocNo = pocNo;
13737
13793
  return me.VIDEO_DATA[index].pocCall("open_poccall", pocNo, centerTel);
13738
13794
  },
13739
13795
 
@@ -13757,6 +13813,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13757
13813
  }
13758
13814
 
13759
13815
  me.VIDEO_DATA[index].stream = null;
13816
+ window.pocNo = null;
13760
13817
  return me.VIDEO_DATA[index].pocCall("close_poccall", pocNo, centerTel);
13761
13818
  },
13762
13819
 
@@ -13791,21 +13848,28 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13791
13848
  * 添加事件
13792
13849
  */
13793
13850
  addListener: function (type, handler, key) {
13794
- videoListener.addListener(type, handler, key);
13851
+ this.videoListener.addListener(type, handler, key);
13795
13852
  },
13796
13853
 
13797
13854
  /**
13798
13855
  * 删除事件
13799
13856
  */
13800
13857
  removeListener: function (type, handler) {
13801
- videoListener.removeListener(type, handler);
13858
+ this.videoListener.removeListener(type, handler);
13802
13859
  },
13803
13860
 
13804
13861
  /**
13805
13862
  * 派发事件
13806
13863
  */
13807
13864
  dispatch: function (e, options) {
13808
- videoListener.dispatch(e, options);
13865
+ this.videoListener.dispatch(e, options);
13866
+ },
13867
+
13868
+ /**
13869
+ * 清空事件
13870
+ */
13871
+ removeAllListeners: function () {
13872
+ this.videoListener.removeAllListeners();
13809
13873
  },
13810
13874
 
13811
13875
  /**
@@ -13816,7 +13880,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13816
13880
  index = index || me._opts.windowsBeginIndex;
13817
13881
 
13818
13882
  for (; index < me._opts.windowsBeginIndex + me._opts.windows; index++) {
13819
- if (!me.VIDEO_DATA[index].playing) {
13883
+ if (!me.VIDEO_DATA[index].playing && !me.VIDEO_DATA[index].isWaiting) {
13820
13884
  return index;
13821
13885
  }
13822
13886
  }
@@ -13829,7 +13893,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13829
13893
  */
13830
13894
  _getChoiceWindow: function () {
13831
13895
  let me = this;
13832
- let selView = $('[video-flag="' + me._opts.windowsBeginIndex + '"]>li.sel');
13896
+ let selView = $(me.selector + ' li.sel');
13833
13897
 
13834
13898
  if (selView.length) {
13835
13899
  return selView.index();
@@ -13862,13 +13926,40 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13862
13926
  _clickWindow: function () {
13863
13927
  let me = this; //视频窗口选中
13864
13928
 
13865
- $('[video-flag="' + me._opts.windowsBeginIndex + '"]>li').click(function () {
13866
- $('[video-flag="' + me._opts.windowsBeginIndex + '"]>li').removeClass("sel");
13929
+ $(me.selector + ' li').click(function () {
13930
+ $(me.selector + ' li').removeClass("sel");
13867
13931
  $(this).addClass("sel"); //如果视频正在播放则分发点击消息
13868
13932
 
13869
13933
  if (me.getInChoiceVideo()) {
13870
13934
  me.dispatch('click', me.getInChoiceVideo());
13871
13935
  }
13936
+ }); // 设置视频窗可拖拽
13937
+
13938
+ let src = null;
13939
+ $(me.selector + ' li').bind("dragstart", function (ev) {
13940
+ src = $(this);
13941
+ });
13942
+ $(me.selector + ' li').bind("dragover", function (ev) {
13943
+ ev.preventDefault();
13944
+ });
13945
+ $(me.selector + ' li').bind("drop", function (ev) {
13946
+ ev.preventDefault();
13947
+
13948
+ if (src.prop("outerHTML") === $(this).prop("outerHTML")) {
13949
+ return;
13950
+ }
13951
+
13952
+ let target = $(this);
13953
+ let srcIndex = src.index();
13954
+ let targetIndex = target.index();
13955
+
13956
+ if (srcIndex > targetIndex) {
13957
+ src.insertBefore(target);
13958
+ target.insertAfter($(me.selector + ' .video-main li.screen').eq(srcIndex));
13959
+ } else {
13960
+ src.insertAfter(target);
13961
+ target.insertBefore($(me.selector + ' .video-main li.screen').eq(srcIndex));
13962
+ }
13872
13963
  });
13873
13964
  },
13874
13965
 
@@ -13899,7 +13990,15 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13899
13990
  conf: {},
13900
13991
  pollInterval: 10,
13901
13992
  windowsNum: 16,
13902
- isVideoTag: true //true生成video标签 false生产audio标签 默认true
13993
+ isVideoTag: true,
13994
+ //true生成video标签 false生产audio标签 默认true
13995
+ showVideoInfo: 1,
13996
+ //显示分辨率、码率等信息,1-显示左下角 2-显示左上角,为0时控制_showVideoInfo函数处理,默认1
13997
+ waitPlayQueueSwitch: false,
13998
+ //播放队列开关,默认false
13999
+ defaultBusinessType: 0,
14000
+ // 配置的默认业务类型 0:调度主线 1:勤指
14001
+ videoTipTimeOut: 5 // 超时无首屏检测时间
13903
14002
 
13904
14003
  };
13905
14004
  $.extend(me._opts, opts);
@@ -13926,24 +14025,33 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13926
14025
  } //获取起始的窗口位置
13927
14026
 
13928
14027
 
13929
- me._opts.windowsBeginIndex = windowsSum; //窗口总数
14028
+ me._opts.windowsBeginIndex = 0; // 对讲号码初始化
13930
14029
 
13931
- windowsSum += me._opts.windowsNum; //是否提示
14030
+ window.pocNo = 0; // 播放队列开关 默认打开
13932
14031
 
13933
- me._opts.showPrompt === false && (showPrompt = false); //初始化界面
14032
+ me.waitPlayQueueSwitch = opts.waitPlayQueueSwitch == undefined ? false : opts.waitPlayQueueSwitch; //是否提示
13934
14033
 
13935
- me._opts.isVideoTag ? me._initVideoView($dom) : me._initAudioView($dom); //初始化Janus
14034
+ me._opts.showPrompt === false && (showPrompt = false); // 勤指业务下 设备检测
14035
+
14036
+ me._opts.defaultBusinessType == 1 && me._checkDevices(); //初始化界面
14037
+
14038
+ me._opts.isVideoTag ? me._initVideoView($dom, me._opts.showVideoInfo) : me._initAudioView($dom); //初始化Janus
13936
14039
 
13937
14040
  me._initJanus(); //初始化按钮点击事件
13938
14041
 
13939
14042
 
13940
- me._initBtnEvent(); //设置鼠标点击选中窗口
14043
+ me._initBtnEvent(); // 初始化事件监听
14044
+
13941
14045
 
14046
+ me._initEventListen(); //设置鼠标点击选中窗口
13942
14047
 
13943
- me._clickWindow(); //显示视频信息:名称、分辨率、码率、丢包率
13944
14048
 
14049
+ me._clickWindow();
13945
14050
 
13946
- me._showVideoInfo(); //双击某个视频全屏
14051
+ if (me._opts.showVideoInfo != 0) {
14052
+ //显示视频信息:名称、分辨率、码率、丢包率
14053
+ me._showVideoInfo();
14054
+ } //双击某个视频全屏
13947
14055
 
13948
14056
 
13949
14057
  me._dbClickFullScreen();
@@ -14057,35 +14165,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14057
14165
  * 初始化按钮点击事件
14058
14166
  */
14059
14167
  _initBtnEvent: function () {
14060
- let me = this; // 设置视频窗可拖拽
14061
-
14062
- var src = null;
14063
- $(me.selector + ' li').bind("dragstart", function (ev) {
14064
- src = $(this);
14065
- });
14066
- $(me.selector + ' li').bind("dragover", function (ev) {
14067
- ev.preventDefault();
14068
- });
14069
- $(me.selector + ' li').bind("drop", function (ev) {
14070
- ev.preventDefault();
14071
-
14072
- if (src.prop("outerHTML") === $(this).prop("outerHTML")) {
14073
- return;
14074
- }
14075
-
14076
- var target = $(this);
14077
- var srcIndex = src.index();
14078
- var targetIndex = target.index();
14079
-
14080
- if (srcIndex > targetIndex) {
14081
- src.insertBefore(target);
14082
- target.insertAfter($(me.selector + ' .video-main li.screen').eq(srcIndex));
14083
- } else {
14084
- src.insertAfter(target);
14085
- target.insertBefore($(me.selector + ' .video-main li.screen').eq(srcIndex));
14086
- }
14087
- });
14088
- let videoFlagObj = $('[video-flag="' + me._opts.windowsBeginIndex + '"]'); //锁定视频事件
14168
+ let me = this;
14169
+ let videoFlagObj = $(me.selector + ' .video-main'); //锁定视频事件
14089
14170
 
14090
14171
  videoFlagObj.find("button[name='lockVideo']").click(function () {
14091
14172
  let index = Number($(this).parent().parent().attr("index"));
@@ -14101,7 +14182,10 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14101
14182
  } else {
14102
14183
  me.VIDEO_DATA[index].isLockVideo = true;
14103
14184
  $(this).attr('class', 'lock-video-btn');
14104
- }
14185
+ } //jquery方式阻止默认事件 & 冒泡事件
14186
+
14187
+
14188
+ return false;
14105
14189
  });
14106
14190
  videoFlagObj.find('button[name=rotateVideo]').click(function () {
14107
14191
  let rotateIndex = Number($(this).attr("rotate-index"));
@@ -14109,13 +14193,17 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14109
14193
  rotateIndex %= 4;
14110
14194
  $(this).attr("rotate-index", rotateIndex);
14111
14195
  let li = $(this).parent().parent()[0];
14112
- me.videoRotateSize(li, rotateIndex);
14196
+ me.videoRotateSize(li, rotateIndex); //jquery方式阻止默认事件 & 冒泡事件
14197
+
14198
+ return false;
14113
14199
  }); //接收音频事件
14114
14200
 
14115
14201
  videoFlagObj.find("button[name='recvAudio']").click(function () {
14116
14202
  let _self = this;
14117
14203
 
14118
- let index = Number($(this).parent().parent().attr("index"));
14204
+ let index = Number($(this).parent().parent().attr("index")); // 优先当前窗口参数设置的业务类型 其次配置的默认业务类型
14205
+
14206
+ let businessType = me.VIDEO_DATA[index].opts.businessType == undefined ? me._opts.defaultBusinessType : me.VIDEO_DATA[index].opts.businessType;
14119
14207
 
14120
14208
  if (!me.VIDEO_DATA[index].playing) {
14121
14209
  promptAlarm('请选择播放的视频源!');
@@ -14126,65 +14214,112 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14126
14214
  //发送停止播放音频的请求
14127
14215
  me.VIDEO_DATA[index].operateAudio("stop_audio");
14128
14216
  $(this).attr('class', 'unrecv-audio-btn');
14129
- me.VIDEO_DATA[index].tagBox.muted = false;
14217
+ me.VIDEO_DATA[index].tagBox.prop("muted", true);
14130
14218
  } else {
14131
- //发送前先关闭其它音频通道(包括接收和发送音频)
14132
- let lis = $($(_self).parent().parent().parent()).children();
14219
+ if (businessType == 0) {
14220
+ //发送前先关闭其它音频通道(包括接收和发送音频)
14221
+ let lis = $($(_self).parent().parent().parent()).children();
14133
14222
 
14134
- for (let i = 0; i < lis.length; i++) {
14135
- let btnIndex = Number($(lis[i]).attr("index"));
14223
+ for (let i = 0; i < lis.length; i++) {
14224
+ let btnIndex = Number($(lis[i]).attr("index"));
14136
14225
 
14137
- if (index == btnIndex) {
14138
- continue;
14139
- }
14226
+ if (index == btnIndex) {
14227
+ continue;
14228
+ }
14140
14229
 
14141
- let recvBtn = $($(lis[i]).find("button[name='recvAudio']")[0]);
14142
- let sendBtn = $($(lis[i]).find("button[name='sendAudio']")[0]);
14230
+ let recvBtn = $($(lis[i]).find("button[name='recvAudio']")[0]);
14231
+ let sendBtn = $($(lis[i]).find("button[name='sendAudio']")[0]);
14143
14232
 
14144
- if (recvBtn.attr("class") == 'recv-audio-btn') {
14145
- if (me.VIDEO_DATA[btnIndex].playing) {
14146
- recvBtn.click();
14233
+ if (recvBtn.attr("class") == 'recv-audio-btn') {
14234
+ if (me.VIDEO_DATA[btnIndex].playing) {
14235
+ recvBtn.click();
14236
+ }
14147
14237
  }
14148
- }
14149
14238
 
14150
- if (sendBtn.attr("class") == 'send-audio-btn') {
14151
- if (me.VIDEO_DATA[btnIndex].playing) {
14152
- sendBtn.click();
14239
+ if (sendBtn.attr("class") == 'send-audio-btn') {
14240
+ if (me.VIDEO_DATA[btnIndex].playing) {
14241
+ sendBtn.click();
14242
+ }
14153
14243
  }
14154
- }
14155
- } //发送播放音频的请求
14244
+ } //发送播放音频的请求
14156
14245
 
14157
14246
 
14158
- $(_self).attr('class', 'recv-audio-btn');
14159
- setTimeout(function () {
14247
+ $(_self).attr('class', 'recv-audio-btn');
14248
+ setTimeout(function () {
14249
+ if (!me.VIDEO_DATA[index].isClosing) {
14250
+ me.VIDEO_DATA[index].operateAudio("recv_audio");
14251
+ me.VIDEO_DATA[index].tagBox.prop("muted", false);
14252
+ }
14253
+ }, 1000);
14254
+ } else if (businessType == 1) {
14255
+ // poc新模式支持回传多个音频,因此不关闭
14256
+ //发送播放音频的请求
14257
+ $(_self).attr('class', 'recv-audio-btn');
14160
14258
  me.VIDEO_DATA[index].operateAudio("recv_audio");
14161
- me.VIDEO_DATA[index].tagBox.muted = true;
14162
- }, 1000);
14259
+ me.VIDEO_DATA[index].tagBox.prop("muted", false);
14260
+ }
14163
14261
  }
14164
14262
  }); //发送音频事件
14165
14263
 
14166
14264
  videoFlagObj.find("button[name='sendAudio']").click(function () {
14167
- let index = Number($(this).parent().parent().attr("index"));
14265
+ let index = Number($(this).parent().parent().attr("index")); // 优先当前窗口参数设置的业务类型 其次配置的默认业务类型 最后默认调度业务
14266
+
14267
+ let businessType = me.VIDEO_DATA[index].opts.businessType == undefined ? me._opts.defaultBusinessType : me.VIDEO_DATA[index].opts.businessType;
14168
14268
 
14169
14269
  if (!me.VIDEO_DATA[index].playing) {
14170
14270
  promptAlarm('请选择播放的视频源!');
14171
14271
  return;
14172
14272
  }
14173
14273
 
14174
- if ($(this).attr('class') == 'send-audio-btn') {
14175
- me.VIDEO_DATA[index].operateAudio("unsend_audio");
14176
- $(this).attr('class', 'unsend-audio-btn');
14177
- me.VIDEO_DATA[index].stream.getAudioTracks()[0].enabled = false;
14178
- } else {
14179
- me.VIDEO_DATA[index].operateAudio("send_audio");
14180
- $(this).attr('class', 'send-audio-btn');
14181
- me.VIDEO_DATA[index].stream.getAudioTracks()[0].enabled = true;
14182
- }
14274
+ if (businessType == 0) {
14275
+ // 主线业务
14276
+ if ($(this).attr('class') == 'send-audio-btn') {
14277
+ me.VIDEO_DATA[index].operateAudio("unsend_audio");
14278
+ $(this).attr('class', 'unsend-audio-btn');
14279
+ me.VIDEO_DATA[index].stream.getAudioTracks()[0].enabled = false;
14280
+ } else {
14281
+ me.VIDEO_DATA[index].operateAudio("send_audio");
14282
+ $(this).attr('class', 'send-audio-btn');
14283
+ me.VIDEO_DATA[index].stream.getAudioTracks()[0].enabled = true;
14284
+ }
14285
+ } else if (businessType == 1) {
14286
+ // 勤指业务
14287
+ if ($(this).attr('class') == 'send-audio-btn') {
14288
+ $(this).attr('class', 'unsend-audio-btn'); //关闭点对点对讲
14289
+
14290
+ me.VIDEO_DATA[index].ptopPoc("close_ptop_poc", window.pocNo);
14291
+ } else {
14292
+ $(this).attr('class', 'send-audio-btn'); //发起点对点对讲
14293
+
14294
+ me.VIDEO_DATA[index].ptopPoc("open_ptop_poc", window.pocNo);
14295
+ }
14296
+ } //jquery方式阻止默认事件 & 冒泡事件
14297
+
14298
+
14299
+ return false;
14183
14300
  }); //关闭视频事件
14184
14301
 
14185
14302
  videoFlagObj.find("button[name='closeVideo']").click(function () {
14186
14303
  let index = Number($(this).parent().parent().attr("index"));
14187
- me.close(index);
14304
+ me.close(index); // //jquery方式阻止默认事件 & 冒泡事件
14305
+ // return false;
14306
+ });
14307
+ },
14308
+
14309
+ /**
14310
+ * 初始化事件监听
14311
+ */
14312
+ _initEventListen: function () {
14313
+ let _self = this; // 打开视频 {index, video, id, opts} index(视频窗口编号,从0开始) video(视频设备id,即devId) id(标识,空的话使用设备id) opts(其他参数)
14314
+
14315
+
14316
+ _self.addListener('openVideo', function (e) {
14317
+ _self.play(e.index, e.video, e.id, e.opts);
14318
+ }); // janus通知后台已关闭视频
14319
+
14320
+
14321
+ _self.addListener('notifyCloseVideo', function (e) {
14322
+ _self._notifyWaitingVideo(e.index);
14188
14323
  });
14189
14324
  },
14190
14325
 
@@ -14193,7 +14328,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14193
14328
  */
14194
14329
  _dbClickFullScreen: function () {
14195
14330
  let me = this;
14196
- $('[video-flag="' + me._opts.windowsBeginIndex + '"]').find('.video-box').on("dblclick", function () {
14331
+ $(me.selector + ' .video-main').find('.video-box').on("dblclick", function () {
14197
14332
  me._fullScreenEvent(this);
14198
14333
  });
14199
14334
  },
@@ -14228,10 +14363,20 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14228
14363
  let me = this;
14229
14364
 
14230
14365
  function clock() {
14366
+ if (!me.VIDEO_DATA || !me.VIDEO_DATA.length) return;
14367
+
14231
14368
  for (let i = 0; i < me.VIDEO_DATA.length; i++) {
14232
14369
  if (me.VIDEO_DATA[i].playing) {
14233
- let number = Number(i) + Number(1);
14234
- let videoObj = document.getElementById('video-' + number);
14370
+ let number = Number(i) + Number(1); //获取视频video标签
14371
+
14372
+ let $videoList = $(me.selector + " .video-main #video-" + number);
14373
+
14374
+ if (!$videoList.length) {
14375
+ console.error("can not find dom by id [video-" + number + "]");
14376
+ continue;
14377
+ }
14378
+
14379
+ let videoObj = $videoList[0];
14235
14380
  if (!videoObj) continue;
14236
14381
  let width = videoObj.videoWidth;
14237
14382
  let height = videoObj.videoHeight; //码率
@@ -14246,6 +14391,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14246
14391
 
14247
14392
  me._setPacketsLostRate(i, config, me);
14248
14393
 
14394
+ me._setFrameDecoded(i, config, me);
14395
+
14249
14396
  let resolution = width + "×" + height;
14250
14397
 
14251
14398
  switch (height + '') {
@@ -14267,11 +14414,26 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14267
14414
 
14268
14415
  default:
14269
14416
  break;
14417
+ } //获取文案显示dom元素
14418
+
14419
+
14420
+ let $videoInfoList = $(me.selector + " .video-main #info-" + number);
14421
+
14422
+ if (!$videoInfoList.length) {
14423
+ console.error("can not find dom by id [info-" + number + "]");
14424
+ continue;
14270
14425
  }
14271
14426
 
14272
- let videoInfoObj = document.getElementById('info-' + number);
14427
+ let videoInfoObj = $videoInfoList[0];
14273
14428
  let videoName = me.VIDEO_DATA[i].opts && me.VIDEO_DATA[i].opts.name ? me.VIDEO_DATA[i].opts.name : me.VIDEO_DATA[i].video;
14274
- videoInfoObj.innerHTML = videoName + '&nbsp;&nbsp;' + resolution + '<br>丢包率:' + me.VIDEO_DATA[i].packetsLostRate + '&nbsp;&nbsp;' + bitrate.replace("kbits/sec", "kbps");
14429
+ videoInfoObj.innerHTML = videoName + '&nbsp;&nbsp;' + resolution + '<br>丢包率:' + me.VIDEO_DATA[i].packetsLostRate + '&nbsp;&nbsp;' + bitrate.replace("kbits/sec", "kbps"); //根据视频框大小自动计算 显示文案的文字大小
14430
+
14431
+ let fontHeightSize = $(me.selector + " .video-main #video-" + number).height() / 15;
14432
+ let fontWidthSize = $(me.selector + " .video-main #video-" + number).width() / 18; //长和宽 除以 15, 取小的值做文字大小样式
14433
+
14434
+ let fontSize = fontHeightSize < fontWidthSize ? fontHeightSize : fontWidthSize;
14435
+ fontSize = !fontSize || fontSize > 20 ? 20 : fontSize;
14436
+ $("#info-" + number).css("font-size", fontSize + "px");
14275
14437
  }
14276
14438
  }
14277
14439
  } //已存在则清除
@@ -14334,17 +14496,175 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14334
14496
  }
14335
14497
  },
14336
14498
 
14499
+ /**
14500
+ * 设置当前网络信号提示
14501
+ * @param index 当前打开视频的索引
14502
+ * @param config
14503
+ * @param me
14504
+ * @private
14505
+ */
14506
+ _setFrameDecoded: function (index, config, me) {
14507
+ if (config.pc !== null && typeof config.pc !== 'undefined' && config.pc.getStats) {
14508
+ config.pc.getStats().then(function (stats) {
14509
+ stats.forEach(function (res) {
14510
+ if (res) {
14511
+ let inStats = false; // Check if these are statistics on incoming media
14512
+
14513
+ if ((res.mediaType === 'video' || res.id.toLowerCase().indexOf('video') > -1) && res.type === 'inbound-rtp' && res.id.indexOf('rtcp') < 0) {
14514
+ // New stats
14515
+ inStats = true;
14516
+ } else if (res.type === 'ssrc' && res.bytesReceived && (res.googCodecName === 'VP8' || res.googCodecName === '')) {
14517
+ // Older Chromer versions
14518
+ inStats = true;
14519
+ } // Parse stats now
14520
+
14521
+
14522
+ if (inStats) {
14523
+ if (res.hasOwnProperty('framesDecoded')) {
14524
+ if (res.framesDecoded <= 1) return;
14525
+
14526
+ if (typeof me.VIDEO_DATA[index].framesDecodedCount === 'undefined') {
14527
+ me.VIDEO_DATA[index].framesDecodedCount = 0;
14528
+ }
14529
+
14530
+ if (typeof me.VIDEO_DATA[index].framesDecodedLast === 'undefined') {
14531
+ me.VIDEO_DATA[index].framesDecodedLast = res.framesDecoded;
14532
+ }
14533
+
14534
+ if (res.framesDecoded > me.VIDEO_DATA[index].framesDecodedLast) {
14535
+ if (typeof me.VIDEO_DATA[index].tipDom !== 'undefined' && me.VIDEO_DATA[index].tipDom.style.display === 'block') {
14536
+ me.VIDEO_DATA[index].tipDom.style.display = 'none';
14537
+ }
14538
+ }
14539
+
14540
+ me.VIDEO_DATA[index].framesDecodedCount++; // 定时检测
14541
+
14542
+ if (me.VIDEO_DATA[index].framesDecodedCount === me.configOpt) {
14543
+ if (res.framesDecoded - me.VIDEO_DATA[index].framesDecodedLast === 0) {
14544
+ // 卡顿
14545
+ if (typeof me.VIDEO_DATA[index].tipDom === 'undefined') {
14546
+ var numIndex = index + 1;
14547
+ me.VIDEO_DATA[index].tipDom = document.getElementById('frame-decoded-' + numIndex);
14548
+ }
14549
+
14550
+ me.VIDEO_DATA[index].tipDom.style.display = 'block';
14551
+ }
14552
+
14553
+ me.VIDEO_DATA[index].framesDecodedCount = 0;
14554
+ me.VIDEO_DATA[index].framesDecodedLast = res.framesDecoded;
14555
+ } else {
14556
+ me.VIDEO_DATA[index].framesDecodedLast = res.framesDecoded;
14557
+ }
14558
+ }
14559
+ }
14560
+ }
14561
+ });
14562
+ });
14563
+ }
14564
+ },
14565
+
14566
+ /**
14567
+ * 设备可用性检查(扬声器、麦克风、分辨率、浏览器类型)
14568
+ * 1. 未检测(status == undefined)询问进入检测界面
14569
+ * 2. 检测完成按相应结果给予相应提示
14570
+ * 3. 拒绝检测按所有检测通过处理
14571
+ * 4. 程序自行检测,并将是否加载声卡结果放入window对象
14572
+ * @private
14573
+ */
14574
+ _checkDevices: function () {
14575
+ let me = this;
14576
+ let tipCountKey = "DEVICES_CHECK_TIP_COUNT";
14577
+ let statusKey = "DEVICES_CHECK_STATUS";
14578
+ let checkCompleted = "completed";
14579
+ let checkRejected = "rejected";
14580
+ let microResultKey = "MICRO_RESULT";
14581
+ let speakerResultKey = "SPEAKER_RESULT";
14582
+ let screenResultKey = "SCREEN_RESULT";
14583
+ let resultPass = "pass";
14584
+ let resultNotPass = "not pass";
14585
+ let tipCount = sessionStorage.getItem(tipCountKey);
14586
+ let status = localStorage.getItem(statusKey);
14587
+
14588
+ if ((tipCount == undefined || tipCount == "0") && status == undefined) {
14589
+ sessionStorage.setItem(tipCountKey, "1"); //弹窗讯问是否进入检测界面
14590
+
14591
+ if (confirm("您还没有检测硬件设备,是否先进行检测?")) {
14592
+ window.open("/scooper-video/new/checkDevices");
14593
+ } else {
14594
+ localStorage.setItem(statusKey, checkRejected);
14595
+ }
14596
+
14597
+ return;
14598
+ }
14599
+
14600
+ if (status == checkCompleted) {
14601
+ let microResult = localStorage.getItem(microResultKey) == undefined ? resultPass : localStorage.getItem(microResultKey);
14602
+ let speakerResult = localStorage.getItem(speakerResultKey) == undefined ? resultPass : localStorage.getItem(speakerResultKey);
14603
+ let screenResult = localStorage.getItem(screenResultKey) == undefined ? resultPass : localStorage.getItem(screenResultKey);
14604
+ let msg = "";
14605
+
14606
+ if (speakerResult == resultNotPass) {
14607
+ msg += "检测到扬声器异常,可能影响系统某些功能的使用!";
14608
+ console.error(msg);
14609
+ }
14610
+
14611
+ if (microResult == resultNotPass) {
14612
+ msg += "检测到麦克风异常,可能影响系统某些功能的使用!";
14613
+ console.error(msg);
14614
+ }
14615
+
14616
+ if (screenResult === resultNotPass) {
14617
+ msg += "您的屏幕分辨率过低,可能导致页面布局混乱!"; //提示消息
14618
+
14619
+ promptAlarm(msg);
14620
+ }
14621
+
14622
+ let userAgent = navigator.userAgent;
14623
+
14624
+ if (userAgent.toLowerCase().indexOf("chrome") < 0 && userAgent.toLowerCase().indexOf("firefox") < 0 && userAgent.toLowerCase().indexOf("edge") < 0) {
14625
+ msg += "当前浏览器下部分功能可能存在兼容问题,建议使用谷歌浏览器!";
14626
+ promptAlarm(msg);
14627
+ }
14628
+
14629
+ if (msg != "") {
14630
+ //提示并派发消息
14631
+ // promptAlarm(msg);
14632
+ //防止外部未监听消息就派发事件
14633
+ setTimeout(function () {
14634
+ me.videoListener.dispatch('msginfo', {
14635
+ 'msg': msg
14636
+ });
14637
+ }, 3000);
14638
+ }
14639
+ }
14640
+ },
14641
+
14337
14642
  /**
14338
14643
  * 视频界面的初始化,在传过来的dom中创建界面
14339
14644
  */
14340
- _initVideoView: function ($dom) {
14645
+ _initVideoView: function ($dom, infoPosition) {
14341
14646
  let me = this;
14342
- let objClass = (me._opts.windowsNum == 1 ? 'video-main-full mode-' : 'video-main mode-') + me._opts.windows;
14647
+ let position;
14648
+
14649
+ switch (infoPosition) {
14650
+ case 1:
14651
+ position = "info-bottom";
14652
+ break;
14653
+
14654
+ case 2:
14655
+ position = "info-top";
14656
+ break;
14657
+
14658
+ default:
14659
+ position = "info-bottom";
14660
+ }
14661
+
14662
+ let objClass = (me._opts.windowsNum == 1 ? 'video-main video-main-full mode-' : 'video-main mode-') + me._opts.windows;
14343
14663
  let videoHtml = '<ul class="' + objClass + '" id="video-main-web-rtc" video-flag="' + me._opts.windowsBeginIndex + '">';
14344
14664
  let index = me._opts.windowsBeginIndex + 1;
14345
14665
 
14346
14666
  for (let i = index; i < index + me._opts.windowsNum; i++) {
14347
- videoHtml += '<li class="screen-' + i + '" index="' + (i - 1) + '" draggable="true"><video class="video-box" id="video-' + i + '" autoplay ></video>' + '<div class="info hide" id="info-' + i + '"></div>' + '<div class="operate-btn">'; //videoHtml +='<button type="button" class="unlock-video-btn hide" name="lockVideo"></button>';
14667
+ videoHtml += '<li class="screen screen-' + i + '" index="' + (i - 1) + '" draggable="true"><video muted class="video-box" id="video-' + i + '" autoplay ></video>' + '<div class="hide info ' + position + '" id="info-' + i + '"></div>' + '<div class="hide frame-decoded" id="frame-decoded-' + i + '"style="position:absolute;float:left;color:#fff;width:67%;z-index:1;top:135px;left:180px">网络信号不佳</div>' + '<div class="operate-btn">'; //videoHtml +='<button type="button" class="unlock-video-btn hide" name="lockVideo"></button>';
14348
14668
 
14349
14669
  checkUserMediaAvailable() && (videoHtml += '<button type="button" class="rotate-btn hide" name="rotateVideo" rotate-index="0" title="视频旋转"></button><button type="button" class="unsend-audio-btn hide" name="sendAudio"></button>');
14350
14670
  videoHtml += '<button type="button" class="unrecv-audio-btn hide" name="recvAudio"></button>' + '<button type="button" class="close-btn hide" name="closeVideo"></button>' + '</div>' + '</li>';
@@ -14360,7 +14680,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14360
14680
  */
14361
14681
  _initAudioView: function ($dom) {
14362
14682
  let me = this;
14363
- let objClass = (me._opts.windowsNum == 1 ? 'video-main-full mode-' : 'video-main mode-') + me._opts.windows;
14683
+ let objClass = (me._opts.windowsNum == 1 ? 'video-main video-main-full mode-' : 'video-main mode-') + me._opts.windows;
14364
14684
  let videoHtml = '<ul class="' + objClass + '" id="video-main-web-rtc" video-flag="' + me._opts.windowsBeginIndex + '">';
14365
14685
  let index = me._opts.windowsBeginIndex + 1;
14366
14686
 
@@ -14410,6 +14730,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14410
14730
  console.error('Janus服务连接失败:' + error);
14411
14731
  me.closeAll();
14412
14732
 
14733
+ me._removeAllWaitingVideo();
14734
+
14413
14735
  me._initJanus();
14414
14736
  },
14415
14737
  destroyed: function () {
@@ -14420,6 +14742,19 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14420
14742
  });
14421
14743
  },
14422
14744
 
14745
+ /**
14746
+ * 销毁所有
14747
+ */
14748
+ destory: function () {
14749
+ var me = this;
14750
+ me.destoryJanus();
14751
+ $(me.selector).empty();
14752
+ me.videoListener = null;
14753
+ me.VIDEO_DATA = null;
14754
+ me.selector = null; //destoryJanus会触发回调,需要使用到opts
14755
+ // me._opts = null;
14756
+ },
14757
+
14423
14758
  /**
14424
14759
  * 销毁:Janus销毁、资源释放
14425
14760
  */
@@ -14428,14 +14763,17 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14428
14763
 
14429
14764
  me._opts.janus.destroy({
14430
14765
  success: function () {
14431
- window.windowsSum = 0; //userToken = null;
14432
-
14766
+ // window.windowsSum = 0;
14767
+ //userToken = null;
14433
14768
  registered = false;
14434
14769
  },
14435
14770
  asyncRequest: true,
14436
14771
  notifyDestroyed: true
14437
14772
  });
14773
+
14774
+ me.removeAllListeners();
14438
14775
  },
14776
+ reLoginJanusItvIndex: -1,
14439
14777
 
14440
14778
  /**
14441
14779
  * 初始化插件、登陆,初始化窗口
@@ -14495,13 +14833,43 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14495
14833
 
14496
14834
  if (event === 'registration_failed') {
14497
14835
  promptFailed("janus登陆失败: " + result["code"] + " " + result["reason"]);
14836
+
14837
+ if (me.reLoginJanusItvIndex == -1) {
14838
+ me.reLoginJanusItvIndex = setInterval(function () {
14839
+ console.log("尝试重新登陆janus!");
14840
+
14841
+ me._initJanus(janus);
14842
+ }, 5000);
14843
+ }
14844
+
14845
+ return;
14846
+ }
14847
+
14848
+ if (event === 'video_server_closed') {
14849
+ if (me.reLoginJanusItvIndex == -1) {
14850
+ me.reLoginJanusItvIndex = setInterval(function () {
14851
+ console.log("尝试重新登陆janus!");
14852
+
14853
+ me._initJanus(janus);
14854
+ }, 5000);
14855
+ }
14856
+
14498
14857
  return;
14499
14858
  }
14500
14859
 
14501
14860
  if (event === 'registered') {
14502
14861
  let userToken = result["userToken"];
14503
14862
  console.log('janus登陆成功');
14504
- registered = true; //生成主界面
14863
+ registered = true;
14864
+
14865
+ if (me.reLoginJanusItvIndex != -1) {
14866
+ clearInterval(me.reLoginJanusItvIndex);
14867
+ me.reLoginJanusItvIndex = -1;
14868
+ } //生成主界面
14869
+ //相对序号,用于标识当前janus连接初始化的序号窗口
14870
+
14871
+
14872
+ let relativeIndex = 0;
14505
14873
 
14506
14874
  for (let i = me._opts.windowsBeginIndex; i < me._opts.windowsBeginIndex + me._opts.windowsNum; i++) {
14507
14875
  me.VIDEO_DATA[i] = new SVideo({
@@ -14509,42 +14877,254 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14509
14877
  janus: janus,
14510
14878
  userToken: userToken,
14511
14879
  windowsNum: me._opts.windowsNum,
14880
+ relativeIndex: relativeIndex++,
14512
14881
  flag: me._opts.flag,
14513
14882
  isVideoTag: me._opts.isVideoTag,
14514
- janusPlugin: me._opts.conf.janusPlugin
14515
- });
14883
+ janusPlugin: me._opts.conf.janusPlugin,
14884
+ videoTipTimeOut: me._opts.videoTipTimeOut,
14885
+ parentSelector: me.selector
14886
+ }, me.videoListener);
14516
14887
  }
14517
14888
  }
14518
14889
  }
14519
14890
  }
14520
14891
  });
14892
+ },
14893
+
14894
+ /* ----------------------------- 播放队列 --------------------------- */
14895
+ // 记录等待中的视频
14896
+ WAITING_DATA: [],
14897
+ // 播放队列开关 默认关闭
14898
+ waitPlayQueueSwitch: false,
14899
+
14900
+ /**
14901
+ * 添加等待视频数据
14902
+ * 同一位置再次打开,则覆盖上一次的
14903
+ * 参数:index(视频窗口编号,从0开始) video(视频设备id,即devId) id(标识,空的话使用设备id) opts(其他参数)
14904
+ */
14905
+ _addWaitingVideo: function (index, video, id, opts) {
14906
+ let _self = this;
14907
+
14908
+ let isOverride = false;
14909
+ $.each(_self.WAITING_DATA, function (i, obj) {
14910
+ if (obj.index == index) {
14911
+ console.log("播放队列中 index = " + index + ", video = " + obj.video + " 替换为 video = " + video);
14912
+ _self.WAITING_DATA[i] = {
14913
+ index: index,
14914
+ video: video,
14915
+ id: id,
14916
+ opts: opts
14917
+ };
14918
+ isOverride = true;
14919
+ return false;
14920
+ }
14921
+ });
14922
+
14923
+ if (!isOverride) {
14924
+ _self.WAITING_DATA.push({
14925
+ index: index,
14926
+ video: video,
14927
+ id: id,
14928
+ opts: opts
14929
+ });
14930
+
14931
+ console.log("index = " + index + ", video = " + video + " 加入播放队列");
14932
+ }
14933
+
14934
+ _self.VIDEO_DATA[index].isWaiting = true;
14935
+ },
14936
+
14937
+ /**
14938
+ * 删除等待视频数据
14939
+ */
14940
+ _removeWaitingVideo: function (index, video) {
14941
+ let _self = this;
14942
+
14943
+ $.each(_self.WAITING_DATA, function (i, obj) {
14944
+ if (obj.index == index && obj.video == video) {
14945
+ _self.WAITING_DATA.splice(i, 1);
14946
+
14947
+ _self.VIDEO_DATA[index].isWaiting = false;
14948
+ console.log("index = " + index + ", video = " + video + " 从播放队列移除");
14949
+ return false;
14950
+ }
14951
+ });
14952
+ },
14953
+
14954
+ /**
14955
+ * 删除所有等待播放视频的数据
14956
+ */
14957
+ _removeAllWaitingVideo: function () {
14958
+ let _self = this;
14959
+
14960
+ _self.WAITING_DATA = [];
14961
+ let index = _self._opts.windowsBeginIndex;
14962
+
14963
+ for (; index < _self._opts.windowsBeginIndex + _self._opts.windows; index++) {
14964
+ _self.VIDEO_DATA[index].isWaiting = false;
14965
+ }
14966
+ },
14967
+
14968
+ /**
14969
+ * 上一个视频关闭后,如果该位置由等待视频,通知打开新视频
14970
+ * @param index
14971
+ */
14972
+ _notifyWaitingVideo: function (index) {
14973
+ let _self = this;
14974
+
14975
+ $.each(_self.WAITING_DATA, function (i, obj) {
14976
+ if (obj.index == index) {
14977
+ _self.play(obj.index, obj.video, obj.id, obj.opts);
14978
+
14979
+ _self._removeWaitingVideo(obj.index, obj.video);
14980
+
14981
+ return false;
14982
+ }
14983
+ });
14521
14984
  }
14522
14985
  };
14523
- let FAILED_CODE = {
14524
- 1001: "账号或密码错误",
14525
- 1002: "该帐号已连接",
14526
- 1004: "没有鉴权",
14527
- 2001: "未携带token或token错误",
14528
- 2002: "视频源id不存在",
14529
- 2003: "操作指令非法(该账号不允许执行这个指令,或者不支持该指令)",
14530
- 3001: "nat通道未建立",
14531
- 3002: "该视频流已在传输",
14532
- 3003: "无法获取远端视频流",
14533
- 4001: "视频流断开连接",
14534
- 4002: "获取视频失败",
14535
- 5000: "内部错误",
14536
- 8001: "设备不支持该指令",
14537
- 453: "videoServer连接失败",
14538
- 454: "录像回放窗口已占用,请先停止播放",
14539
- 455: "无视频录像,操作失败",
14540
- 5001: "呼叫异常断开",
14541
- 5002: "禁止修改分辨率",
14542
- 4003: "音频被占用",
14543
- 4004: "音频被占用",
14544
- 4005: "客户端已打开对讲",
14545
- 4006: "终端离开云眼音频"
14986
+ let CONST_CODE = {
14987
+ //打开失败错误码,面板显示,不做浮窗提示框显示
14988
+ VIDEO_CODE: {
14989
+ 2002: "打开失败,未找到该ID的视频源",
14990
+ 2003: "打开失败,请确认视频服务版本",
14991
+ 3001: "打开失败,未接收到引流包,请检查端口映射",
14992
+ 3002: "",
14993
+ 3003: "打开失败,对方拒绝视频请求",
14994
+ 4001: "打开失败,视频流中断",
14995
+ 4002: "打开失败,终端挂机或超时未接听",
14996
+ 7000: "打开失败,无法连接视频设备",
14997
+ 7001: "打开失败,无法连接视频设备",
14998
+ 7002: "打开失败,无法连接视频设备"
14999
+ },
15000
+ OTHER_CODE: {
15001
+ 453: "videoServer连接失败,错误码453",
15002
+ 454: "视频窗口已被占用,请选择其它窗口打开或停止播放",
15003
+ 455: "操作失败,该段时间无视频录像",
15004
+ 499: "操作异常,错误码499",
15005
+ 440: "操作异常,错误码440",
15006
+ 441: "操作异常,错误码441",
15007
+ 442: "操作异常,错误码442",
15008
+ 443: "操作异常,错误码443",
15009
+ 444: "操作异常,错误码444",
15010
+ 445: "操作异常,错误码445",
15011
+ 446: "操作异常,错误码446",
15012
+ 447: "操作异常,错误码447",
15013
+ 448: "操作异常,错误码448",
15014
+ 449: "操作异常,错误码449",
15015
+ 450: "操作异常,错误码450",
15016
+ 451: "操作异常,错误码451",
15017
+ 452: "操作异常,错误码452",
15018
+ 456: "设备已处于对讲状态或不支持对讲",
15019
+ 6001: "录像失败"
15020
+ },
15021
+ FAILED_CODE: {
15022
+ 1001: "账号或密码错误",
15023
+ 1002: "该帐号已连接",
15024
+ 1004: "没有鉴权",
15025
+ 2001: "未携带token或token错误",
15026
+ 2002: "视频源id不存在",
15027
+ 2003: "操作指令非法(该账号不允许执行这个指令,或者不支持该指令)",
15028
+ 3001: "nat通道未建立",
15029
+ 3002: "该视频流已在传输",
15030
+ 3003: "无法获取远端视频流",
15031
+ 4001: "视频流异常断开连接",
15032
+ 4002: "获取视频失败",
15033
+ 5000: "内部错误",
15034
+ 8001: "该设备不支持云台操作",
15035
+ 453: "videoServer连接失败",
15036
+ 454: "录像回放窗口已占用,请先停止播放",
15037
+ 455: "无视频录像,操作失败",
15038
+ 5001: "呼叫异常断开",
15039
+ 5002: "禁止修改分辨率",
15040
+ 401: "禁止修改分辨率",
15041
+ 4003: "音频重置",
15042
+ 4004: "音频被占用",
15043
+ 4005: "客户端已打开对讲",
15044
+ 4006: "终端离开云眼音频",
15045
+ 4008: "终端拒绝打开视频",
15046
+ 6001: "录像失败",
15047
+ 499: "内部创建失败",
15048
+ 440: "请求消息内容为空",
15049
+ 441: "json格式错误",
15050
+ 442: "无效的请求",
15051
+ 443: "消息内容缺失",
15052
+ 444: "消息缺少参数",
15053
+ 445: "账户已登陆",
15054
+ 446: "收到的videoserver消息有误",
15055
+ 447: "消息参数错误",
15056
+ 448: "SDP创建失败",
15057
+ 449: "未使用",
15058
+ 450: "创建端口失败",
15059
+ 451: "SDP创建失败",
15060
+ 452: "未使用加密的RTP",
15061
+ 456: "对讲未打开",
15062
+ 7000: "URL账号密码错误(RTSP)",
15063
+ 7001: "URL地址不通(RTSP)",
15064
+ 7002: "URL格式错误(RTSP)"
15065
+ },
15066
+ STATUS_CODE_ARR: ['5002', '4003', '4004', '4005', '4006']
14546
15067
  };
14547
- let STATUS_CODE_ARR = ['5002', '4003', '4004', '4005', '4006']; //window.VIDEO_DATA = [];//记录视频各分屏的状态
15068
+ /**
15069
+ * 显示播放错误内容, 4002特殊处理
15070
+ * @param videoObj 视频对象
15071
+ * @param code 状态码(包含错误码)
15072
+ * @param isShowReplayBtn 是否显示重新播放按钮
15073
+ * @param video 打开错误的视频Id
15074
+ */
15075
+
15076
+ function showResult(videoObj, code, isShowReplayBtn, video) {
15077
+ let videoDom = videoObj.tagBox.parent();
15078
+ videoDom.addClass("result");
15079
+ videoDom.find('.operate-btn .close-btn').show();
15080
+
15081
+ if (CONST_CODE.FAILED_CODE[code] && code != "4002") {
15082
+ let resultHtml = "<div class='real-result'>错误码" + code + ": " + CONST_CODE.FAILED_CODE[code] + "</div>";
15083
+ videoDom.append(resultHtml);
15084
+ }
15085
+
15086
+ let resultHtml = "<div class='result'><div class='result-tip'>" + CONST_CODE.VIDEO_CODE[code] + "</div>";
15087
+
15088
+ if (isShowReplayBtn && code != "4002") {
15089
+ resultHtml += "<div class='result-replay'><span id='replay-" + videoObj.index + "' class='replay'>点击重试</span></div>";
15090
+ }
15091
+
15092
+ resultHtml += "</div>";
15093
+ videoDom.append(resultHtml);
15094
+
15095
+ if (isShowReplayBtn && code != "4002") {
15096
+ $("#replay-" + videoObj.index).unbind("click").click(function () {
15097
+ videoObj.videoListener.dispatch("openVideo", {
15098
+ index: videoObj.index,
15099
+ video: video,
15100
+ id: videoObj.id,
15101
+ opts: videoObj.opts
15102
+ });
15103
+ });
15104
+ }
15105
+
15106
+ if (code == "4002") {
15107
+ setTimeout(function () {
15108
+ clearResult(videoDom);
15109
+ }, 5000);
15110
+ }
15111
+ }
15112
+ /**
15113
+ * 清除显示内容 videoDom: 视频Dom对象
15114
+ */
15115
+
15116
+
15117
+ function clearResult(videoDom, videoObj) {
15118
+ videoDom.removeClass("result");
15119
+ videoDom.find(".real-result").remove();
15120
+ videoDom.find(".result").remove();
15121
+
15122
+ if (!videoObj || !videoObj.playing) {
15123
+ // bug id 18654: 增加是否正在播放判断
15124
+ videoDom.find('.operate-btn .close-btn').hide();
15125
+ }
15126
+ } //window.VIDEO_DATA = [];//记录视频各分屏的状态
15127
+
14548
15128
 
14549
15129
  window.windowsSum = 0; //当前页面的视频总数,可能有多个VideoWebRtc对象
14550
15130
  //let userToken = null;
@@ -14552,16 +15132,27 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14552
15132
  let registered = false;
14553
15133
  let recordAvBusinessId = null;
14554
15134
 
14555
- function SVideo(opts) {
15135
+ function SVideo(opts, videoListener) {
14556
15136
  this.janus = opts.janus;
14557
15137
  this.userToken = opts.userToken;
14558
15138
  this.sipcall = null;
14559
15139
  this.index = opts.index;
14560
- this.tagBox = opts.isVideoTag ? $('#video-' + (this.index + 1)) : $('#audio-' + (this.index + 1));
15140
+ this.relativeIndex = opts.relativeIndex; // this.tagBox = opts.isVideoTag ? $('#video-' + (this.index + 1)) : $('#audio-' + (this.index + 1));
15141
+
15142
+ this.tagBox = opts.isVideoTag ? $(opts.parentSelector + ' #video-' + (this.index + 1)) : $('#audio-' + (this.index + 1));
14561
15143
  this.windowsNum = opts.windowsNum;
14562
15144
  this.flag = opts.flag;
14563
15145
  this.isVideoTag = opts.isVideoTag;
14564
15146
  this.janusPlugin = opts.janusPlugin;
15147
+ this.isClosing = false; // 当前分屏是否正在关闭视频
15148
+
15149
+ this.isWaiting = false; // 当前分屏是否有视频在等待播放
15150
+
15151
+ this.playSucTimeOutIndex = -1; // 超时提示定时器index
15152
+
15153
+ this.videoTipTimeOut = opts.videoTipTimeOut; // 超时无首屏时间
15154
+
15155
+ this.videoListener = videoListener;
14565
15156
  this.init();
14566
15157
  }
14567
15158
  /**
@@ -14582,8 +15173,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14582
15173
  console.log("视频插件初始化成功:" + self.index);
14583
15174
  self.sipcall = pluginHandle;
14584
15175
 
14585
- if (self.index + 1 >= self.windowsNum) {
14586
- videoListener.dispatch('initsucc', self);
15176
+ if (self.relativeIndex + 1 >= self.windowsNum) {
15177
+ self.videoListener.dispatch('initsucc', self);
14587
15178
  }
14588
15179
  },
14589
15180
  error: function (error) {
@@ -14597,11 +15188,20 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14597
15188
  promptFailed("请先登陆");
14598
15189
  }
14599
15190
 
15191
+ let video = self.video;
15192
+
14600
15193
  if (msg.error_code) {
14601
- console.error(msg.error_code + ' ' + msg.error);
14602
- promptFailed(FAILED_CODE[msg.error_code] || '错误码:' + msg.error_code);
14603
- videoListener.dispatch('msginfo', {
14604
- 'msg': FAILED_CODE[msg.error_code] || '错误码:' + msg.error_code
15194
+ console.error("错误码:" + msg.error_code + " " + CONST_CODE.FAILED_CODE[msg.error_code]);
15195
+
15196
+ if (CONST_CODE.VIDEO_CODE[msg.error_code]) {
15197
+ showResult(self, msg.error_code, true, video);
15198
+ } else {
15199
+ promptFailed(CONST_CODE.OTHER_CODE[msg.error_code] || CONST_CODE.FAILED_CODE[msg.error_code] || '错误码:' + msg.error_code);
15200
+ }
15201
+
15202
+ self.videoListener.dispatch('msginfo', {
15203
+ 'code': msg.error_code,
15204
+ 'msg': CONST_CODE.OTHER_CODE[msg.error_code] || CONST_CODE.FAILED_CODE[msg.error_code] || '错误码:' + msg.error_code
14605
15205
  });
14606
15206
  return false;
14607
15207
  }
@@ -14611,23 +15211,32 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14611
15211
 
14612
15212
  if (result.error_code && result.error_code != 0) {
14613
15213
  //videoListener.dispatch('afterclose', self);
14614
- if (!STATUS_CODE_ARR.includes(result.error_code + '')) {
15214
+ if (!CONST_CODE.STATUS_CODE_ARR.includes(result.error_code + '')) {
14615
15215
  //videoListener.dispatch('afterclose', self);
14616
15216
  //播放失败 关闭视频
14617
- let video = self.video;
14618
15217
  self.close('err');
14619
15218
 
14620
15219
  if (self.isLockVideo) {
14621
- self.play(video);
15220
+ setTimeout(function () {
15221
+ self.play(video);
15222
+ }, 1500);
14622
15223
  } else {
14623
- videoListener.dispatch('afterclose', self);
15224
+ self.closeType = 'error';
15225
+ self.videoListener.dispatch('afterclose', self);
14624
15226
  }
14625
15227
  }
14626
15228
 
14627
- videoListener.dispatch('msginfo', {
14628
- 'msg': FAILED_CODE[result.error_code] || '错误码:' + result.error_code
15229
+ self.videoListener.dispatch('msginfo', {
15230
+ 'code': result.error_code,
15231
+ 'msg': CONST_CODE.OTHER_CODE[result.error_code] || CONST_CODE.FAILED_CODE[result.error_code] || '错误码:' + result.error_code
14629
15232
  });
14630
- promptFailed(FAILED_CODE[result.error_code] || '错误码:' + result.error_code);
15233
+
15234
+ if (CONST_CODE.VIDEO_CODE[result.error_code]) {
15235
+ showResult(self, result.error_code, true, video);
15236
+ } else {
15237
+ promptFailed(CONST_CODE.OTHER_CODE[result.error_code] || CONST_CODE.FAILED_CODE[result.error_code] || '错误码:' + result.error_code);
15238
+ }
15239
+
14631
15240
  self.tagBox.parent().find('.recv-audio-btn').attr("class", "unrecv-audio-btn");
14632
15241
  self.tagBox.parent().find('.send-audio-btn').attr("class", "unsend-audio-btn");
14633
15242
  } //事件响应
@@ -14660,17 +15269,19 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14660
15269
  });
14661
15270
  },
14662
15271
  error: function (error) {
14663
- console.error(error);
14664
- let body = {
14665
- "request": "decline",
14666
- "code": 480
14667
- };
14668
- self.sipcall.send({
14669
- "message": body
14670
- });
15272
+ console.error(error); // let body = { "request": "decline", "code": 480 };
15273
+ // self.sipcall.send({"message": body});
14671
15274
  }
14672
15275
  });
14673
15276
  break;
15277
+
15278
+ case 'accepted':
15279
+ self.playSucTimeOutIndex = setTimeout(function () {
15280
+ let _li = self.tagBox.parent();
15281
+
15282
+ _li.append('<div class="video-tip">网络环境较差,可能无法正常加载视频</div>');
15283
+ }, self.videoTipTimeOut * 1000);
15284
+ break;
14674
15285
  //呼叫失败
14675
15286
 
14676
15287
  case 'callfaild':
@@ -14689,7 +15300,16 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14689
15300
  case 'start_av_record':
14690
15301
  if (result && result.filename) {
14691
15302
  self.videoFileName = result.filename;
14692
- videoListener.dispatch('recordvideo', self);
15303
+ self.videoListener.dispatch('startRecordVideo', self);
15304
+ console.log('录像地址:' + result.filename);
15305
+ }
15306
+
15307
+ break;
15308
+
15309
+ case 'stop_av_record':
15310
+ if (result && result.filename) {
15311
+ self.videoFileName = result.filename;
15312
+ self.videoListener.dispatch('stopRecordVideo', self);
14693
15313
  console.log('录像地址:' + result.filename);
14694
15314
  }
14695
15315
 
@@ -14699,10 +15319,17 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14699
15319
  case 'ser_notify_resolution':
14700
15320
  if (result && result.resolution) {
14701
15321
  self.resolution = result.resolution;
14702
- videoListener.dispatch('notifyresolution', self);
15322
+ self.videoListener.dispatch('notifyresolution', self);
14703
15323
  console.log('接收notifyresolution:' + result.resolution); //promptAlarm('当前分辨率:' + result.resolution);
14704
15324
  }
14705
15325
 
15326
+ break;
15327
+
15328
+ case 'change_resolution':
15329
+ if (result) {
15330
+ self.videoListener.dispatch('notifyResolutionChange', self);
15331
+ }
15332
+
14706
15333
  break;
14707
15334
  //建立预呼叫响应
14708
15335
 
@@ -14739,9 +15366,38 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14739
15366
  break;
14740
15367
 
14741
15368
  case 'ser_stop_audio':
15369
+ self.tagBox.parent().find('.recv-audio-btn').attr("class", "unrecv-audio-btn");
14742
15370
  console.log('音频异常关闭!');
14743
15371
  break;
14744
15372
 
15373
+ case 'close_down_audio':
15374
+ self.tagBox.parent().find('.send-audio-btn').attr("class", "unsend-audio-btn");
15375
+ promptSuccess("通话时间到");
15376
+ console.log('通话时间到!');
15377
+ break;
15378
+
15379
+ case 'ser_notify_dispatch_close_ptop_poc':
15380
+ self.tagBox.parent().find('.send-audio-btn').attr("class", "unsend-audio-btn");
15381
+ console.log('调度通知点对点对讲关闭!');
15382
+ break;
15383
+
15384
+ case 'ser_close_ptop_poc':
15385
+ self.tagBox.parent().find('.send-audio-btn').attr("class", "unsend-audio-btn");
15386
+ console.log('点对点对讲关闭!');
15387
+ break;
15388
+
15389
+ case 'ser_open_ptop_poc':
15390
+ self.tagBox.parent().find('.unsend-audio-btn').attr("class", "send-audio-btn");
15391
+ console.log('点对点对讲打开!');
15392
+ break;
15393
+ // 视频关闭通知
15394
+
15395
+ case 'ser_close_video':
15396
+ console.log('视频框 ' + self.index + ' 视频已关闭');
15397
+ self.isClosing = false;
15398
+ self.videoListener.dispatch('notifyCloseVideo', self);
15399
+ break;
15400
+
14745
15401
  default:
14746
15402
  console.log('event:' + event);
14747
15403
  break;
@@ -14789,7 +15445,10 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14789
15445
 
14790
15446
  self.tagBox.bind("canplay play playing", function () {
14791
15447
  if (self.video) {
14792
- if (self.tagBox.is(':visible')) return;
15448
+ if (self.tagBox.is(':visible')) return; // 清除播放监测定时任务,清除内容
15449
+
15450
+ self.playSucTimeOutIndex > 0 && clearTimeout(self.playSucTimeOutIndex);
15451
+ self.tagBox.parent().find(".video-tip").remove();
14793
15452
  console.log('分屏=' + (self.index + 1) + ', ' + self.video + ' 播放成功');
14794
15453
  promptSuccess('分屏' + (self.index + 1) + ' 播放成功');
14795
15454
  self.tagBox.show(); //self.tagBox.parent().removeClass("loading").find(".stream-loading").remove();
@@ -14838,13 +15497,21 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14838
15497
  "message": body
14839
15498
  });
14840
15499
  this.video = video;
15500
+ this.isClosing = false;
14841
15501
  this.playing = true;
14842
15502
  this.packetsLostRate = '0.00%';
14843
15503
  this.packetsLostSum = 0;
14844
- this.packetsReceivedSum = 0; //loading
15504
+ this.packetsReceivedSum = 0;
15505
+ let numIndex = this.index + 1;
15506
+ let framesDecodedDom = document.getElementById("frame-decoded-" + numIndex);
15507
+ framesDecodedDom.style.display = 'none';
15508
+ this.framesDecodedLast = undefined;
15509
+ this.framesDecodedCount = 0; //loading
14845
15510
 
14846
15511
  let _li = this.tagBox.parent();
14847
15512
 
15513
+ clearResult(_li, this);
15514
+
14848
15515
  if (!_li.hasClass("loading")) {
14849
15516
  _li.addClass("loading").append('<div class="stream-loading">等待数据流传送...</div>');
14850
15517
  }
@@ -14857,8 +15524,10 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14857
15524
  if (!type) {
14858
15525
  this.isLockVideo = false;
14859
15526
  this.tagBox.parent().find('.lock-video-btn').attr("class", "unlock-video-btn");
14860
- } //let reqType = type ? type : "hangup";
15527
+ } //清除结果提示内容
15528
+
14861
15529
 
15530
+ clearResult(this.tagBox.parent(), this); //let reqType = type ? type : "hangup";
14862
15531
 
14863
15532
  if (!this.playing) return;
14864
15533
  let _hangup = {
@@ -14872,6 +15541,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14872
15541
  });
14873
15542
  this.sipcall.hangup();
14874
15543
  this.tagBox.hide();
15544
+ this.isClosing = true;
14875
15545
  this.playing = false;
14876
15546
  this.video = null;
14877
15547
  this.packetsLostRate = '0.00%';
@@ -14886,7 +15556,15 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14886
15556
 
14887
15557
  this.tagBox.parent().removeClass("loading").find(".stream-loading").remove(); //清除object-fit
14888
15558
 
14889
- this.tagBox.css('object-fit', '');
15559
+ this.tagBox.css('object-fit', ''); // 清除内容提示
15560
+
15561
+ this.playSucTimeOutIndex > 0 && clearTimeout(this.playSucTimeOutIndex);
15562
+ this.tagBox.parent().find(".video-tip").remove();
15563
+ var numIndex = Number(this.index) + 1;
15564
+ var framesDecodedDom = document.getElementById("frame-decoded-" + numIndex);
15565
+ framesDecodedDom.style.display = 'none';
15566
+ this.framesDecodedLast = undefined;
15567
+ this.framesDecodedCount = 0;
14890
15568
  },
14891
15569
 
14892
15570
  /**
@@ -14991,6 +15669,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14991
15669
 
14992
15670
  let _li = this.tagBox.parent();
14993
15671
 
15672
+ clearResult(_li, this);
15673
+
14994
15674
  if (!_li.hasClass("loading")) {
14995
15675
  _li.addClass("loading").append('<div class="stream-loading">等待数据流传送...</div>');
14996
15676
  }
@@ -15135,6 +15815,26 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
15135
15815
  "message": body
15136
15816
  });
15137
15817
  console.log("预呼叫操作=" + requestType + ", 对讲号码=" + pocNo + ",调度中心号码=" + centerTel);
15818
+ },
15819
+
15820
+ /**
15821
+ * 点对点对讲
15822
+ * requstType: open_ptop_poc(开启) close_poc_poc(关闭)
15823
+ * pocno
15824
+ */
15825
+ ptopPoc: function (requestType, pocNo) {
15826
+ let self = this;
15827
+ let body = {
15828
+ request: requestType,
15829
+ pocno: pocNo,
15830
+ playseq: self.index,
15831
+ pocmember: self.video,
15832
+ userToken: self.userToken
15833
+ };
15834
+ self.sipcall.send({
15835
+ "message": body
15836
+ });
15837
+ console.log("点对点对讲操作=" + requestType + ", 主叫号码=" + pocNo + ",被叫号码=" + self.video);
15138
15838
  }
15139
15839
  };
15140
15840
  return isIE() ? VideoOcx : VideoWebRtc;
@@ -28885,6 +29585,27 @@ let meet = {
28885
29585
  data: {}
28886
29586
  }
28887
29587
  },
29588
+
29589
+ /**
29590
+ * 设置主持人
29591
+ */
29592
+ setMeetChairmanNet: {
29593
+ url: '/dispatch-web/api/meet/setMeetChairman',
29594
+ method: 'POST',
29595
+ requestParam: {
29596
+ token: '',
29597
+ meetId: '',
29598
+ tel: ''
29599
+ },
29600
+ responseParam: {
29601
+ code: '',
29602
+ //返回结果状态码
29603
+ message: '',
29604
+ systemTime: '',
29605
+ //yyyy-MM-dd HH:mm:ss
29606
+ data: {}
29607
+ }
29608
+ },
28888
29609
  joinVideoMemberNet: {
28889
29610
  //成员加入会场(视频)
28890
29611
 
@@ -31487,6 +32208,20 @@ const meetOp = sip => {
31487
32208
  }, '', net.method);
31488
32209
  });
31489
32210
  },
32211
+ setChairman: function (param) {
32212
+ let net = meet_url.setMeetChairmanNet;
32213
+ return new Promise((resolve, reject) => {
32214
+ loadJson(server_ + net.url, { ...param
32215
+ }, function (ret) {
32216
+ if (ret.code == 0) {
32217
+ resolve(ret);
32218
+ } else {
32219
+ console.log("设置会场主持人失败", ret.code);
32220
+ reject(ret.code);
32221
+ }
32222
+ }, '', net.method);
32223
+ });
32224
+ },
31490
32225
  end: function (param) {
31491
32226
  let net = meet_url.endMeetNet;
31492
32227
  return new Promise((resolve, reject) => {