From f9ab13a14590d310937de7d78a36ee599dce750b Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期二, 13 十月 2020 17:16:38 +0800 Subject: [PATCH] 添加通道音频设置 添加media配置 --- src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java | 152 ++++++++++++++++++++++++++++++ src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java | 1 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java | 7 - web_src/src/components/gb28181/devicePlayer.vue | 13 + pom.xml | 15 +- src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java | 1 web_src/src/components/channelList.vue | 24 ++++ src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java | 17 +++ src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java | 10 + src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceController.java | 6 + src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHTTPProxyController.java | 1 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java | 1 src/main/resources/application.yml | 9 + 13 files changed, 234 insertions(+), 23 deletions(-) diff --git a/pom.xml b/pom.xml index 528f765..31adf4f 100644 --- a/pom.xml +++ b/pom.xml @@ -145,16 +145,19 @@ </dependency> <dependency> - <groupId>org.mitre.dsmiley.httpproxy</groupId> - <artifactId>smiley-http-proxy-servlet</artifactId> - <version>1.7</version> - </dependency> - <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>18.0</version> </dependency> - + + <!-- okhttp --> + <dependency> + <groupId>com.squareup.okhttp3</groupId> + <artifactId>okhttp</artifactId> + <version>4.9.0</version> + </dependency> + + </dependencies> <build> diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java index 55d0a63..00bd995 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java @@ -143,6 +143,11 @@ */ private String ssrc; + /** + * 鏄惁鍚湁闊抽 + */ + private boolean hasAudio; + public String getChannelId() { return channelId; } @@ -371,4 +376,16 @@ public void setSubCount(int subCount) { this.subCount = subCount; } + + public void setPTZTypeText(String PTZTypeText) { + this.PTZTypeText = PTZTypeText; + } + + public boolean isHasAudio() { + return hasAudio; + } + + public void setHasAudio(boolean hasAudio) { + this.hasAudio = hasAudio; + } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java index 481bb43..3cc1376 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java @@ -241,13 +241,6 @@ StreamInfo streamInfo = new StreamInfo(); streamInfo.setSsrc(ssrc); -// String streamId = Integer.toHexString(Integer.parseInt(streamInfo.getSsrc())); -// String streamId = String.format("%08x", Integer.parseInt(streamInfo.getSsrc())).toUpperCase(); // ZLM 瑕佹眰澶у啓涓旈浣嶈ˉ闆� -// streamInfo.setFlv(String.format("http://%s:%s/rtp/%s.flv", mediaInfo.getLocalIP(), mediaInfo.getHttpPort(), streamId)); -// streamInfo.setWS_FLV(String.format("ws://%s:%s/rtp/%s.flv", mediaInfo.getLocalIP(), mediaInfo.getHttpPort(), streamId)); -// streamInfo.setRTMP(String.format("rtmp://%s:%s/rtp/%s", mediaInfo.getLocalIP(), mediaInfo.getRtmpPort(), streamId)); -// streamInfo.setHLS(String.format("http://%s:%s/rtp/%s/hls.m3u8", mediaInfo.getLocalIP(), mediaInfo.getHttpPort(), streamId)); -// streamInfo.setRTSP(String.format("rtsp://%s:%s/rtp/%s", mediaInfo.getLocalIP(), mediaInfo.getRtspPort(), streamId)); streamInfo.setCahnnelId(channelId); streamInfo.setDeviceID(device.getDeviceId()); storager.startPlay(streamInfo); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java index 774cd60..927168f 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java @@ -200,6 +200,7 @@ deviceChannel.setLongitude(itemDevice.element("Longitude") == null? 0.00:Double.parseDouble(XmlUtil.getText(itemDevice,"Longitude"))); deviceChannel.setLatitude(itemDevice.element("Latitude") == null? 0.00:Double.parseDouble(XmlUtil.getText(itemDevice,"Latitude"))); deviceChannel.setPTZType(itemDevice.element("PTZType") == null? 0:Integer.parseInt(XmlUtil.getText(itemDevice,"PTZType"))); + deviceChannel.setHasAudio(false); // 榛樿鍚湁闊抽涓篺alse storager.updateChannel(device.getDeviceId(), deviceChannel); } // 鏇存柊 diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHTTPProxyController.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHTTPProxyController.java index 0275f84..4b2cabd 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHTTPProxyController.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHTTPProxyController.java @@ -2,7 +2,6 @@ import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.storager.IVideoManagerStorager; -import org.apache.http.HttpResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java index 22ebe52..666cc25 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java @@ -14,6 +14,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; @@ -44,7 +45,13 @@ @Autowired private IVideoManagerStorager storager; - + + @Value("${media.ip}") + private String mediaIp; + + @Value("${media.port}") + private int mediaPort; + /** * 娴侀噺缁熻浜嬩欢锛屾挱鏀惧櫒鎴栨帹娴佸櫒鏂紑鏃跺苟涓旇�楃敤娴侀噺瓒呰繃鐗瑰畾闃堝�兼椂浼氳Е鍙戞浜嬩欢锛岄槇鍊奸�氳繃閰嶇疆鏂囦欢general.flowThreshold閰嶇疆锛涙浜嬩欢瀵瑰洖澶嶄笉鏁忔劅銆� * @@ -308,6 +315,7 @@ // List<MediaServerConfig> mediaServerConfigs = JSON.parseArray(JSON.toJSONString(json), MediaServerConfig.class); // MediaServerConfig mediaServerConfig = mediaServerConfigs.get(0); MediaServerConfig mediaServerConfig = JSON.toJavaObject(json, MediaServerConfig.class); + mediaServerConfig.setLocalIP(mediaIp); storager.updateMediaInfo(mediaServerConfig); // TODO Auto-generated method stub diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java new file mode 100644 index 0000000..8dc8e50 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java @@ -0,0 +1,152 @@ +package com.genersoft.iot.vmp.media.zlm; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.genersoft.iot.vmp.conf.MediaServerConfig; +import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import okhttp3.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.CommandLineRunner; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + +@Component +@Order(value=1) +public class ZLMRunner implements CommandLineRunner { + + private final static Logger logger = LoggerFactory.getLogger(ZLMRunner.class); + + @Autowired + private IVideoManagerStorager storager; + + @Value("${media.ip}") + private String mediaIp; + + @Value("${media.port}") + private int mediaPort; + + @Value("${media.secret}") + private String mediaSecret; + + @Value("${sip.ip}") + private String sipIP; + + @Value("${server.port}") + private String serverPort; + + @Override + public void run(String... strings) throws Exception { + // 鑾峰彇zlm淇℃伅 + logger.info("绛夊緟zlm鎺ュ叆..."); + MediaServerConfig mediaServerConfig = getMediaServerConfig(); + if (mediaServerConfig != null) { + logger.info("zlm鎺ュ叆鎴愬姛..."); + storager.updateMediaInfo(mediaServerConfig); + logger.info("璁剧疆zlm..."); + saveZLMConfig(); + + } + } + + + + public MediaServerConfig getMediaServerConfig() { + MediaServerConfig mediaServerConfig = null; + OkHttpClient client = new OkHttpClient(); + String url = String.format("http://%s:%s/index/api/getServerConfig?secret=%s", mediaIp, mediaPort, mediaSecret); + //鍒涘缓涓�涓猂equest + Request request = new Request.Builder() + .get() + .url(url) + .build(); + //閫氳繃client鍙戣捣璇锋眰 + final Call call = client.newCall(request); + //鎵ц鍚屾璇锋眰锛岃幏鍙朢esponse瀵硅薄 + Response response = null; + try { + response = call.execute(); + if (response.isSuccessful()) { + String responseStr = response.body().string(); + if (responseStr != null) { + JSONObject responseJSON = JSON.parseObject(responseStr); + JSONArray data = responseJSON.getJSONArray("data"); + if (data != null && data.size() > 0) { + mediaServerConfig = JSON.parseObject(JSON.toJSONString(data.get(0)), MediaServerConfig.class); + mediaServerConfig.setLocalIP(mediaIp); + } + } + }else { + logger.error("getMediaServerConfig澶辫触, 1s鍚庨噸璇�"); + Thread.sleep(1000); + getMediaServerConfig(); + } + } catch (IOException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + return mediaServerConfig; + } + + private void saveZLMConfig() { + String hookIP = sipIP; + if (mediaIp.equals(sipIP)) { + hookIP = "127.0.0.1"; + } + OkHttpClient client = new OkHttpClient(); + String url = String.format("http://%s:%s/index/api/setServerConfig", mediaIp, mediaPort); + String hookPrex = String.format("http://%s:%s/index/hook", hookIP, serverPort); + + RequestBody body = new FormBody.Builder() + .add("secret",mediaSecret) + .add("hook.enable","1") + .add("hook.on_flow_report","") + .add("hook.on_http_access","") + .add("hook.on_publish",String.format("%s/on_publish", hookPrex)) + .add("hook.on_record_mp4","") + .add("hook.on_record_ts","") + .add("hook.on_rtsp_auth","") + .add("hook.on_rtsp_realm","") + .add("hook.on_server_started",String.format("%s/on_server_started", hookPrex)) + .add("hook.on_shell_login",String.format("%s/on_shell_login", hookPrex)) + .add("hook.on_stream_none_reader",String.format("%s/on_stream_none_reader", hookPrex)) + .add("hook.on_stream_not_found",String.format("%s/on_stream_not_found", hookPrex)) + .add("hook.timeoutSec","20") + .build(); + + Request request = new Request.Builder() + .post(body) + .url(url) + .build(); + client.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(Call call, IOException e) { + logger.error("saveZLMConfig ",e); + } + @Override + public void onResponse(Call call, Response response) throws IOException { + if (response.isSuccessful()) { + String responseStr = response.body().string(); + if (responseStr != null) { + JSONObject responseJSON = JSON.parseObject(responseStr); + if (responseJSON.getInteger("code") == 0) { + logger.info("璁剧疆zlm鎴愬姛"); + }else { + logger.info("璁剧疆zlm澶辫触: " + responseJSON.getString("msg")); + } + } + } + + } + }); + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java index 5ca8b1c..38a6476 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java @@ -344,6 +344,7 @@ */ @Override public boolean stopPlay(StreamInfo streamInfo) { + if (streamInfo == null) return false; return redis.del(String.format("%S_%s_%s_%s", VideoManagerConstants.PLAYER_PREFIX, streamInfo.getSsrc(), streamInfo.getDeviceID(), diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceController.java index fa86ee2..1b4689a 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/device/DeviceController.java @@ -144,4 +144,10 @@ PageResult pageResult = storager.querySubChannels(deviceId, channelId, query, channelType, online, page, count); return new ResponseEntity<>(pageResult,HttpStatus.OK); } + + @PostMapping("channel/update/{deviceId}") + public ResponseEntity<PageResult> updateChannel(@PathVariable String deviceId,DeviceChannel channel){ + storager.updateChannel(deviceId, channel); + return new ResponseEntity<>(null,HttpStatus.OK); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java index 64bcf34..119426a 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java @@ -67,6 +67,7 @@ cmder.streamByeCmd(ssrc); StreamInfo streamInfo = storager.queryPlayBySSRC(ssrc); + if (streamInfo == null) return new ResponseEntity<String>(HttpStatus.PAYMENT_REQUIRED); storager.stopPlay(streamInfo); if (logger.isDebugEnabled()) { logger.debug(String.format("璁惧棰勮鍋滄API璋冪敤锛宻src锛�%s", ssrc)); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index c82e45e..5b5f01e 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -25,7 +25,6 @@ server: port: 18080 sip: -# ip: 10.200.64.63 ip: 192.168.1.20 port: 5060 # 鏍规嵁鍥芥爣6.1.2涓瀹氾紝domain瀹滈噰鐢↖D缁熶竴缂栫爜鐨勫墠鍗佷綅缂栫爜銆傚浗鏍囬檮褰旸涓畾涔夊墠8浣嶄负涓績缂栫爜锛堢敱鐪佺骇銆佸競绾с�佸尯绾с�佸熀灞傜紪鍙风粍鎴愶紝鍙傜収GB/T 2260-2007锛� @@ -38,4 +37,10 @@ auth: #32浣嶅皬鍐檓d5鍔犲瘑锛堥粯璁ゅ瘑鐮佷负admin锛� username: admin - password: 21232f297a57a5a743894a0e4a801fc3 \ No newline at end of file + password: 21232f297a57a5a743894a0e4a801fc3 + +media: #zlm鏈嶅姟鍣ㄧ殑ip涓巋ttp绔彛, 閲嶇偣: 杩欐槸http绔彛 + ip: 192.168.1.20 + port: 9080 + secret: 035c73f7-bb6b-4889-a715-d9eb2d1925cc + diff --git a/web_src/src/components/channelList.vue b/web_src/src/components/channelList.vue index 7a1e0e2..7c667ba 100644 --- a/web_src/src/components/channelList.vue +++ b/web_src/src/components/channelList.vue @@ -31,10 +31,19 @@ <el-table ref="channelListTable" :data="deviceChannelList" :height="winHeight" border style="width: 100%"> <el-table-column prop="channelId" label="閫氶亾缂栧彿" width="210"> </el-table-column> - <el-table-column prop="name" label="閫氶亾鍚嶇О" width="500"> + <el-table-column prop="name" label="閫氶亾鍚嶇О"> </el-table-column> <el-table-column prop="subCount" label="瀛愯妭鐐规暟"> </el-table-column> + <el-table-column label="寮�鍚煶棰�" align="center"> + <template slot-scope="scope"> + <el-switch + @change="updateChannel(scope.row)" + v-model="scope.row.hasAudio" + active-color="#409EFF"> + </el-switch> + </template> + </el-table-column> <el-table-column label="鐘舵��" width="180" align="center"> <template slot-scope="scope"> <div slot="reference" class="name-wrapper"> @@ -193,6 +202,7 @@ }, //閫氱煡璁惧涓婁紶濯掍綋娴� sendDevicePush: function(itemData) { + console.log(itemData) let deviceId = this.deviceId; this.isLoging = true; let channelId = itemData.channelId; @@ -204,7 +214,7 @@ }).then(function(res) { let ssrc = res.data.ssrc; that.isLoging = false - that.$refs.devicePlayer.play(res.data,deviceId,channelId); + that.$refs.devicePlayer.play(res.data,deviceId,channelId,itemData.hasAudio); }).catch(function(e) { }); }, @@ -256,6 +266,16 @@ this.currentPage = 1; this.total = 0; this.initData(); + }, + updateChannel: function(row) { + console.log(row) + this.$axios({ + method: 'post', + url: `/api/channel/update/${this.deviceId}`, + params: row + }).then(function(res) { + console.log(JSON.stringify(res)); + }); } } diff --git a/web_src/src/components/gb28181/devicePlayer.vue b/web_src/src/components/gb28181/devicePlayer.vue index dc69adb..f49e03f 100644 --- a/web_src/src/components/gb28181/devicePlayer.vue +++ b/web_src/src/components/gb28181/devicePlayer.vue @@ -1,7 +1,7 @@ <template> <div id="devicePlayer"> <el-dialog title="瑙嗛鎾斁" top="0" :visible.sync="showVideoDialog" :destroy-on-close="true" @close="stop()"> - <LivePlayer v-if="showVideoDialog" ref="videoPlayer" :videoUrl="videoUrl" :error="videoError" fluent autoplay live stretch></LivePlayer> + <LivePlayer v-if="showVideoDialog" ref="videoPlayer" :videoUrl="videoUrl" :error="videoError" :hasaudio="hasaudio" fluent autoplay live ></LivePlayer> <div id="shared" style="text-align: right; margin-top: 1rem;"> <el-tabs v-model="tabActiveName"> <el-tab-pane label="濯掍綋娴佷俊鎭�" name="media"> @@ -114,17 +114,22 @@ ssrc: '', deviceId: '', channelId: '', - tabActiveName: 'media' + tabActiveName: 'media', + hasaudio: false }; }, methods: { - play: function(streamInfo, deviceId, channelId) { + play: function(streamInfo, deviceId, channelId, hasAudio) { + console.log(hasAudio); + this.hasaudio = hasAudio; this.ssrc = streamInfo.ssrc; this.deviceId = deviceId; this.channelId = channelId; - this.videoUrl = streamInfo.flv + "?" + new Date().getTime(); + // this.$refs.videoPlayer.hasaudio = hasAudio; + // this.videoUrl = streamInfo.flv + "?" + new Date().getTime(); + this.videoUrl = streamInfo.ws_flv; this.showVideoDialog = true; console.log(this.ssrc); }, -- Gitblit v1.8.0