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