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.
@@ -12122,6 +12122,13 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
12122
12122
  }
12123
12123
 
12124
12124
  return e.returnValue;
12125
+ },
12126
+
12127
+ /**
12128
+ * 清空事件
12129
+ */
12130
+ removeAllListeners: function () {
12131
+ this._listeners = {};
12125
12132
  }
12126
12133
  };
12127
12134
  let videoListener = new Listener();
@@ -12762,21 +12769,21 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
12762
12769
  * 添加事件
12763
12770
  */
12764
12771
  addListener: function (type, handler, key) {
12765
- videoListener.addListener(type, handler, key);
12772
+ this.videoListener.addListener(type, handler, key);
12766
12773
  },
12767
12774
 
12768
12775
  /**
12769
12776
  * 删除事件
12770
12777
  */
12771
12778
  removeListener: function (type, handler) {
12772
- videoListener.removeListener(type, handler);
12779
+ this.videoListener.removeListener(type, handler);
12773
12780
  },
12774
12781
 
12775
12782
  /**
12776
12783
  * 派发事件
12777
12784
  */
12778
12785
  dispatch: function (e, options) {
12779
- videoListener.dispatch(e, options);
12786
+ this.videoListener.dispatch(e, options);
12780
12787
  },
12781
12788
 
12782
12789
  /**
@@ -13172,11 +13179,14 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13172
13179
  function VideoWebRtc($dom, opts) {
13173
13180
  let _self = this;
13174
13181
 
13182
+ _self.videoListener = new Listener();
13183
+
13175
13184
  if (!opts) {
13176
13185
  console.error('VideoWebRtc的参数opts不能为空');
13177
13186
  return;
13178
13187
  }
13179
13188
 
13189
+ _self.configOpt = opts && opts.configOpt || 3;
13180
13190
  hasMediaDevices(); //检测声卡设备为异步方法,耗时在几十毫秒左右,因此需要做延迟
13181
13191
  //默认检查次数为40 间隔为20ms
13182
13192
 
@@ -13217,6 +13227,13 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13217
13227
  // console.info('该视频正在播放');
13218
13228
  // return false;
13219
13229
  // }
13230
+ // 启用播放队列时,当前位置正在关闭上一个视频,则加入播放队列
13231
+
13232
+ if (me.waitPlayQueueSwitch && me.VIDEO_DATA[index].isClosing) {
13233
+ me._addWaitingVideo(index, video, id, opts);
13234
+
13235
+ return;
13236
+ }
13220
13237
 
13221
13238
  console.log("play >>> " + "video=" + video + "; id=" + id + "; index=" + index);
13222
13239
  me.dispatch('beforeplay', {
@@ -13315,7 +13332,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13315
13332
  */
13316
13333
  playInChoice: function (video, id, opts) {
13317
13334
  let me = this;
13318
- let selView = $('[video-flag="' + me._opts.windowsBeginIndex + '"]>li.sel');
13335
+ let selView = $(me.selector + ' li.sel');
13319
13336
 
13320
13337
  if (selView.length) {
13321
13338
  if (me.VIDEO_DATA[selView.index()].playing) {
@@ -13372,6 +13389,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13372
13389
  this.VIDEO_DATA[index].close();
13373
13390
 
13374
13391
  if (!isSave) {
13392
+ this.VIDEO_DATA[index].closeType = 'close';
13375
13393
  this.dispatch('afterclose', this.VIDEO_DATA[index]);
13376
13394
  }
13377
13395
  },
@@ -13398,6 +13416,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13398
13416
  me.close(videoData[i].index);
13399
13417
 
13400
13418
  if (!isSave) {
13419
+ videoData[i].closeType = 'close';
13401
13420
  me.dispatch('afterclose', videoData[i]);
13402
13421
  }
13403
13422
  }
@@ -13408,13 +13427,17 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13408
13427
  * 关闭所有视频
13409
13428
  */
13410
13429
  closeAll: function (isSave) {
13411
- let me = this;
13430
+ let me = this; // 清除所有等待播放队列
13431
+
13432
+ me._removeAllWaitingVideo();
13433
+
13412
13434
  let openVideos = [];
13413
13435
 
13414
13436
  for (let i = me._opts.windowsBeginIndex; i < me._opts.windowsBeginIndex + me._opts.windowsNum; i++) {
13415
- if (me.VIDEO_DATA[i].playing) {
13416
- me.close(i, isSave);
13417
- }
13437
+ // if(me.VIDEO_DATA[i].playing){
13438
+ // me.close(i, isSave)
13439
+ // }
13440
+ me.close(i, isSave);
13418
13441
  } // if(!openVideos.length) return;
13419
13442
  //
13420
13443
  // //适当延时进行关闭
@@ -13454,9 +13477,9 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13454
13477
  me.setChoiceWindow(me._getMinIndexFreeWindow());
13455
13478
  }
13456
13479
 
13457
- $('[video-flag="' + me._opts.windowsBeginIndex + '"]').removeClass("mode-" + me._opts.windows).addClass("mode-" + num);
13480
+ $(me.selector + ' .video-main').removeClass("mode-" + me._opts.windows).addClass("mode-" + num);
13458
13481
 
13459
- let _li = $('[video-flag="' + me._opts.windowsBeginIndex + '"]>li').hide();
13482
+ let _li = $(me.selector + ' li').hide();
13460
13483
 
13461
13484
  me._opts.windows = num;
13462
13485
 
@@ -13483,7 +13506,11 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13483
13506
  for (let k = 0; k < _li.length; k++) {
13484
13507
  let rotateIndex = _li.eq(k).find('button[name=rotateVideo]').attr('rotate-index');
13485
13508
 
13486
- if (rotateIndex != 0 && rotateIndex != 2) me.videoRotateSize(_li.eq(k)[0], rotateIndex);
13509
+ if (rotateIndex != 0 && rotateIndex != 2) {
13510
+ setTimeout(() => {
13511
+ me.videoRotateSize(_li.eq(k)[0], rotateIndex);
13512
+ }, 200);
13513
+ }
13487
13514
  }
13488
13515
  },
13489
13516
 
@@ -13512,7 +13539,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13512
13539
  me.saveList();
13513
13540
  this._polltimer = new PollTimer(function (firstRun) {
13514
13541
  me.closeAll();
13515
- wait(500).then(function () {
13542
+
13543
+ if (firstRun) {
13516
13544
  for (let i = 0; i < windowNum; i++) {
13517
13545
  if (nowNum == maxNum) {
13518
13546
  nowNum = 0;
@@ -13526,10 +13554,23 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13526
13554
  nowNum++;
13527
13555
  }
13528
13556
 
13529
- if (firstRun) {
13530
- me.dispatch('startpoll', array);
13531
- }
13532
- });
13557
+ me.dispatch('startpoll', array);
13558
+ } else {
13559
+ wait(1500).then(function () {
13560
+ for (let i = 0; i < windowNum; i++) {
13561
+ if (nowNum == maxNum) {
13562
+ nowNum = 0;
13563
+
13564
+ if (maxNum < windowNum) {
13565
+ break;
13566
+ }
13567
+ }
13568
+
13569
+ me.playByOrder(array[nowNum].video, array[nowNum].id, array[nowNum].opts);
13570
+ nowNum++;
13571
+ }
13572
+ });
13573
+ }
13533
13574
  }, time);
13534
13575
  },
13535
13576
 
@@ -13652,10 +13693,10 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13652
13693
  */
13653
13694
  getInChoiceVideo: function () {
13654
13695
  let me = this;
13655
- let selView = $('[video-flag="' + me._opts.windowsBeginIndex + '"]>li.sel');
13696
+ let selView = $(me.selector + ' li.sel');
13656
13697
 
13657
- if (selView.length && me.VIDEO_DATA[selView.index()].video) {
13658
- return me.VIDEO_DATA[selView.index()];
13698
+ if (selView.length && me.VIDEO_DATA[selView.attr("index")].video) {
13699
+ return me.VIDEO_DATA[selView.attr("index")];
13659
13700
  }
13660
13701
 
13661
13702
  return undefined;
@@ -13691,10 +13732,23 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13691
13732
 
13692
13733
  let canvasObj = document.getElementById('myCanvas');
13693
13734
  let videoObj = dataObj.tagBox.get(0);
13694
- canvasObj.width = dataObj.tagBox.parent().width();
13695
- canvasObj.height = dataObj.tagBox.parent().height();
13735
+
13736
+ if (videoObj == undefined) {
13737
+ return;
13738
+ } // 取流中 取视频框尺寸
13739
+ // 播放中 取视频画面尺寸
13740
+
13741
+
13742
+ if (dataObj.tagBox.parent().find(".stream-loading").length != 0) {
13743
+ canvasObj.width = dataObj.tagBox.width();
13744
+ canvasObj.height = dataObj.tagBox.height();
13745
+ } else {
13746
+ canvasObj.width = videoObj.videoWidth;
13747
+ canvasObj.height = videoObj.videoHeight;
13748
+ }
13749
+
13696
13750
  let ctx = canvasObj.getContext("2d");
13697
- ctx.drawImage(videoObj, 0, 0, dataObj.tagBox.parent().width(), dataObj.tagBox.parent().height());
13751
+ ctx.drawImage(videoObj, 0, 0, videoObj.videoWidth, videoObj.videoHeight);
13698
13752
  let dataUrl = canvasObj.toDataURL('image/jpeg');
13699
13753
  callback ? callback(dataUrl) : null;
13700
13754
  },
@@ -13741,8 +13795,10 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13741
13795
 
13742
13796
  if (index < 0) {
13743
13797
  console.error('窗口编号获取失败!');
13744
- }
13798
+ } //保存对讲号码
13799
+
13745
13800
 
