From bd570d167be9671f46ec27568b2a591713897323 Mon Sep 17 00:00:00 2001
From: panlinlin <648540858@qq.com>
Date: 星期五, 07 五月 2021 17:24:49 +0800
Subject: [PATCH] 优化直播流点播流程, 添加流代理接口添加直接关联国标功能
---
web_src/src/components/dialog/platformEdit.vue | 3 -
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java | 60 ++++++++++---------
web_src/src/components/StreamProxyList.vue | 17 +++--
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/StreamProxyItem.java | 8 ++
web_src/src/components/ParentPlatformList.vue | 2
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java | 4 -
src/main/java/com/genersoft/iot/vmp/vmanager/streamProxy/StreamProxyController.java | 11 ++-
web_src/src/components/dialog/StreamProxyEdit.vue | 49 ++++++++++++++++
src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java | 20 ++++++
9 files changed, 127 insertions(+), 47 deletions(-)
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java
index f2a2dec..a6f0ae7 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java
@@ -92,10 +92,18 @@
DeviceChannel channel = storager.queryChannelInParentPlatform(requesterId, channelId);
GbStream gbStream = storager.queryStreamInParentPlatform(requesterId, channelId);
// 涓嶆槸閫氶亾鍙兘鏄洿鎾祦
- if (channel != null || gbStream != null ) {
+ if (channel != null && gbStream == null ) {
if (channel.getStatus() == 0) {
logger.info("閫氶亾绂荤嚎锛岃繑鍥�400");
responseAck(evt, Response.BAD_REQUEST, "channel [" + channel.getChannelId() + "] offline");
+ return;
+ }
+ responseAck(evt, Response.CALL_IS_BEING_FORWARDED); // 閫氶亾瀛樺湪锛屽彂181锛屽懠鍙浆鎺ヤ腑
+ }else if(channel == null && gbStream != null){
+ Boolean streamReady = zlmrtpServerFactory.isStreamReady(gbStream.getApp(), gbStream.getStream());
+ if (!streamReady) {
+ logger.info("[ app={}, stream={} ]閫氶亾绂荤嚎锛岃繑鍥�400",gbStream.getApp(), gbStream.getStream());
+ responseAck(evt, Response.BAD_REQUEST, "channel [" + gbStream.getGbId() + "] offline");
return;
}
responseAck(evt, Response.CALL_IS_BEING_FORWARDED); // 閫氶亾瀛樺湪锛屽彂181锛屽懠鍙浆鎺ヤ腑
@@ -240,34 +248,30 @@
// 鍐欏叆redis锛� 瓒呮椂鏃跺洖澶�
redisCatchStorage.updateSendRTPSever(sendRtpItem);
- // 妫�娴嬬洿鎾祦鏄惁鍦ㄧ嚎
- Boolean streamReady = zlmrtpServerFactory.isStreamReady(gbStream.getApp(), gbStream.getStream());
- if (streamReady) {
- sendRtpItem.setStatus(1);
- redisCatchStorage.updateSendRTPSever(sendRtpItem);
- // TODO 娣诲姞瀵箃cp鐨勬敮鎸�
- ZLMServerConfig mediaInfo = redisCatchStorage.getMediaInfo();
- StringBuffer content = new StringBuffer(200);
- content.append("v=0\r\n");
- content.append("o="+"00000"+" 0 0 IN IP4 "+mediaInfo.getWanIp()+"\r\n");
- content.append("s=Play\r\n");
- content.append("c=IN IP4 "+mediaInfo.getWanIp()+"\r\n");
- content.append("t=0 0\r\n");
- content.append("m=video "+ sendRtpItem.getLocalPort()+" RTP/AVP 96\r\n");
- content.append("a=sendonly\r\n");
- content.append("a=rtpmap:96 PS/90000\r\n");
- content.append("y="+ ssrc + "\r\n");
- content.append("f=\r\n");
+ sendRtpItem.setStatus(1);
+ redisCatchStorage.updateSendRTPSever(sendRtpItem);
+ // TODO 娣诲姞瀵箃cp鐨勬敮鎸�
+ ZLMServerConfig mediaInfo = redisCatchStorage.getMediaInfo();
+ StringBuffer content = new StringBuffer(200);
+ content.append("v=0\r\n");
+ content.append("o="+"00000"+" 0 0 IN IP4 "+mediaInfo.getWanIp()+"\r\n");
+ content.append("s=Play\r\n");
+ content.append("c=IN IP4 "+mediaInfo.getWanIp()+"\r\n");
+ content.append("t=0 0\r\n");
+ content.append("m=video "+ sendRtpItem.getLocalPort()+" RTP/AVP 96\r\n");
+ content.append("a=sendonly\r\n");
+ content.append("a=rtpmap:96 PS/90000\r\n");
+ content.append("y="+ ssrc + "\r\n");
+ content.append("f=\r\n");
- try {
- responseAck(evt, content.toString());
- } catch (SipException e) {
- e.printStackTrace();
- } catch (InvalidArgumentException e) {
- e.printStackTrace();
- } catch (ParseException e) {
- e.printStackTrace();
- }
+ try {
+ responseAck(evt, content.toString());
+ } catch (SipException e) {
+ e.printStackTrace();
+ } catch (InvalidArgumentException e) {
+ e.printStackTrace();
+ } catch (ParseException e) {
+ e.printStackTrace();
}
}
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/StreamProxyItem.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/StreamProxyItem.java
index f04e756..3f997a6 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/StreamProxyItem.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/StreamProxyItem.java
@@ -16,6 +16,7 @@
private boolean enable;
private boolean enable_hls;
private boolean enable_mp4;
+ private String platformGbId;
public String getType() {
return type;
@@ -114,4 +115,11 @@
}
+ public String getPlatformGbId() {
+ return platformGbId;
+ }
+
+ public void setPlatformGbId(String platformGbId) {
+ this.platformGbId = platformGbId;
+ }
}
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java
index ab23a11..b2626e3 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java
@@ -59,11 +59,7 @@
JSONArray tracks = mediaJSON.getJSONArray("tracks");
streamInfo = getStreamInfoByAppAndStream(app, stream, tracks);
}
-
}
return streamInfo;
}
-
-
-
}
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java
index b27970a..a77371f 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java
@@ -1,9 +1,11 @@
package com.genersoft.iot.vmp.service.impl;
import com.alibaba.fastjson.JSONObject;
+import com.genersoft.iot.vmp.gb28181.bean.GbStream;
import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig;
import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
+import com.genersoft.iot.vmp.service.IGbStreamService;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
import com.genersoft.iot.vmp.storager.dao.GbStreamMapper;
@@ -13,6 +15,9 @@
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
/**
* 瑙嗛浠g悊涓氬姟
@@ -38,6 +43,9 @@
@Autowired
private PlatformGbStreamMapper platformGbStreamMapper;
+ @Autowired
+ private IGbStreamService gbStreamService;
+
@Override
public String save(StreamProxyItem param) {
@@ -46,6 +54,7 @@
param.getStream() );
param.setDst_url(dstUrl);
StringBuffer result = new StringBuffer();
+ boolean streamLive = false;
// 鏇存柊
if (videoManagerStorager.queryStreamProxy(param.getApp(), param.getStream()) != null) {
if (videoManagerStorager.updateStreamProxy(param)) {
@@ -62,9 +71,11 @@
}else { // 鏂板
if (videoManagerStorager.addStreamProxy(param)){
result.append("淇濆瓨鎴愬姛");
+ streamLive = true;
if (param.isEnable()) {
JSONObject jsonObject = addStreamProxyToZlm(param);
if (jsonObject == null) {
+ streamLive = false;
result.append(", 浣嗘槸鍚敤澶辫触锛岃妫�鏌ユ祦鍦板潃鏄惁鍙敤");
param.setEnable(false);
videoManagerStorager.updateStreamProxy(param);
@@ -73,6 +84,15 @@
}
}
+ if (param.getPlatformGbId() != null && streamLive) {
+ List<GbStream> gbStreams = new ArrayList<>();
+ gbStreams.add(param);
+ if (gbStreamService.addPlatformInfo(gbStreams, param.getPlatformGbId())){
+ result.append(", 鍏宠仈鍥芥爣骞冲彴[ " + param.getPlatformGbId() + " ]鎴愬姛");
+ }else {
+ result.append(", 鍏宠仈鍥芥爣骞冲彴[ " + param.getPlatformGbId() + " ]澶辫触");
+ }
+ }
return result.toString();
}
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/streamProxy/StreamProxyController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/streamProxy/StreamProxyController.java
index 62f732e..2baa999 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/streamProxy/StreamProxyController.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/streamProxy/StreamProxyController.java
@@ -75,10 +75,15 @@
@ResponseBody
public WVPResult del(String app, String stream){
logger.info("绉婚櫎浠g悊锛� " + app + "/" + stream);
- streamProxyService.del(app, stream);
WVPResult<Object> result = new WVPResult<>();
- result.setCode(0);
- result.setMsg("success");
+ if (app == null || stream == null) {
+ result.setCode(400);
+ result.setMsg(app == null ?"app涓嶈兘涓簄ull":"stream涓嶈兘涓簄ull");
+ }else {
+ streamProxyService.del(app, stream);
+ result.setCode(0);
+ result.setMsg("success");
+ }
return result;
}
diff --git a/web_src/src/components/ParentPlatformList.vue b/web_src/src/components/ParentPlatformList.vue
index c4e6b0a..ecc174a 100644
--- a/web_src/src/components/ParentPlatformList.vue
+++ b/web_src/src/components/ParentPlatformList.vue
@@ -156,7 +156,7 @@
this.$axios({
method: 'get',
- url:`/api/platform/query/${that.count}/${that.currentPage}`
+ url:`/api/platform/query/${that.count}/${that.currentPage}`
}).then(function (res) {
that.total = res.data.total;
that.platformList = res.data.list;
diff --git a/web_src/src/components/StreamProxyList.vue b/web_src/src/components/StreamProxyList.vue
index d71de84..72b878f 100644
--- a/web_src/src/components/StreamProxyList.vue
+++ b/web_src/src/components/StreamProxyList.vue
@@ -33,6 +33,14 @@
</template>
</el-table-column>
<el-table-column prop="gbId" label="鍥芥爣缂栫爜" width="180" align="center" show-overflow-tooltip/>
+ <el-table-column label="鍚敤" width="120" align="center">
+ <template slot-scope="scope">
+ <div slot="reference" class="name-wrapper">
+ <el-tag size="medium" v-if="scope.row.enable">宸插惎鐢�</el-tag>
+ <el-tag size="medium" type="info" v-if="!scope.row.enable">鏈惎鐢�</el-tag>
+ </div>
+ </template>
+ </el-table-column>
<el-table-column label="杞琀LS" width="120" align="center">
<template slot-scope="scope">
<div slot="reference" class="name-wrapper">
@@ -49,14 +57,7 @@
</div>
</template>
</el-table-column>
- <el-table-column label="鍚敤" width="120" align="center">
- <template slot-scope="scope">
- <div slot="reference" class="name-wrapper">
- <el-tag size="medium" v-if="scope.row.enable">宸插惎鐢�</el-tag>
- <el-tag size="medium" type="info" v-if="!scope.row.enable">鏈惎鐢�</el-tag>
- </div>
- </template>
- </el-table-column>
+
<el-table-column label="鎿嶄綔" width="360" align="center" fixed="right">
<template slot-scope="scope">
diff --git a/web_src/src/components/dialog/StreamProxyEdit.vue b/web_src/src/components/dialog/StreamProxyEdit.vue
index 1c0d3b9..afc03cc 100644
--- a/web_src/src/components/dialog/StreamProxyEdit.vue
+++ b/web_src/src/components/dialog/StreamProxyEdit.vue
@@ -56,6 +56,22 @@
<el-option label="缁勬挱" value="2"></el-option>
</el-select>
</el-form-item>
+ <el-form-item label="鍥芥爣骞冲彴">
+ <el-select
+ v-model="proxyParam.platformGbId"
+ style="width: 100%"
+ placeholder="璇烽�夋嫨鍥芥爣骞冲彴"
+ >
+ <el-option
+ v-for="item in platformList"
+ :key="item.name"
+ :label="item.name"
+ :value="item.serverGBId">
+ <span style="float: left">{{ item.name }}</span>
+ <span style="float: right; color: #8492a6; font-size: 13px">{{ item.serverGBId }}</span>
+ </el-option>
+ </el-select>
+ </el-form-item>
<el-form-item label="鍏朵粬閫夐」">
<div style="float: left;">
<el-checkbox label="鍚敤" v-model="proxyParam.enable" ></el-checkbox>
@@ -106,6 +122,27 @@
isLoging: false,
dialogLoading: false,
onSubmit_text: "绔嬪嵆鍒涘缓",
+ platformList: [{
+ id: 1,
+ enable: true,
+ name: "141",
+ serverGBId: "34020000002000000001",
+ serverGBDomain: "3402000000",
+ serverIP: "192.168.1.141",
+ serverPort: 15060,
+ deviceGBId: "34020000002000000001",
+ deviceIp: "192.168.1.20",
+ devicePort: "5060",
+ username: "34020000002000000001",
+ password: "12345678",
+ expires: "300",
+ keepTimeout: "60",
+ transport: "UDP",
+ characterSet: "GB2312",
+ ptz: false,
+ rtcp: false,
+ status: true,
+ }],
proxyParam: {
name: null,
type: "default",
@@ -120,6 +157,7 @@
enable: true,
enable_hls: true,
enable_mp4: false,
+ platformGbId: null,
},
rules: {
@@ -140,6 +178,17 @@
if (proxyParam != null) {
this.proxyParam = proxyParam;
}
+
+ let that = this;
+
+ this.$axios({
+ method: 'get',
+ url:`/api/platform/query/10000/0`
+ }).then(function (res) {
+ that.platformList = res.data.list;
+ }).catch(function (error) {
+ console.log(error);
+ });
},
onSubmit: function () {
console.log("onSubmit");
diff --git a/web_src/src/components/dialog/platformEdit.vue b/web_src/src/components/dialog/platformEdit.vue
index 081603e..968e825 100644
--- a/web_src/src/components/dialog/platformEdit.vue
+++ b/web_src/src/components/dialog/platformEdit.vue
@@ -105,9 +105,6 @@
callback(new Error("璇疯緭鍏ヨ澶囧浗鏍囩紪鍙�"));
} else {
var exit = await this.deviceGBIdExit(value);
- console.log(exit);
- console.log(exit == "true");
- console.log(exit === "true");
if (exit) {
callback(new Error("璁惧鍥芥爣缂栧彿宸插瓨鍦�"));
} else {
--
Gitblit v1.8.0