Commit 8b0662ebfeecad2b646689aacb4d7d6a45973eb4

Authored by 648540858
1 parent 88878940

优化国标录像下载错误提示

src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java
1 1 package com.genersoft.iot.vmp.service;
2 2  
3   -import com.alibaba.fastjson2.JSONObject;
4   -import com.genersoft.iot.vmp.gb28181.bean.Device;
5 3 import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig;
6 4 import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
7 5 import com.genersoft.iot.vmp.media.zlm.dto.ServerKeepaliveData;
8 6 import com.genersoft.iot.vmp.service.bean.MediaServerLoad;
9 7 import com.genersoft.iot.vmp.service.bean.SSRCInfo;
10   -import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
11 8  
12 9 import java.util.List;
13   -import java.util.Map;
14 10  
15 11 /**
16 12 * 媒体服务节点
... ... @@ -41,7 +37,7 @@ public interface IMediaServerService {
41 37 */
42 38 void zlmServerOffline(String mediaServerId);
43 39  
44   - MediaServerItem getMediaServerForMinimumLoad();
  40 + MediaServerItem getMediaServerForMinimumLoad(Boolean hasAssist);
45 41  
46 42 void setZLMConfig(MediaServerItem mediaServerItem, boolean restart);
47 43  
... ...
src/main/java/com/genersoft/iot/vmp/service/IPlayService.java
... ... @@ -31,6 +31,11 @@ public interface IPlayService {
31 31  
32 32 MediaServerItem getNewMediaServerItem(Device device);
33 33  
  34 + /**
  35 + * 获取包含assist服务的节点
  36 + */
  37 + MediaServerItem getNewMediaServerItemHasAssist(Device device);
  38 +
34 39 void onPublishHandlerForDownload(InviteStreamInfo inviteStreamInfo, String deviceId, String channelId, String toString);
35 40  
36 41 void playBack(String deviceId, String channelId, String startTime, String endTime, InviteStreamCallback infoCallBack, PlayBackCallback playBackCallback);
... ...
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
... ... @@ -487,7 +487,7 @@ public class MediaServerServiceImpl implements IMediaServerService {
487 487 * @return MediaServerItem
488 488 */
489 489 @Override
490   - public MediaServerItem getMediaServerForMinimumLoad() {
  490 + public MediaServerItem getMediaServerForMinimumLoad(Boolean hasAssist) {
491 491 String key = VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetting.getServerId();
492 492  
493 493 if (RedisUtil.zSize(key) == null || RedisUtil.zSize(key) == 0) {
... ... @@ -500,9 +500,31 @@ public class MediaServerServiceImpl implements IMediaServerService {
500 500 // 获取分数最低的,及并发最低的
501 501 Set<Object> objects = RedisUtil.zRange(key, 0, -1);
502 502 ArrayList<Object> mediaServerObjectS = new ArrayList<>(objects);
  503 + MediaServerItem mediaServerItem = null;
  504 + if (hasAssist == null) {
  505 + String mediaServerId = (String)mediaServerObjectS.get(0);
  506 + mediaServerItem = getOne(mediaServerId);
  507 + }else if (hasAssist) {
  508 + for (Object mediaServerObject : mediaServerObjectS) {
  509 + String mediaServerId = (String)mediaServerObject;
  510 + MediaServerItem serverItem = getOne(mediaServerId);
  511 + if (serverItem.getRecordAssistPort() > 0) {
  512 + mediaServerItem = serverItem;
  513 + break;
  514 + }
  515 + }
  516 + }else if (!hasAssist) {
  517 + for (Object mediaServerObject : mediaServerObjectS) {
  518 + String mediaServerId = (String)mediaServerObject;
  519 + MediaServerItem serverItem = getOne(mediaServerId);
  520 + if (serverItem.getRecordAssistPort() == 0) {
  521 + mediaServerItem = serverItem;
  522 + break;
  523 + }
  524 + }
  525 + }
503 526  
504   - String mediaServerId = (String)mediaServerObjectS.get(0);
505   - return getOne(mediaServerId);
  527 + return mediaServerItem;
506 528 }
507 529  
508 530 /**
... ...
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
... ... @@ -39,8 +39,6 @@ import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
39 39 import org.slf4j.Logger;
40 40 import org.slf4j.LoggerFactory;
41 41 import org.springframework.beans.factory.annotation.Autowired;
42   -import org.springframework.beans.factory.annotation.Qualifier;
43   -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
44 42 import org.springframework.stereotype.Service;
45 43 import org.springframework.util.ObjectUtils;
46 44  
... ... @@ -103,10 +101,6 @@ public class PlayServiceImpl implements IPlayService {
103 101 private ZlmHttpHookSubscribe subscribe;
104 102  
105 103  
106   - @Qualifier("taskExecutor")
107   - @Autowired
108   - private ThreadPoolTaskExecutor taskExecutor;
109   -
110 104 @Override
111 105 public void play(MediaServerItem mediaServerItem, String deviceId, String channelId,
112 106 ZlmHttpHookSubscribe.Event hookEvent, SipSubscribe.Event errorEvent,
... ... @@ -412,7 +406,7 @@ public class PlayServiceImpl implements IPlayService {
412 406 }
413 407 MediaServerItem mediaServerItem;
414 408 if (ObjectUtils.isEmpty(device.getMediaServerId()) || "auto".equals(device.getMediaServerId())) {
415   - mediaServerItem = mediaServerService.getMediaServerForMinimumLoad();
  409 + mediaServerItem = mediaServerService.getMediaServerForMinimumLoad(null);
416 410 } else {
417 411 mediaServerItem = mediaServerService.getOne(device.getMediaServerId());
418 412 }
... ... @@ -423,6 +417,23 @@ public class PlayServiceImpl implements IPlayService {
423 417 }
424 418  
425 419 @Override
  420 + public MediaServerItem getNewMediaServerItemHasAssist(Device device) {
  421 + if (device == null) {
  422 + return null;
  423 + }
  424 + MediaServerItem mediaServerItem;
  425 + if (ObjectUtils.isEmpty(device.getMediaServerId()) || "auto".equals(device.getMediaServerId())) {
  426 + mediaServerItem = mediaServerService.getMediaServerForMinimumLoad(true);
  427 + } else {
  428 + mediaServerItem = mediaServerService.getOne(device.getMediaServerId());
  429 + }
  430 + if (mediaServerItem == null) {
  431 + logger.warn("[获取可用的ZLM节点]未找到可使用的ZLM...");
  432 + }
  433 + return mediaServerItem;
  434 + }
  435 +
  436 + @Override
426 437 public void playBack(String deviceId, String channelId, String startTime,
427 438 String endTime, InviteStreamCallback inviteStreamCallback,
428 439 PlayBackCallback callback) {
... ... @@ -566,17 +577,25 @@ public class PlayServiceImpl implements IPlayService {
566 577  
567 578  
568 579 @Override
569   - public void download(String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack) {
  580 + public void download(String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback playBackCallback) {
570 581 Device device = storager.queryVideoDevice(deviceId);
571 582 if (device == null) {
572 583 return;
573 584 }
574   - MediaServerItem newMediaServerItem = getNewMediaServerItem(device);
  585 + MediaServerItem newMediaServerItem = getNewMediaServerItemHasAssist(device);
  586 + if (newMediaServerItem == null) {
  587 + PlayBackResult<StreamInfo> downloadResult = new PlayBackResult<>();
  588 + downloadResult.setCode(ErrorCode.ERROR100.getCode());
  589 + downloadResult.setMsg("未找到assist服务");
  590 + playBackCallback.call(downloadResult);
  591 + return;
  592 + }
575 593 SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, device.isSsrcCheck(), true);
576 594  
577   - download(newMediaServerItem, ssrcInfo, deviceId, channelId, startTime, endTime, downloadSpeed, infoCallBack, hookCallBack);
  595 + download(newMediaServerItem, ssrcInfo, deviceId, channelId, startTime, endTime, downloadSpeed, infoCallBack, playBackCallback);
578 596 }
579 597  
  598 +
580 599 @Override
581 600 public void download(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack) {
582 601 if (mediaServerItem == null || ssrcInfo == null) {
... ... @@ -659,7 +678,10 @@ public class PlayServiceImpl implements IPlayService {
659 678 }
660 679 if (mediaServerItem.getRecordAssistPort() > 0) {
661 680 JSONObject jsonObject = assistRESTfulUtils.fileDuration(mediaServerItem, streamInfo.getApp(), streamInfo.getStream(), null);
662   - if (jsonObject != null && jsonObject.getInteger("code") == 0) {
  681 + if (jsonObject == null) {
  682 + throw new ControllerException(ErrorCode.ERROR100.getCode(), "连接Assist服务失败");
  683 + }
  684 + if (jsonObject.getInteger("code") == 0) {
663 685 long duration = jsonObject.getLong("data");
664 686  
665 687 if (duration == 0) {
... ...
src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java
... ... @@ -96,7 +96,7 @@ public class StreamProxyServiceImpl implements IStreamProxyService {
96 96 public StreamInfo save(StreamProxyItem param) {
97 97 MediaServerItem mediaInfo;
98 98 if (ObjectUtils.isEmpty(param.getMediaServerId()) || "auto".equals(param.getMediaServerId())){
99   - mediaInfo = mediaServerService.getMediaServerForMinimumLoad();
  99 + mediaInfo = mediaServerService.getMediaServerForMinimumLoad(null);
100 100 }else {
101 101 mediaInfo = mediaServerService.getOne(param.getMediaServerId());
102 102 }
... ...
web_src/src/components/dialog/recordDownload.vue
... ... @@ -6,18 +6,6 @@
6 6 <el-progress :percentage="percentage"></el-progress>
7 7 </el-col>
8 8 <el-col :span="6" >
9   -<!-- <el-dropdown size="mini" title="播放倍速" style="margin-left: 1px;" @command="gbScale">-->
10   -<!-- <el-button-group>-->
11   -<!-- <el-button size="mini" style="width: 100%">-->
12   -<!-- {{scale}}倍速 <i class="el-icon-arrow-down el-icon&#45;&#45;right"></i>-->
13   -<!-- </el-button>-->
14   -<!-- </el-button-group>-->
15   -<!-- <el-dropdown-menu slot="dropdown">-->
16   -<!-- <el-dropdown-item command="1">1倍速</el-dropdown-item>-->
17   -<!-- <el-dropdown-item command="2">2倍速</el-dropdown-item>-->
18   -<!-- <el-dropdown-item command="4">4倍速</el-dropdown-item>-->
19   -<!-- </el-dropdown-menu>-->
20   -<!-- </el-dropdown>-->
21 9 <el-button icon="el-icon-download" v-if="percentage < 100" size="mini" title="点击下载可将以缓存部分下载到本地" @click="download()">停止缓存并下载</el-button>
22 10 </el-col>
23 11 </el-row>
... ... @@ -51,6 +39,7 @@ export default {
51 39 taskId: null,
52 40 getProgressRun: false,
53 41 getProgressForFileRun: false,
  42 + timer: null
54 43  
55 44 };
56 45 },
... ... @@ -66,7 +55,7 @@ export default {
66 55 this.percentage = 0.0;
67 56 this.getProgressTimer()
68 57 },
69   - getProgressTimer(){
  58 + getProgressTimer: function (){
70 59 if (!this.getProgressRun) {
71 60 return;
72 61 }
... ... @@ -93,15 +82,24 @@ export default {
93 82 this.percentage = (parseFloat(res.data.data.progress)*100).toFixed(1);
94 83 }
95 84 if (callback)callback();
  85 + }else {
  86 + this.$message({
  87 + showClose: true,
  88 + message: res.data.msg,
  89 + type: "error",
  90 + });
  91 + this.close();
96 92 }
97 93  
98 94 }).catch((e) =>{
99   -
  95 + console.log(e)
100 96 });
101 97 },
102 98 close: function (){
103   - if (this.streamInfo.progress < 100) {
104   - this.stopDownloadRecord();
  99 + this.stopDownloadRecord();
  100 + if (this.timer !== null) {
  101 + window.clearTimeout(this.timer);
  102 + this.timer = null;
105 103 }
106 104 this.showDialog=false;
107 105 this.getProgressRun = false;
... ...