13801
+ window.pocNo = pocNo;
13746
13802
  return me.VIDEO_DATA[index].pocCall("open_poccall", pocNo, centerTel);
13747
13803
  },
13748
13804
 
@@ -13766,6 +13822,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13766
13822
  }
13767
13823
 
13768
13824
  me.VIDEO_DATA[index].stream = null;
13825
+ window.pocNo = null;
13769
13826
  return me.VIDEO_DATA[index].pocCall("close_poccall", pocNo, centerTel);
13770
13827
  },
13771
13828
 
@@ -13800,21 +13857,28 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13800
13857
  * 添加事件
13801
13858
  */
13802
13859
  addListener: function (type, handler, key) {
13803
- videoListener.addListener(type, handler, key);
13860
+ this.videoListener.addListener(type, handler, key);
13804
13861
  },
13805
13862
 
13806
13863
  /**
13807
13864
  * 删除事件
13808
13865
  */
13809
13866
  removeListener: function (type, handler) {
13810
- videoListener.removeListener(type, handler);
13867
+ this.videoListener.removeListener(type, handler);
13811
13868
  },
13812
13869
 
13813
13870
  /**
13814
13871
  * 派发事件
13815
13872
  */
13816
13873
  dispatch: function (e, options) {
13817
- videoListener.dispatch(e, options);
13874
+ this.videoListener.dispatch(e, options);
13875
+ },
13876
+
13877
+ /**
13878
+ * 清空事件
13879
+ */
13880
+ removeAllListeners: function () {
13881
+ this.videoListener.removeAllListeners();
13818
13882
  },
13819
13883
 
13820
13884
  /**
@@ -13825,7 +13889,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13825
13889
  index = index || me._opts.windowsBeginIndex;
13826
13890
 
13827
13891
  for (; index < me._opts.windowsBeginIndex + me._opts.windows; index++) {
13828
- if (!me.VIDEO_DATA[index].playing) {
13892
+ if (!me.VIDEO_DATA[index].playing && !me.VIDEO_DATA[index].isWaiting) {
13829
13893
  return index;
13830
13894
  }
13831
13895
  }
@@ -13838,7 +13902,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13838
13902
  */
13839
13903
  _getChoiceWindow: function () {
13840
13904
  let me = this;
13841
- let selView = $('[video-flag="' + me._opts.windowsBeginIndex + '"]>li.sel');
13905
+ let selView = $(me.selector + ' li.sel');
13842
13906
 
13843
13907
  if (selView.length) {
13844
13908
  return selView.index();
@@ -13871,13 +13935,40 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13871
13935
  _clickWindow: function () {
13872
13936
  let me = this; //视频窗口选中
13873
13937
 
13874
- $('[video-flag="' + me._opts.windowsBeginIndex + '"]>li').click(function () {
13875
- $('[video-flag="' + me._opts.windowsBeginIndex + '"]>li').removeClass("sel");
13938
+ $(me.selector + ' li').click(function () {
13939
+ $(me.selector + ' li').removeClass("sel");
13876
13940
  $(this).addClass("sel"); //如果视频正在播放则分发点击消息
13877
13941
 
13878
13942
  if (me.getInChoiceVideo()) {
13879
13943
  me.dispatch('click', me.getInChoiceVideo());
13880
13944
  }
13945
+ }); // 设置视频窗可拖拽
13946
+
13947
+ let src = null;
13948
+ $(me.selector + ' li').bind("dragstart", function (ev) {
13949
+ src = $(this);
13950
+ });
13951
+ $(me.selector + ' li').bind("dragover", function (ev) {
13952
+ ev.preventDefault();
13953
+ });
13954
+ $(me.selector + ' li').bind("drop", function (ev) {
13955
+ ev.preventDefault();
13956
+
13957
+ if (src.prop("outerHTML") === $(this).prop("outerHTML")) {
13958
+ return;
13959
+ }
13960
+
13961
+ let target = $(this);
13962
+ let srcIndex = src.index();
13963
+ let targetIndex = target.index();
13964
+
13965
+ if (srcIndex > targetIndex) {
13966
+ src.insertBefore(target);
13967
+ target.insertAfter($(me.selector + ' .video-main li.screen').eq(srcIndex));
13968
+ } else {
13969
+ src.insertAfter(target);
13970
+ target.insertBefore($(me.selector + ' .video-main li.screen').eq(srcIndex));
13971
+ }
13881
13972
  });
13882
13973
  },
13883
13974
 
@@ -13908,7 +13999,15 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13908
13999
  conf: {},
13909
14000
  pollInterval: 10,
13910
14001
  windowsNum: 16,
13911
- isVideoTag: true //true生成video标签 false生产audio标签 默认true
14002
+ isVideoTag: true,
14003
+ //true生成video标签 false生产audio标签 默认true
14004
+ showVideoInfo: 1,
14005
+ //显示分辨率、码率等信息,1-显示左下角 2-显示左上角,为0时控制_showVideoInfo函数处理,默认1
14006
+ waitPlayQueueSwitch: false,
14007
+ //播放队列开关,默认false
14008
+ defaultBusinessType: 0,
14009
+ // 配置的默认业务类型 0:调度主线 1:勤指
14010
+ videoTipTimeOut: 5 // 超时无首屏检测时间
13912
14011
 
13913
14012
  };
13914
14013
  $.extend(me._opts, opts);
@@ -13935,24 +14034,33 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
13935
14034
  } //获取起始的窗口位置
13936
14035
 
13937
14036
 
13938
- me._opts.windowsBeginIndex = windowsSum; //窗口总数
14037
+ me._opts.windowsBeginIndex = 0; // 对讲号码初始化
13939
14038
 
13940
- windowsSum += me._opts.windowsNum; //是否提示
14039
+ window.pocNo = 0; // 播放队列开关 默认打开
13941
14040
 
13942
- me._opts.showPrompt === false && (showPrompt = false); //初始化界面
14041
+ me.waitPlayQueueSwitch = opts.waitPlayQueueSwitch == undefined ? false : opts.waitPlayQueueSwitch; //是否提示
13943
14042
 
13944
- me._opts.isVideoTag ? me._initVideoView($dom) : me._initAudioView($dom); //初始化Janus
14043
+ me._opts.showPrompt === false && (showPrompt = false); // 勤指业务下 设备检测
14044
+
14045
+ me._opts.defaultBusinessType == 1 && me._checkDevices(); //初始化界面
14046
+
14047
+ me._opts.isVideoTag ? me._initVideoView($dom, me._opts.showVideoInfo) : me._initAudioView($dom); //初始化Janus
13945
14048
 
13946
14049
  me._initJanus(); //初始化按钮点击事件
13947
14050
 
13948
14051
 
13949
- me._initBtnEvent(); //设置鼠标点击选中窗口
14052
+ me._initBtnEvent(); // 初始化事件监听
14053
+
13950
14054
 
14055
+ me._initEventListen(); //设置鼠标点击选中窗口
13951
14056
 
13952
- me._clickWindow(); //显示视频信息:名称、分辨率、码率、丢包率
13953
14057
 
14058
+ me._clickWindow();
13954
14059
 
13955
- me._showVideoInfo(); //双击某个视频全屏
14060
+ if (me._opts.showVideoInfo != 0) {
14061
+ //显示视频信息:名称、分辨率、码率、丢包率
14062
+ me._showVideoInfo();
14063
+ } //双击某个视频全屏
13956
14064
 
13957
14065
 
13958
14066
  me._dbClickFullScreen();
@@ -14066,35 +14174,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14066
14174
  * 初始化按钮点击事件
14067
14175
  */
14068
14176
  _initBtnEvent: function () {
14069
- let me = this; // 设置视频窗可拖拽
14070
-
14071
- var src = null;
14072
- $(me.selector + ' li').bind("dragstart", function (ev) {
14073
- src = $(this);
14074
- });
14075
- $(me.selector + ' li').bind("dragover", function (ev) {
14076
- ev.preventDefault();
14077
- });
14078
- $(me.selector + ' li').bind("drop", function (ev) {
14079
- ev.preventDefault();
14080
-
14081
- if (src.prop("outerHTML") === $(this).prop("outerHTML")) {
14082
- return;
14083
- }
14084
-
14085
- var target = $(this);
14086
- var srcIndex = src.index();
14087
- var targetIndex = target.index();
14088
-
14089
- if (srcIndex > targetIndex) {
14090
- src.insertBefore(target);
14091
- target.insertAfter($(me.selector + ' .video-main li.screen').eq(srcIndex));
14092
- } else {
14093
- src.insertAfter(target);
14094
- target.insertBefore($(me.selector + ' .video-main li.screen').eq(srcIndex));
14095
- }
14096
- });
14097
- let videoFlagObj = $('[video-flag="' + me._opts.windowsBeginIndex + '"]'); //锁定视频事件
14177
+ let me = this;
14178
+ let videoFlagObj = $(me.selector + ' .video-main'); //锁定视频事件
14098
14179
 
14099
14180
  videoFlagObj.find("button[name='lockVideo']").click(function () {
14100
14181
  let index = Number($(this).parent().parent().attr("index"));
@@ -14110,7 +14191,10 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14110
14191
  } else {
14111
14192
  me.VIDEO_DATA[index].isLockVideo = true;
14112
14193
  $(this).attr('class', 'lock-video-btn');
14113
- }
14194
+ } //jquery方式阻止默认事件 & 冒泡事件
14195
+
14196
+
14197
+ return false;
14114
14198
  });
14115
14199
  videoFlagObj.find('button[name=rotateVideo]').click(function () {
14116
14200
  let rotateIndex = Number($(this).attr("rotate-index"));
@@ -14118,13 +14202,17 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14118
14202
  rotateIndex %= 4;
14119
14203
  $(this).attr("rotate-index", rotateIndex);
14120
14204
  let li = $(this).parent().parent()[0];
14121
- me.videoRotateSize(li, rotateIndex);
14205
+ me.videoRotateSize(li, rotateIndex); //jquery方式阻止默认事件 & 冒泡事件
14206
+
14207
+ return false;
14122
14208
  }); //接收音频事件
14123
14209
 
14124
14210
  videoFlagObj.find("button[name='recvAudio']").click(function () {
14125
14211
  let _self = this;
14126
14212
 
14127
- let index = Number($(this).parent().parent().attr("index"));
14213
+ let index = Number($(this).parent().parent().attr("index")); // 优先当前窗口参数设置的业务类型 其次配置的默认业务类型
14214
+
14215
+ let businessType = me.VIDEO_DATA[index].opts.businessType == undefined ? me._opts.defaultBusinessType : me.VIDEO_DATA[index].opts.businessType;
14128
14216
 
14129
14217
  if (!me.VIDEO_DATA[index].playing) {
14130
14218
  promptAlarm('请选择播放的视频源!');
@@ -14135,65 +14223,112 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14135
14223
  //发送停止播放音频的请求
14136
14224
  me.VIDEO_DATA[index].operateAudio("stop_audio");
14137
14225
  $(this).attr('class', 'unrecv-audio-btn');
14138
- me.VIDEO_DATA[index].tagBox.muted = false;
14226
+ me.VIDEO_DATA[index].tagBox.prop("muted", true);
14139
14227
  } else {
14140
- //发送前先关闭其它音频通道(包括接收和发送音频)
14141
- let lis = $($(_self).parent().parent().parent()).children();
14228
+ if (businessType == 0) {
14229
+ //发送前先关闭其它音频通道(包括接收和发送音频)
14230
+ let lis = $($(_self).parent().parent().parent()).children();
14142
14231
 
14143
- for (let i = 0; i < lis.length; i++) {
14144
- let btnIndex = Number($(lis[i]).attr("index"));
14232
+ for (let i = 0; i < lis.length; i++) {
14233
+ let btnIndex = Number($(lis[i]).attr("index"));
14145
14234
 
14146
- if (index == btnIndex) {
14147
- continue;
14148
- }
14235
+ if (index == btnIndex) {
14236
+ continue;
14237
+ }
14149
14238
 
14150
- let recvBtn = $($(lis[i]).find("button[name='recvAudio']")[0]);
14151
- let sendBtn = $($(lis[i]).find("button[name='sendAudio']")[0]);
14239
+ let recvBtn = $($(lis[i]).find("button[name='recvAudio']")[0]);
14240
+ let sendBtn = $($(lis[i]).find("button[name='sendAudio']")[0]);
14152
14241
 
14153
- if (recvBtn.attr("class") == 'recv-audio-btn') {
14154
- if (me.VIDEO_DATA[btnIndex].playing) {
14155
- recvBtn.click();
14242
+ if (recvBtn.attr("class") == 'recv-audio-btn') {
14243
+ if (me.VIDEO_DATA[btnIndex].playing) {
14244
+ recvBtn.click();
14245
+ }
14156
14246
  }
14157
- }
14158
14247
 
14159
- if (sendBtn.attr("class") == 'send-audio-btn') {
14160
- if (me.VIDEO_DATA[btnIndex].playing) {
14161
- sendBtn.click();
14248
+ if (sendBtn.attr("class") == 'send-audio-btn') {
14249
+ if (me.VIDEO_DATA[btnIndex].playing) {
14250
+ sendBtn.click();
14251
+ }
14162
14252
  }
14163
- }
14164
- } //发送播放音频的请求
14253
+ } //发送播放音频的请求
14165
14254
 
14166
14255
 
14167
- $(_self).attr('class', 'recv-audio-btn');
14168
- setTimeout(function () {
14256
+ $(_self).attr('class', 'recv-audio-btn');
14257
+ setTimeout(function () {
14258
+ if (!me.VIDEO_DATA[index].isClosing) {
14259
+ me.VIDEO_DATA[index].operateAudio("recv_audio");
14260
+ me.VIDEO_DATA[index].tagBox.prop("muted", false);
14261
+ }
14262
+ }, 1000);
14263
+ } else if (businessType == 1) {
14264
+ // poc新模式支持回传多个音频,因此不关闭
14265
+ //发送播放音频的请求
14266
+ $(_self).attr('class', 'recv-audio-btn');
14169
14267
  me.VIDEO_DATA[index].operateAudio("recv_audio");
14170
- me.VIDEO_DATA[index].tagBox.muted = true;
14171
- }, 1000);
14268
+ me.VIDEO_DATA[index].tagBox.prop("muted", false);
14269
+ }
14172
14270
  }
14173
14271
  }); //发送音频事件
14174
14272
 
14175
14273
  videoFlagObj.find("button[name='sendAudio']").click(function () {
14176
- let index = Number($(this).parent().parent().attr("index"));
14274
+ let index = Number($(this).parent().parent().attr("index")); // 优先当前窗口参数设置的业务类型 其次配置的默认业务类型 最后默认调度业务
14275
+
14276
+ let businessType = me.VIDEO_DATA[index].opts.businessType == undefined ? me._opts.defaultBusinessType : me.VIDEO_DATA[index].opts.businessType;
14177
14277
 
14178
14278
  if (!me.VIDEO_DATA[index].playing) {
14179
14279
  promptAlarm('请选择播放的视频源!');
14180
14280
  return;
14181
14281
  }
14182
14282
 
14183
- if ($(this).attr('class') == 'send-audio-btn') {
14184
- me.VIDEO_DATA[index].operateAudio("unsend_audio");
14185
- $(this).attr('class', 'unsend-audio-btn');
14186
- me.VIDEO_DATA[index].stream.getAudioTracks()[0].enabled = false;
14187
- } else {
14188
- me.VIDEO_DATA[index].operateAudio("send_audio");
14189
- $(this).attr('class', 'send-audio-btn');
14190
- me.VIDEO_DATA[index].stream.getAudioTracks()[0].enabled = true;
14191
- }
14283
+ if (businessType == 0) {
14284
+ // 主线业务
14285
+ if ($(this).attr('class') == 'send-audio-btn') {
14286
+ me.VIDEO_DATA[index].operateAudio("unsend_audio");
14287
+ $(this).attr('class', 'unsend-audio-btn');
14288
+ me.VIDEO_DATA[index].stream.getAudioTracks()[0].enabled = false;
14289
+ } else {
14290
+ me.VIDEO_DATA[index].operateAudio("send_audio");
14291
+ $(this).attr('class', 'send-audio-btn');
14292
+ me.VIDEO_DATA[index].stream.getAudioTracks()[0].enabled = true;
14293
+ }
14294
+ } else if (businessType == 1) {
14295
+ // 勤指业务
14296
+ if ($(this).attr('class') == 'send-audio-btn') {
14297
+ $(this).attr('class', 'unsend-audio-btn'); //关闭点对点对讲
14298
+
14299
+ me.VIDEO_DATA[index].ptopPoc("close_ptop_poc", window.pocNo);
14300
+ } else {
14301
+ $(this).attr('class', 'send-audio-btn'); //发起点对点对讲
14302
+
14303
+ me.VIDEO_DATA[index].ptopPoc("open_ptop_poc", window.pocNo);
14304
+ }
14305
+ } //jquery方式阻止默认事件 & 冒泡事件
14306
+
14307
+
14308
+ return false;
14192
14309
  }); //关闭视频事件
14193
14310
 
14194
14311
  videoFlagObj.find("button[name='closeVideo']").click(function () {
14195
14312
  let index = Number($(this).parent().parent().attr("index"));
14196
- me.close(index);
14313
+ me.close(index); // //jquery方式阻止默认事件 & 冒泡事件
14314
+ // return false;
14315
+ });
14316
+ },
14317
+
14318
+ /**
14319
+ * 初始化事件监听
14320
+ */
14321
+ _initEventListen: function () {
14322
+ let _self = this; // 打开视频 {index, video, id, opts} index(视频窗口编号,从0开始) video(视频设备id,即devId) id(标识,空的话使用设备id) opts(其他参数)
14323
+
14324
+
14325
+ _self.addListener('openVideo', function (e) {
14326
+ _self.play(e.index, e.video, e.id, e.opts);
14327
+ }); // janus通知后台已关闭视频
14328
+
14329
+
14330
+ _self.addListener('notifyCloseVideo', function (e) {
14331
+ _self._notifyWaitingVideo(e.index);
14197
14332
  });
14198
14333
  },
14199
14334
 
@@ -14202,7 +14337,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14202
14337
  */
14203
14338
  _dbClickFullScreen: function () {
14204
14339
  let me = this;
14205
- $('[video-flag="' + me._opts.windowsBeginIndex + '"]').find('.video-box').on("dblclick", function () {
14340
+ $(me.selector + ' .video-main').find('.video-box').on("dblclick", function () {
14206
14341
  me._fullScreenEvent(this);
14207
14342
  });
14208
14343
  },
@@ -14237,10 +14372,20 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14237
14372
  let me = this;
14238
14373
 
14239
14374
  function clock() {
14375
+ if (!me.VIDEO_DATA || !me.VIDEO_DATA.length) return;
14376
+
14240
14377
  for (let i = 0; i < me.VIDEO_DATA.length; i++) {
14241
14378
  if (me.VIDEO_DATA[i].playing) {
14242
- let number = Number(i) + Number(1);
14243
- let videoObj = document.getElementById('video-' + number);
14379
+ let number = Number(i) + Number(1); //获取视频video标签
14380
+
14381
+ let $videoList = $(me.selector + " .video-main #video-" + number);
14382
+
14383
+ if (!$videoList.length) {
14384
+ console.error("can not find dom by id [video-" + number + "]");
14385
+ continue;
14386
+ }
14387
+
14388
+ let videoObj = $videoList[0];
14244
14389
  if (!videoObj) continue;
14245
14390
  let width = videoObj.videoWidth;
14246
14391
  let height = videoObj.videoHeight; //码率
@@ -14255,6 +14400,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14255
14400
 
14256
14401
  me._setPacketsLostRate(i, config, me);
14257
14402
 
14403
+ me._setFrameDecoded(i, config, me);
14404
+
14258
14405
  let resolution = width + "×" + height;
14259
14406
 
14260
14407
  switch (height + '') {
@@ -14276,11 +14423,26 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14276
14423
 
14277
14424
  default:
14278
14425
  break;
14426
+ } //获取文案显示dom元素
14427
+
14428
+
14429
+ let $videoInfoList = $(me.selector + " .video-main #info-" + number);
14430
+
14431
+ if (!$videoInfoList.length) {
14432
+ console.error("can not find dom by id [info-" + number + "]");
14433
+ continue;
14279
14434
  }
14280
14435
 
14281
- let videoInfoObj = document.getElementById('info-' + number);
14436
+ let videoInfoObj = $videoInfoList[0];
14282
14437
  let videoName = me.VIDEO_DATA[i].opts && me.VIDEO_DATA[i].opts.name ? me.VIDEO_DATA[i].opts.name : me.VIDEO_DATA[i].video;
14283
- videoInfoObj.innerHTML = videoName + '&nbsp;&nbsp;' + resolution + '<br>丢包率:' + me.VIDEO_DATA[i].packetsLostRate + '&nbsp;&nbsp;' + bitrate.replace("kbits/sec", "kbps");
14438
+ videoInfoObj.innerHTML = videoName + '&nbsp;&nbsp;' + resolution + '<br>丢包率:' + me.VIDEO_DATA[i].packetsLostRate + '&nbsp;&nbsp;' + bitrate.replace("kbits/sec", "kbps"); //根据视频框大小自动计算 显示文案的文字大小
14439
+
14440
+ let fontHeightSize = $(me.selector + " .video-main #video-" + number).height() / 15;
14441
+ let fontWidthSize = $(me.selector + " .video-main #video-" + number).width() / 18; //长和宽 除以 15, 取小的值做文字大小样式
14442
+
14443
+ let fontSize = fontHeightSize < fontWidthSize ? fontHeightSize : fontWidthSize;
14444
+ fontSize = !fontSize || fontSize > 20 ? 20 : fontSize;
14445
+ $("#info-" + number).css("font-size", fontSize + "px");
14284
14446
  }
14285
14447
  }
14286
14448
  } //已存在则清除
@@ -14343,17 +14505,175 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14343
14505
  }
14344
14506
  },
14345
14507
 
14508
+ /**
14509
+ * 设置当前网络信号提示
14510
+ * @param index 当前打开视频的索引
14511
+ * @param config
14512
+ * @param me
14513
+ * @private
14514
+ */
14515
+ _setFrameDecoded: function (index, config, me) {
14516
+ if (config.pc !== null && typeof config.pc !== 'undefined' && config.pc.getStats) {
14517
+ config.pc.getStats().then(function (stats) {
14518
+ stats.forEach(function (res) {
14519
+ if (res) {
14520
+ let inStats = false; // Check if these are statistics on incoming media
14521
+
14522
+ if ((res.mediaType === 'video' || res.id.toLowerCase().indexOf('video') > -1) && res.type === 'inbound-rtp' && res.id.indexOf('rtcp') < 0) {
14523
+ // New stats
14524
+ inStats = true;
14525
+ } else if (res.type === 'ssrc' && res.bytesReceived && (res.googCodecName === 'VP8' || res.googCodecName === '')) {
14526
+ // Older Chromer versions
14527
+ inStats = true;
14528
+ } // Parse stats now
14529
+
14530
+
14531
+ if (inStats) {
14532
+ if (res.hasOwnProperty('framesDecoded')) {
14533
+ if (res.framesDecoded <= 1) return;
14534
+
14535
+ if (typeof me.VIDEO_DATA[index].framesDecodedCount === 'undefined') {
14536
+ me.VIDEO_DATA[index].framesDecodedCount = 0;
14537
+ }
14538
+
14539
+ if (typeof me.VIDEO_DATA[index].framesDecodedLast === 'undefined') {
14540
+ me.VIDEO_DATA[index].framesDecodedLast = res.framesDecoded;
14541
+ }
14542
+
14543
+ if (res.framesDecoded > me.VIDEO_DATA[index].framesDecodedLast) {
14544
+ if (typeof me.VIDEO_DATA[index].tipDom !== 'undefined' && me.VIDEO_DATA[index].tipDom.style.display === 'block') {
14545
+ me.VIDEO_DATA[index].tipDom.style.display = 'none';
14546
+ }
14547
+ }
14548
+
14549
+ me.VIDEO_DATA[index].framesDecodedCount++; // 定时检测
14550
+
14551
+ if (me.VIDEO_DATA[index].framesDecodedCount === me.configOpt) {
14552
+ if (res.framesDecoded - me.VIDEO_DATA[index].framesDecodedLast === 0) {
14553
+ // 卡顿
14554
+ if (typeof me.VIDEO_DATA[index].tipDom === 'undefined') {
14555
+ var numIndex = index + 1;
14556
+ me.VIDEO_DATA[index].tipDom = document.getElementById('frame-decoded-' + numIndex);
14557
+ }
14558
+
14559
+ me.VIDEO_DATA[index].tipDom.style.display = 'block';
14560
+ }
14561
+
14562
+ me.VIDEO_DATA[index].framesDecodedCount = 0;
14563
+ me.VIDEO_DATA[index].framesDecodedLast = res.framesDecoded;
14564
+ } else {
14565
+ me.VIDEO_DATA[index].framesDecodedLast = res.framesDecoded;
14566
+ }
14567
+ }
14568
+ }
14569
+ }
14570
+ });
14571
+ });
14572
+ }
14573
+ },
14574
+
14575
+ /**
14576
+ * 设备可用性检查(扬声器、麦克风、分辨率、浏览器类型)
14577
+ * 1. 未检测(status == undefined)询问进入检测界面
14578
+ * 2. 检测完成按相应结果给予相应提示
14579
+ * 3. 拒绝检测按所有检测通过处理
14580
+ * 4. 程序自行检测,并将是否加载声卡结果放入window对象
14581
+ * @private
14582
+ */
14583
+ _checkDevices: function () {
14584
+ let me = this;
14585
+ let tipCountKey = "DEVICES_CHECK_TIP_COUNT";
14586
+ let statusKey = "DEVICES_CHECK_STATUS";
14587
+ let checkCompleted = "completed";
14588
+ let checkRejected = "rejected";
14589
+ let microResultKey = "MICRO_RESULT";
14590
+ let speakerResultKey = "SPEAKER_RESULT";
14591
+ let screenResultKey = "SCREEN_RESULT";
14592
+ let resultPass = "pass";
14593
+ let resultNotPass = "not pass";
14594
+ let tipCount = sessionStorage.getItem(tipCountKey);
14595
+ let status = localStorage.getItem(statusKey);
14596
+
14597
+ if ((tipCount == undefined || tipCount == "0") && status == undefined) {
14598
+ sessionStorage.setItem(tipCountKey, "1"); //弹窗讯问是否进入检测界面
14599
+
14600
+ if (confirm("您还没有检测硬件设备,是否先进行检测?")) {
14601
+ window.open("/scooper-video/new/checkDevices");
14602
+ } else {
14603
+ localStorage.setItem(statusKey, checkRejected);
14604
+ }
14605
+
14606
+ return;
14607
+ }
14608
+
14609
+ if (status == checkCompleted) {
14610
+ let microResult = localStorage.getItem(microResultKey) == undefined ? resultPass : localStorage.getItem(microResultKey);
14611
+ let speakerResult = localStorage.getItem(speakerResultKey) == undefined ? resultPass : localStorage.getItem(speakerResultKey);
14612
+ let screenResult = localStorage.getItem(screenResultKey) == undefined ? resultPass : localStorage.getItem(screenResultKey);
14613
+ let msg = "";
14614
+
14615
+ if (speakerResult == resultNotPass) {
14616
+ msg += "检测到扬声器异常,可能影响系统某些功能的使用!";
14617
+ console.error(msg);
14618
+ }
14619
+
14620
+ if (microResult == resultNotPass) {
14621
+ msg += "检测到麦克风异常,可能影响系统某些功能的使用!";
14622
+ console.error(msg);
14623
+ }
14624
+
14625
+ if (screenResult === resultNotPass) {
14626
+ msg += "您的屏幕分辨率过低,可能导致页面布局混乱!"; //提示消息
14627
+
14628
+ promptAlarm(msg);
14629
+ }
14630
+
14631
+ let userAgent = navigator.userAgent;
14632
+
14633
+ if (userAgent.toLowerCase().indexOf("chrome") < 0 && userAgent.toLowerCase().indexOf("firefox") < 0 && userAgent.toLowerCase().indexOf("edge") < 0) {
14634
+ msg += "当前浏览器下部分功能可能存在兼容问题,建议使用谷歌浏览器!";
14635
+ promptAlarm(msg);
14636
+ }
14637
+
14638
+ if (msg != "") {
14639
+ //提示并派发消息
14640
+ // promptAlarm(msg);
14641
+ //防止外部未监听消息就派发事件
14642
+ setTimeout(function () {
14643
+ me.videoListener.dispatch('msginfo', {
14644
+ 'msg': msg
14645
+ });
14646
+ }, 3000);
14647
+ }
14648
+ }
14649
+ },
14650
+
14346
14651
  /**
14347
14652
  * 视频界面的初始化,在传过来的dom中创建界面
14348
14653
  */
14349
- _initVideoView: function ($dom) {
14654
+ _initVideoView: function ($dom, infoPosition) {
14350
14655
  let me = this;
14351
- let objClass = (me._opts.windowsNum == 1 ? 'video-main-full mode-' : 'video-main mode-') + me._opts.windows;
14656
+ let position;
14657
+
14658
+ switch (infoPosition) {
14659
+ case 1:
14660
+ position = "info-bottom";
14661
+ break;
14662
+
14663
+ case 2:
14664
+ position = "info-top";
14665
+ break;
14666
+
14667
+ default:
14668
+ position = "info-bottom";
14669
+ }
14670
+
14671
+ let objClass = (me._opts.windowsNum == 1 ? 'video-main video-main-full mode-' : 'video-main mode-') + me._opts.windows;
14352
14672
  let videoHtml = '<ul class="' + objClass + '" id="video-main-web-rtc" video-flag="' + me._opts.windowsBeginIndex + '">';
14353
14673
  let index = me._opts.windowsBeginIndex + 1;
14354
14674
 
14355
14675
  for (let i = index; i < index + me._opts.windowsNum; i++) {
14356
- 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>';
14676
+ 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>';
14357
14677
 
14358
14678
  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>');
14359
14679
  videoHtml += '<button type="button" class="unrecv-audio-btn hide" name="recvAudio"></button>' + '<button type="button" class="close-btn hide" name="closeVideo"></button>' + '</div>' + '</li>';
@@ -14369,7 +14689,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14369
14689
  */
14370
14690
  _initAudioView: function ($dom) {
14371
14691
  let me = this;
14372
- let objClass = (me._opts.windowsNum == 1 ? 'video-main-full mode-' : 'video-main mode-') + me._opts.windows;
14692
+ let objClass = (me._opts.windowsNum == 1 ? 'video-main video-main-full mode-' : 'video-main mode-') + me._opts.windows;
14373
14693
  let videoHtml = '<ul class="' + objClass + '" id="video-main-web-rtc" video-flag="' + me._opts.windowsBeginIndex + '">';
14374
14694
  let index = me._opts.windowsBeginIndex + 1;
14375
14695
 
@@ -14419,6 +14739,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14419
14739
  console.error('Janus服务连接失败:' + error);
14420
14740
  me.closeAll();
14421
14741
 
14742
+ me._removeAllWaitingVideo();
14743
+
14422
14744
  me._initJanus();
14423
14745
  },
14424
14746
  destroyed: function () {
@@ -14429,6 +14751,19 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14429
14751
  });
14430
14752
  },
14431
14753
 
14754
+ /**
14755
+ * 销毁所有
14756
+ */
14757
+ destory: function () {
14758
+ var me = this;
14759
+ me.destoryJanus();
14760
+ $(me.selector).empty();
14761
+ me.videoListener = null;
14762
+ me.VIDEO_DATA = null;
14763
+ me.selector = null; //destoryJanus会触发回调,需要使用到opts
14764
+ // me._opts = null;
14765
+ },
14766
+
14432
14767
  /**
14433
14768
  * 销毁:Janus销毁、资源释放
14434
14769
  */
@@ -14437,14 +14772,17 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14437
14772
 
14438
14773
  me._opts.janus.destroy({
14439
14774
  success: function () {
14440
- window.windowsSum = 0; //userToken = null;
14441
-
14775
+ // window.windowsSum = 0;
14776
+ //userToken = null;
14442
14777
  registered = false;
14443
14778
  },
14444
14779
  asyncRequest: true,
14445
14780
  notifyDestroyed: true
14446
14781
  });
14782
+
14783
+ me.removeAllListeners();
14447
14784
  },
14785
+ reLoginJanusItvIndex: -1,
14448
14786
 
14449
14787
  /**
14450
14788
  * 初始化插件、登陆,初始化窗口
@@ -14504,13 +14842,43 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14504
14842
 
14505
14843
  if (event === 'registration_failed') {
14506
14844
  promptFailed("janus登陆失败: " + result["code"] + " " + result["reason"]);
14845
+
14846
+ if (me.reLoginJanusItvIndex == -1) {
14847
+ me.reLoginJanusItvIndex = setInterval(function () {
14848
+ console.log("尝试重新登陆janus!");
14849
+
14850
+ me._initJanus(janus);
14851
+ }, 5000);
14852
+ }
14853
+
14854
+ return;
14855
+ }
14856
+
14857
+ if (event === 'video_server_closed') {
14858
+ if (me.reLoginJanusItvIndex == -1) {
14859
+ me.reLoginJanusItvIndex = setInterval(function () {
14860
+ console.log("尝试重新登陆janus!");
14861
+
14862
+ me._initJanus(janus);
14863
+ }, 5000);
14864
+ }
14865
+
14507
14866
  return;
14508
14867
  }
14509
14868
 
14510
14869
  if (event === 'registered') {
14511
14870
  let userToken = result["userToken"];
14512
14871
  console.log('janus登陆成功');
14513
- registered = true; //生成主界面
14872
+ registered = true;
14873
+
14874
+ if (me.reLoginJanusItvIndex != -1) {
14875
+ clearInterval(me.reLoginJanusItvIndex);
14876
+ me.reLoginJanusItvIndex = -1;
14877
+ } //生成主界面
14878
+ //相对序号,用于标识当前janus连接初始化的序号窗口
14879
+
14880
+
14881
+ let relativeIndex = 0;
14514
14882
 
14515
14883
  for (let i = me._opts.windowsBeginIndex; i < me._opts.windowsBeginIndex + me._opts.windowsNum; i++) {
14516
14884
  me.VIDEO_DATA[i] = new SVideo({
@@ -14518,42 +14886,254 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14518
14886
  janus: janus,
14519
14887
  userToken: userToken,
14520
14888
  windowsNum: me._opts.windowsNum,
14889
+ relativeIndex: relativeIndex++,
14521
14890
  flag: me._opts.flag,
14522
14891
  isVideoTag: me._opts.isVideoTag,
14523
- janusPlugin: me._opts.conf.janusPlugin
14524
- });
14892
+ janusPlugin: me._opts.conf.janusPlugin,
14893
+ videoTipTimeOut: me._opts.videoTipTimeOut,
14894
+ parentSelector: me.selector
14895
+ }, me.videoListener);
14525
14896
  }
14526
14897
  }
14527
14898
  }
14528
14899
  }
14529
14900
  });
14901
+ },
14902
+
14903
+ /* ----------------------------- 播放队列 --------------------------- */
14904
+ // 记录等待中的视频
14905
+ WAITING_DATA: [],
14906
+ // 播放队列开关 默认关闭
14907
+ waitPlayQueueSwitch: false,
14908
+
14909
+ /**
14910
+ * 添加等待视频数据
14911
+ * 同一位置再次打开,则覆盖上一次的
14912
+ * 参数:index(视频窗口编号,从0开始) video(视频设备id,即devId) id(标识,空的话使用设备id) opts(其他参数)
14913
+ */
14914
+ _addWaitingVideo: function (index, video, id, opts) {
14915
+ let _self = this;
14916
+
14917
+ let isOverride = false;
14918
+ $.each(_self.WAITING_DATA, function (i, obj) {
14919
+ if (obj.index == index) {
14920
+ console.log("播放队列中 index = " + index + ", video = " + obj.video + " 替换为 video = " + video);
14921
+ _self.WAITING_DATA[i] = {
14922
+ index: index,
14923
+ video: video,
14924
+ id: id,
14925
+ opts: opts
14926
+ };
14927
+ isOverride = true;
14928
+ return false;
14929
+ }
14930
+ });
14931
+
14932
+ if (!isOverride) {
14933
+ _self.WAITING_DATA.push({
14934
+ index: index,
14935
+ video: video,
14936
+ id: id,
14937
+ opts: opts
14938
+ });
14939
+
14940
+ console.log("index = " + index + ", video = " + video + " 加入播放队列");
14941
+ }
14942
+
14943
+ _self.VIDEO_DATA[index].isWaiting = true;
14944
+ },
14945
+
14946
+ /**
14947
+ * 删除等待视频数据
14948
+ */
14949
+ _removeWaitingVideo: function (index, video) {
14950
+ let _self = this;
14951
+
14952
+ $.each(_self.WAITING_DATA, function (i, obj) {
14953
+ if (obj.index == index && obj.video == video) {
14954
+ _self.WAITING_DATA.splice(i, 1);
14955
+
14956
+ _self.VIDEO_DATA[index].isWaiting = false;
14957
+ console.log("index = " + index + ", video = " + video + " 从播放队列移除");
14958
+ return false;
14959
+ }
14960
+ });
14961
+ },
14962
+
14963
+ /**
14964
+ * 删除所有等待播放视频的数据
14965
+ */
14966
+ _removeAllWaitingVideo: function () {
14967
+ let _self = this;
14968
+
14969
+ _self.WAITING_DATA = [];
14970
+ let index = _self._opts.windowsBeginIndex;
14971
+
14972
+ for (; index < _self._opts.windowsBeginIndex + _self._opts.windows; index++) {
14973
+ _self.VIDEO_DATA[index].isWaiting = false;
14974
+ }
14975
+ },
14976
+
14977
+ /**
14978
+ * 上一个视频关闭后,如果该位置由等待视频,通知打开新视频
14979
+ * @param index
14980
+ */
14981
+ _notifyWaitingVideo: function (index) {
14982
+ let _self = this;
14983
+
14984
+ $.each(_self.WAITING_DATA, function (i, obj) {
14985
+ if (obj.index == index) {
14986
+ _self.play(obj.index, obj.video, obj.id, obj.opts);
14987
+
14988
+ _self._removeWaitingVideo(obj.index, obj.video);
14989
+
14990
+ return false;
14991
+ }
14992
+ });
14530
14993
  }
14531
14994
  };
14532
- let FAILED_CODE = {
14533
- 1001: "账号或密码错误",
14534
- 1002: "该帐号已连接",
14535
- 1004: "没有鉴权",
14536
- 2001: "未携带token或token错误",
14537
- 2002: "视频源id不存在",
14538
- 2003: "操作指令非法(该账号不允许执行这个指令,或者不支持该指令)",
14539
- 3001: "nat通道未建立",
14540
- 3002: "该视频流已在传输",
14541
- 3003: "无法获取远端视频流",
14542
- 4001: "视频流断开连接",
14543
- 4002: "获取视频失败",
14544
- 5000: "内部错误",
14545
- 8001: "设备不支持该指令",
14546
- 453: "videoServer连接失败",
14547
- 454: "录像回放窗口已占用,请先停止播放",
14548
- 455: "无视频录像,操作失败",
14549
- 5001: "呼叫异常断开",
14550
- 5002: "禁止修改分辨率",
14551
- 4003: "音频被占用",
14552
- 4004: "音频被占用",
14553
- 4005: "客户端已打开对讲",
14554
- 4006: "终端离开云眼音频"
14995
+ let CONST_CODE = {
14996
+ //打开失败错误码,面板显示,不做浮窗提示框显示
14997
+ VIDEO_CODE: {
14998
+ 2002: "打开失败,未找到该ID的视频源",
14999
+ 2003: "打开失败,请确认视频服务版本",
15000
+ 3001: "打开失败,未接收到引流包,请检查端口映射",
15001
+ 3002: "",
15002
+ 3003: "打开失败,对方拒绝视频请求",
15003
+ 4001: "打开失败,视频流中断",
15004
+ 4002: "打开失败,终端挂机或超时未接听",
15005
+ 7000: "打开失败,无法连接视频设备",
15006
+ 7001: "打开失败,无法连接视频设备",
15007
+ 7002: "打开失败,无法连接视频设备"
15008
+ },
15009
+ OTHER_CODE: {
15010
+ 453: "videoServer连接失败,错误码453",
15011
+ 454: "视频窗口已被占用,请选择其它窗口打开或停止播放",
15012
+ 455: "操作失败,该段时间无视频录像",
15013
+ 499: "操作异常,错误码499",
15014
+ 440: "操作异常,错误码440",
15015
+ 441: "操作异常,错误码441",
15016
+ 442: "操作异常,错误码442",
15017
+ 443: "操作异常,错误码443",
15018
+ 444: "操作异常,错误码444",
15019
+ 445: "操作异常,错误码445",
15020
+ 446: "操作异常,错误码446",
15021
+ 447: "操作异常,错误码447",
15022
+ 448: "操作异常,错误码448",
15023
+ 449: "操作异常,错误码449",
15024
+ 450: "操作异常,错误码450",
15025
+ 451: "操作异常,错误码451",
15026
+ 452: "操作异常,错误码452",
15027
+ 456: "设备已处于对讲状态或不支持对讲",
15028
+ 6001: "录像失败"
15029
+ },
15030
+ FAILED_CODE: {
15031
+ 1001: "账号或密码错误",
15032
+ 1002: "该帐号已连接",
15033
+ 1004: "没有鉴权",
15034
+ 2001: "未携带token或token错误",
15035
+ 2002: "视频源id不存在",
15036
+ 2003: "操作指令非法(该账号不允许执行这个指令,或者不支持该指令)",
15037
+ 3001: "nat通道未建立",
15038
+ 3002: "该视频流已在传输",
15039
+ 3003: "无法获取远端视频流",
15040
+ 4001: "视频流异常断开连接",
15041
+ 4002: "获取视频失败",
15042
+ 5000: "内部错误",
15043
+ 8001: "该设备不支持云台操作",
15044
+ 453: "videoServer连接失败",
15045
+ 454: "录像回放窗口已占用,请先停止播放",
15046
+ 455: "无视频录像,操作失败",
15047
+ 5001: "呼叫异常断开",
15048
+ 5002: "禁止修改分辨率",
15049
+ 401: "禁止修改分辨率",
15050
+ 4003: "音频重置",
15051
+ 4004: "音频被占用",
15052
+ 4005: "客户端已打开对讲",
15053
+ 4006: "终端离开云眼音频",
15054
+ 4008: "终端拒绝打开视频",
15055
+ 6001: "录像失败",
15056
+ 499: "内部创建失败",
15057
+ 440: "请求消息内容为空",
15058
+ 441: "json格式错误",
15059
+ 442: "无效的请求",
15060
+ 443: "消息内容缺失",
15061
+ 444: "消息缺少参数",
15062
+ 445: "账户已登陆",
15063
+ 446: "收到的videoserver消息有误",
15064
+ 447: "消息参数错误",
15065
+ 448: "SDP创建失败",
15066
+ 449: "未使用",
15067
+ 450: "创建端口失败",
15068
+ 451: "SDP创建失败",
15069
+ 452: "未使用加密的RTP",
15070
+ 456: "对讲未打开",
15071
+ 7000: "URL账号密码错误(RTSP)",
15072
+ 7001: "URL地址不通(RTSP)",
15073
+ 7002: "URL格式错误(RTSP)"
15074
+ },
15075
+ STATUS_CODE_ARR: ['5002', '4003', '4004', '4005', '4006']
14555
15076
  };
14556
- let STATUS_CODE_ARR = ['5002', '4003', '4004', '4005', '4006']; //window.VIDEO_DATA = [];//记录视频各分屏的状态
15077
+ /**
15078
+ * 显示播放错误内容, 4002特殊处理
15079
+ * @param videoObj 视频对象
15080
+ * @param code 状态码(包含错误码)
15081
+ * @param isShowReplayBtn 是否显示重新播放按钮
15082
+ * @param video 打开错误的视频Id
15083
+ */
15084
+
15085
+ function showResult(videoObj, code, isShowReplayBtn, video) {
15086
+ let videoDom = videoObj.tagBox.parent();
15087
+ videoDom.addClass("result");
15088
+ videoDom.find('.operate-btn .close-btn').show();
15089
+
15090
+ if (CONST_CODE.FAILED_CODE[code] && code != "4002") {
15091
+ let resultHtml = "<div class='real-result'>错误码" + code + ": " + CONST_CODE.FAILED_CODE[code] + "</div>";
15092
+ videoDom.append(resultHtml);
15093
+ }
15094
+
15095
+ let resultHtml = "<div class='result'><div class='result-tip'>" + CONST_CODE.VIDEO_CODE[code] + "</div>";
15096
+
15097
+ if (isShowReplayBtn && code != "4002") {
15098
+ resultHtml += "<div class='result-replay'><span id='replay-" + videoObj.index + "' class='replay'>点击重试</span></div>";
15099
+ }
15100
+
15101
+ resultHtml += "</div>";
15102
+ videoDom.append(resultHtml);
15103
+
15104
+ if (isShowReplayBtn && code != "4002") {
15105
+ $("#replay-" + videoObj.index).unbind("click").click(function () {
15106
+ videoObj.videoListener.dispatch("openVideo", {
15107
+ index: videoObj.index,
15108
+ video: video,
15109
+ id: videoObj.id,
15110
+ opts: videoObj.opts
15111
+ });
15112
+ });
15113
+ }
15114
+
15115
+ if (code == "4002") {
15116
+ setTimeout(function () {
15117
+ clearResult(videoDom);
15118
+ }, 5000);
15119
+ }
15120
+ }
15121
+ /**
15122
+ * 清除显示内容 videoDom: 视频Dom对象
15123
+ */
15124
+
15125
+
15126
+ function clearResult(videoDom, videoObj) {
15127
+ videoDom.removeClass("result");
15128
+ videoDom.find(".real-result").remove();
15129
+ videoDom.find(".result").remove();
15130
+
15131
+ if (!videoObj || !videoObj.playing) {
15132
+ // bug id 18654: 增加是否正在播放判断
15133
+ videoDom.find('.operate-btn .close-btn').hide();
15134
+ }
15135
+ } //window.VIDEO_DATA = [];//记录视频各分屏的状态
15136
+
14557
15137
 
14558
15138
  window.windowsSum = 0; //当前页面的视频总数,可能有多个VideoWebRtc对象
14559
15139
  //let userToken = null;
@@ -14561,16 +15141,27 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14561
15141
  let registered = false;
14562
15142
  let recordAvBusinessId = null;
14563
15143
 
14564
- function SVideo(opts) {
15144
+ function SVideo(opts, videoListener) {
14565
15145
  this.janus = opts.janus;
14566
15146
  this.userToken = opts.userToken;
14567
15147
  this.sipcall = null;
14568
15148
  this.index = opts.index;
14569
- this.tagBox = opts.isVideoTag ? $('#video-' + (this.index + 1)) : $('#audio-' + (this.index + 1));
15149
+ this.relativeIndex = opts.relativeIndex; // this.tagBox = opts.isVideoTag ? $('#video-' + (this.index + 1)) : $('#audio-' + (this.index + 1));
15150
+
15151
+ this.tagBox = opts.isVideoTag ? $(opts.parentSelector + ' #video-' + (this.index + 1)) : $('#audio-' + (this.index + 1));
14570
15152
  this.windowsNum = opts.windowsNum;
14571
15153
  this.flag = opts.flag;
14572
15154
  this.isVideoTag = opts.isVideoTag;
14573
15155
  this.janusPlugin = opts.janusPlugin;
15156
+ this.isClosing = false; // 当前分屏是否正在关闭视频
15157
+
15158
+ this.isWaiting = false; // 当前分屏是否有视频在等待播放
15159
+
15160
+ this.playSucTimeOutIndex = -1; // 超时提示定时器index
15161
+
15162
+ this.videoTipTimeOut = opts.videoTipTimeOut; // 超时无首屏时间
15163
+
15164
+ this.videoListener = videoListener;
14574
15165
  this.init();
14575
15166
  }
14576
15167
  /**
@@ -14591,8 +15182,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14591
15182
  console.log("视频插件初始化成功:" + self.index);
14592
15183
  self.sipcall = pluginHandle;
14593
15184
 
14594
- if (self.index + 1 >= self.windowsNum) {
14595
- videoListener.dispatch('initsucc', self);
15185
+ if (self.relativeIndex + 1 >= self.windowsNum) {
15186
+ self.videoListener.dispatch('initsucc', self);
14596
15187
  }
14597
15188
  },
14598
15189
  error: function (error) {
@@ -14606,11 +15197,20 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14606
15197
  promptFailed("请先登陆");
14607
15198
  }
14608
15199
 
15200
+ let video = self.video;
15201
+
14609
15202
  if (msg.error_code) {
14610
- console.error(msg.error_code + ' ' + msg.error);
14611
- promptFailed(FAILED_CODE[msg.error_code] || '错误码:' + msg.error_code);
14612
- videoListener.dispatch('msginfo', {
14613
- 'msg': FAILED_CODE[msg.error_code] || '错误码:' + msg.error_code
15203
+ console.error("错误码:" + msg.error_code + " " + CONST_CODE.FAILED_CODE[msg.error_code]);
15204
+
15205
+ if (CONST_CODE.VIDEO_CODE[msg.error_code]) {
15206
+ showResult(self, msg.error_code, true, video);
15207
+ } else {
15208
+ promptFailed(CONST_CODE.OTHER_CODE[msg.error_code] || CONST_CODE.FAILED_CODE[msg.error_code] || '错误码:' + msg.error_code);
15209
+ }
15210
+
15211
+ self.videoListener.dispatch('msginfo', {
15212
+ 'code': msg.error_code,
15213
+ 'msg': CONST_CODE.OTHER_CODE[msg.error_code] || CONST_CODE.FAILED_CODE[msg.error_code] || '错误码:' + msg.error_code
14614
15214
  });
14615
15215
  return false;
14616
15216
  }
@@ -14620,23 +15220,32 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14620
15220
 
14621
15221
  if (result.error_code && result.error_code != 0) {
14622
15222
  //videoListener.dispatch('afterclose', self);
14623
- if (!STATUS_CODE_ARR.includes(result.error_code + '')) {
15223
+ if (!CONST_CODE.STATUS_CODE_ARR.includes(result.error_code + '')) {
14624
15224
  //videoListener.dispatch('afterclose', self);
14625
15225
  //播放失败 关闭视频
14626
- let video = self.video;
14627
15226
  self.close('err');
14628
15227
 
14629
15228
  if (self.isLockVideo) {
14630
- self.play(video);
15229
+ setTimeout(function () {
15230
+ self.play(video);
15231
+ }, 1500);
14631
15232
  } else {
14632
- videoListener.dispatch('afterclose', self);
15233
+ self.closeType = 'error';
15234
+ self.videoListener.dispatch('afterclose', self);
14633
15235
  }
14634
15236
  }
14635
15237
 
14636
- videoListener.dispatch('msginfo', {
14637
- 'msg': FAILED_CODE[result.error_code] || '错误码:' + result.error_code
15238
+ self.videoListener.dispatch('msginfo', {
15239
+ 'code': result.error_code,
15240
+ 'msg': CONST_CODE.OTHER_CODE[result.error_code] || CONST_CODE.FAILED_CODE[result.error_code] || '错误码:' + result.error_code
14638
15241
  });
14639
- promptFailed(FAILED_CODE[result.error_code] || '错误码:' + result.error_code);
15242
+
15243
+ if (CONST_CODE.VIDEO_CODE[result.error_code]) {
15244
+ showResult(self, result.error_code, true, video);
15245
+ } else {
15246
+ promptFailed(CONST_CODE.OTHER_CODE[result.error_code] || CONST_CODE.FAILED_CODE[result.error_code] || '错误码:' + result.error_code);
15247
+ }
15248
+
14640
15249
  self.tagBox.parent().find('.recv-audio-btn').attr("class", "unrecv-audio-btn");
14641
15250
  self.tagBox.parent().find('.send-audio-btn').attr("class", "unsend-audio-btn");
14642
15251
  } //事件响应
@@ -14669,17 +15278,19 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14669
15278
  });
14670
15279
  },
14671
15280
  error: function (error) {
14672
- console.error(error);
14673
- let body = {
14674
- "request": "decline",
14675
- "code": 480
14676
- };
14677
- self.sipcall.send({
14678
- "message": body
14679
- });
15281
+ console.error(error); // let body = { "request": "decline", "code": 480 };
15282
+ // self.sipcall.send({"message": body});
14680
15283
  }
14681
15284
  });
14682
15285
  break;
15286
+
15287
+ case 'accepted':
15288
+ self.playSucTimeOutIndex = setTimeout(function () {
15289
+ let _li = self.tagBox.parent();
15290
+
15291
+ _li.append('<div class="video-tip">网络环境较差,可能无法正常加载视频</div>');
15292
+ }, self.videoTipTimeOut * 1000);
15293
+ break;
14683
15294
  //呼叫失败
14684
15295
 
14685
15296
  case 'callfaild':
@@ -14698,7 +15309,16 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14698
15309
  case 'start_av_record':
14699
15310
  if (result && result.filename) {
14700
15311
  self.videoFileName = result.filename;
14701
- videoListener.dispatch('recordvideo', self);
15312
+ self.videoListener.dispatch('startRecordVideo', self);
15313
+ console.log('录像地址:' + result.filename);
15314
+ }
15315
+
15316
+ break;
15317
+
15318
+ case 'stop_av_record':
15319
+ if (result && result.filename) {
15320
+ self.videoFileName = result.filename;
15321
+ self.videoListener.dispatch('stopRecordVideo', self);
14702
15322
  console.log('录像地址:' + result.filename);
14703
15323
  }
14704
15324
 
@@ -14708,10 +15328,17 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14708
15328
  case 'ser_notify_resolution':
14709
15329
  if (result && result.resolution) {
14710
15330
  self.resolution = result.resolution;
14711
- videoListener.dispatch('notifyresolution', self);
15331
+ self.videoListener.dispatch('notifyresolution', self);
14712
15332
  console.log('接收notifyresolution:' + result.resolution); //promptAlarm('当前分辨率:' + result.resolution);
14713
15333
  }
14714
15334
 
15335
+ break;
15336
+
15337
+ case 'change_resolution':
15338
+ if (result) {
15339
+ self.videoListener.dispatch('notifyResolutionChange', self);
15340
+ }
15341
+
14715
15342
  break;
14716
15343
  //建立预呼叫响应
14717
15344
 
@@ -14748,9 +15375,38 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14748
15375
  break;
14749
15376
 
14750
15377
  case 'ser_stop_audio':
15378
+ self.tagBox.parent().find('.recv-audio-btn').attr("class", "unrecv-audio-btn");
14751
15379
  console.log('音频异常关闭!');
14752
15380
  break;
14753
15381
 
15382
+ case 'close_down_audio':
15383
+ self.tagBox.parent().find('.send-audio-btn').attr("class", "unsend-audio-btn");
15384
+ promptSuccess("通话时间到");
15385
+ console.log('通话时间到!');
15386
+ break;
15387
+
15388
+ case 'ser_notify_dispatch_close_ptop_poc':
15389
+ self.tagBox.parent().find('.send-audio-btn').attr("class", "unsend-audio-btn");
15390
+ console.log('调度通知点对点对讲关闭!');
15391
+ break;
15392
+
15393
+ case 'ser_close_ptop_poc':
15394
+ self.tagBox.parent().find('.send-audio-btn').attr("class", "unsend-audio-btn");
15395
+ console.log('点对点对讲关闭!');
15396
+ break;
15397
+
15398
+ case 'ser_open_ptop_poc':
15399
+ self.tagBox.parent().find('.unsend-audio-btn').attr("class", "send-audio-btn");
15400
+ console.log('点对点对讲打开!');
15401
+ break;
15402
+ // 视频关闭通知
15403
+
15404
+ case 'ser_close_video':
15405
+ console.log('视频框 ' + self.index + ' 视频已关闭');
15406
+ self.isClosing = false;
15407
+ self.videoListener.dispatch('notifyCloseVideo', self);
15408
+ break;
15409
+
14754
15410
  default:
14755
15411
  console.log('event:' + event);
14756
15412
  break;
@@ -14798,7 +15454,10 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14798
15454
 
14799
15455
  self.tagBox.bind("canplay play playing", function () {
14800
15456
  if (self.video) {
14801
- if (self.tagBox.is(':visible')) return;
15457
+ if (self.tagBox.is(':visible')) return; // 清除播放监测定时任务,清除内容
15458
+
15459
+ self.playSucTimeOutIndex > 0 && clearTimeout(self.playSucTimeOutIndex);
15460
+ self.tagBox.parent().find(".video-tip").remove();
14802
15461
  console.log('分屏=' + (self.index + 1) + ', ' + self.video + ' 播放成功');
14803
15462
  promptSuccess('分屏' + (self.index + 1) + ' 播放成功');
14804
15463
  self.tagBox.show(); //self.tagBox.parent().removeClass("loading").find(".stream-loading").remove();
@@ -14847,13 +15506,21 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14847
15506
  "message": body
14848
15507
  });
14849
15508
  this.video = video;
15509
+ this.isClosing = false;
14850
15510
  this.playing = true;
14851
15511
  this.packetsLostRate = '0.00%';
14852
15512
  this.packetsLostSum = 0;
14853
- this.packetsReceivedSum = 0; //loading
15513
+ this.packetsReceivedSum = 0;
15514
+ let numIndex = this.index + 1;
15515
+ let framesDecodedDom = document.getElementById("frame-decoded-" + numIndex);
15516
+ framesDecodedDom.style.display = 'none';
15517
+ this.framesDecodedLast = undefined;
15518
+ this.framesDecodedCount = 0; //loading
14854
15519
 
14855
15520
  let _li = this.tagBox.parent();
14856
15521
 
15522
+ clearResult(_li, this);
15523
+
14857
15524
  if (!_li.hasClass("loading")) {
14858
15525
  _li.addClass("loading").append('<div class="stream-loading">等待数据流传送...</div>');
14859
15526
  }
@@ -14866,8 +15533,10 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14866
15533
  if (!type) {
14867
15534
  this.isLockVideo = false;
14868
15535
  this.tagBox.parent().find('.lock-video-btn').attr("class", "unlock-video-btn");
14869
- } //let reqType = type ? type : "hangup";
15536
+ } //清除结果提示内容
15537
+
14870
15538
 
15539
+ clearResult(this.tagBox.parent(), this); //let reqType = type ? type : "hangup";
14871
15540
 
14872
15541
  if (!this.playing) return;
14873
15542
  let _hangup = {
@@ -14881,6 +15550,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14881
15550
  });
14882
15551
  this.sipcall.hangup();
14883
15552
  this.tagBox.hide();
15553
+ this.isClosing = true;
14884
15554
  this.playing = false;
14885
15555
  this.video = null;
14886
15556
  this.packetsLostRate = '0.00%';
@@ -14895,7 +15565,15 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
14895
15565
 
14896
15566
  this.tagBox.parent().removeClass("loading").find(".stream-loading").remove(); //清除object-fit
14897
15567
 
14898
- this.tagBox.css('object-fit', '');
15568
+ this.tagBox.css('object-fit', ''); // 清除内容提示
15569
+
15570
+ this.playSucTimeOutIndex > 0 && clearTimeout(this.playSucTimeOutIndex);
15571
+ this.tagBox.parent().find(".video-tip").remove();
15572
+ var numIndex = Number(this.index) + 1;
15573
+ var framesDecodedDom = document.getElementById("frame-decoded-" + numIndex);
15574
+ framesDecodedDom.style.display = 'none';
15575
+ this.framesDecodedLast = undefined;
15576
+ this.framesDecodedCount = 0;
14899
15577
  },
14900
15578
 
14901
15579
  /**
@@ -15000,6 +15678,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
15000
15678
 
15001
15679
  let _li = this.tagBox.parent();
15002
15680
 
15681
+ clearResult(_li, this);
15682
+
15003
15683
  if (!_li.hasClass("loading")) {
15004
15684
  _li.addClass("loading").append('<div class="stream-loading">等待数据流传送...</div>');
15005
15685
  }
@@ -15144,6 +15824,26 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
15144
15824
  "message": body
15145
15825
  });
15146
15826
  console.log("预呼叫操作=" + requestType + ", 对讲号码=" + pocNo + ",调度中心号码=" + centerTel);
15827
+ },
15828
+
15829
+ /**
15830
+ * 点对点对讲
15831
+ * requstType: open_ptop_poc(开启) close_poc_poc(关闭)
15832
+ * pocno
15833
+ */
15834
+ ptopPoc: function (requestType, pocNo) {
15835
+ let self = this;
15836
+ let body = {
15837
+ request: requestType,
15838
+ pocno: pocNo,
15839
+ playseq: self.index,
15840
+ pocmember: self.video,
15841
+ userToken: self.userToken
15842
+ };
15843
+ self.sipcall.send({
15844
+ "message": body
15845
+ });
15846
+ console.log("点对点对讲操作=" + requestType + ", 主叫号码=" + pocNo + ",被叫号码=" + self.video);
15147
15847
  }
15148
15848
  };
15149
15849
  return isIE() ? VideoOcx : VideoWebRtc;
@@ -28894,6 +29594,27 @@ let meet = {
28894
29594
  data: {}
28895
29595
  }
28896
29596
  },
29597
+
29598
+ /**
29599
+ * 设置主持人
29600
+ */
29601
+ setMeetChairmanNet: {
29602
+ url: '/dispatch-web/api/meet/setMeetChairman',
29603
+ method: 'POST',
29604
+ requestParam: {
29605
+ token: '',
29606
+ meetId: '',
29607
+ tel: ''
29608
+ },
29609
+ responseParam: {
29610
+ code: '',
29611
+ //返回结果状态码
29612
+ message: '',
29613
+ systemTime: '',
29614
+ //yyyy-MM-dd HH:mm:ss
29615
+ data: {}
29616
+ }
29617
+ },
28897
29618
  joinVideoMemberNet: {
28898
29619
  //成员加入会场(视频)
28899
29620
 
@@ -31496,6 +32217,20 @@ const meetOp = sip => {
31496
32217
  }, '', net.method);
31497
32218
  });
31498
32219
  },
32220
+ setChairman: function (param) {
32221
+ let net = meet_url.setMeetChairmanNet;
32222
+ return new Promise((resolve, reject) => {
32223
+ loadJson(server_ + net.url, { ...param
32224
+ }, function (ret) {
32225
+ if (ret.code == 0) {
32226
+ resolve(ret);
32227
+ } else {
32228
+ console.log("设置会场主持人失败", ret.code);
32229
+ reject(ret.code);
32230
+ }
32231
+ }, '', net.method);
32232
+ });
32233
+ },
31499
32234
  end: function (param) {
31500
32235
  let net = meet_url.endMeetNet;
31501
32236
  return new Promise((resolve, reject) => {