From 36cd31d69d451072e00ff1dd1928a61753aa5a97 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期一, 19 十月 2020 14:25:41 +0800 Subject: [PATCH] 修复ui开启音频无法播放的bug 修复可能导致录象查看的bug 修复开启openRTPServer时的bug --- src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java | 2 src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java | 17 ++++++-- web_src/src/components/channelList.vue | 13 ++++-- src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java | 2 src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java | 2 - src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java | 9 ++++ src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMUtils.java | 2 web_src/src/components/gb28181/devicePlayer.vue | 26 +++++------- README.md | 37 +++++++++--------- 9 files changed, 62 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index 97ad0f1..69f77eb 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # wvp WEB VIDEO PLATFORM鏄竴涓熀浜嶨B28181-2016鏍囧噯瀹炵幇鐨勭綉缁滆棰戝钩鍙帮紝璐熻矗瀹炵幇鏍稿績淇′护涓庤澶囩鐞嗗悗鍙伴儴鍒嗭紝鏀寔NAT绌块�忥紝鏀寔娴峰悍銆佸ぇ鍗庛�佸畤瑙嗙瓑鍝佺墝鐨処PC銆丯VR銆丏VR鎺ュ叆銆� -娴佸獟浣撴湇鍔″熀浜嶼LMediaKit-https://github.com/xiongziliang/ZLMediaKit +娴佸獟浣撴湇鍔″熀浜嶼LMediaKit-https://github.com/xiongziliang/ZLMediaKit 鍓嶆椤甸潰鍩轰簬MediaServerUI杩涜淇敼. # 搴旂敤鍦烘櫙锛� @@ -16,24 +16,25 @@  # 鍘熺増鐗规�э細 -1. 瑙嗛棰勮 -2. 浜戝彴鎺у埗锛堟柟鍚戙�佺缉鏀炬帶鍒讹級 -3. 瑙嗛璁惧淇℃伅鍚屾 -4. 绂诲湪绾跨洃鎺� -5. 褰曞儚鏌ヨ涓庡洖鏀撅紙鍩轰簬NVR\DVR锛屾殏涓嶆敮鎸佸揩杩涖�乻eek鎿嶄綔锛� -6. 鏃犱汉瑙傜湅鑷姩鏂祦 +1. 瑙嗛棰勮; +2. 浜戝彴鎺у埗锛堟柟鍚戙�佺缉鏀炬帶鍒讹級; +3. 瑙嗛璁惧淇℃伅鍚屾; +4. 绂诲湪绾跨洃鎺�; +5. 褰曞儚鏌ヨ涓庡洖鏀撅紙鍩轰簬NVR\DVR锛屾殏涓嶆敮鎸佸揩杩涖�乻eek鎿嶄綔锛�; +6. 鏃犱汉瑙傜湅鑷姩鏂祦; +7. 鏀寔UDP鍜孴CP涓ょ鍥芥爣淇′护浼犺緭妯″紡; - -# 鏂版敮鎸佺壒鎬� -1. 闆嗘垚web鐣岄潰, 涓嶉渶瑕佸崟鐙儴缃插墠绔湇鍔�, 鐩存帴鍒╃敤wvp鍐呯疆鏂囦欢鏈嶅姟閮ㄧ讲. -2. 鏀寔骞冲彴鎺ュ叆, 閽堝澶у钩鍙板ぇ閲忚澶囩殑鎯呭喌杩涜浼樺寲. -3. 鏀寔妫�绱�,閫氶亾绛涢��. -4. 鏀寔鑷姩閰嶇疆ZLM濯掍綋鏈嶅姟, 鍑忓皯鍥犻厤缃棶棰樻墍鍑虹幇鐨勯棶棰�. -5. 鏀寔鍚敤udp澶氱鍙fā寮�, 鎻愰珮udp妯″紡涓嬪獟浣撲紶杈撴�ц兘. -6. 鏀寔閫氶亾鏄惁鍚湁闊抽鐨勮缃� -7. 鏀寔閫氶亾瀛愮洰褰曟煡璇� -8. 鏀寔udp/tcp,涓ょ妯″紡浼犺緭瑙嗛娴� - +# 鏂版敮鎸佺壒鎬� +1. 闆嗘垚web鐣岄潰, 涓嶉渶瑕佸崟鐙儴缃插墠绔湇鍔�, 鐩存帴鍒╃敤wvp鍐呯疆鏂囦欢鏈嶅姟閮ㄧ讲, 闅弚vp涓�璧烽儴缃�; +2. 鏀寔骞冲彴鎺ュ叆, 閽堝澶у钩鍙板ぇ閲忚澶囩殑鎯呭喌杩涜浼樺寲; +3. 鏀寔妫�绱�,閫氶亾绛涢��; +4. 鏀寔鑷姩閰嶇疆ZLM濯掍綋鏈嶅姟, 鍑忓皯鍥犻厤缃棶棰樻墍鍑虹幇鐨勯棶棰�; +5. 鏀寔鍚敤udp澶氱鍙fā寮�, 鎻愰珮udp妯″紡涓嬪獟浣撲紶杈撴�ц兘; +6. 鏀寔閫氶亾鏄惁鍚湁闊抽鐨勮缃�; +7. 鏀寔閫氶亾瀛愮洰褰曟煡璇�; +8. 鏀寔udp/tcp鍥芥爣娴佷紶杈撴ā寮�; +9. 鏀寔鐩存帴杈撳嚭RTSP銆丷TMP銆丠TTP-FLV銆乄ebsocket-FLV銆丠LS澶氱鍗忚娴佸湴鍧� +10. # 寰呭疄鐜帮細 涓婄骇绾ц仈 鎺ㄦ祦鍒楄〃 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 9af409f..e2c11cb 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 @@ -538,7 +538,7 @@ recordInfoXml.append("<DeviceID>" + channelId + "</DeviceID>\r\n"); recordInfoXml.append("<StartTime>" + DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(startTime) + "</StartTime>\r\n"); recordInfoXml.append("<EndTime>" + DateUtil.yyyy_MM_dd_HH_mm_ssToISO8601(endTime) + "</EndTime>\r\n"); - recordInfoXml.append("<Secrecy>0</Secrecy>\\r\n"); + recordInfoXml.append("<Secrecy>0</Secrecy>\r\n"); // 澶у崕NVR瑕佹眰蹇呴』澧炲姞涓�涓�间负all鐨勬枃鏈厓绱犺妭鐐筎ype recordInfoXml.append("<Type>all</Type>\r\n"); recordInfoXml.append("</Query>\r\n"); 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 4c9f6fd..96b4af2 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 @@ -140,8 +140,6 @@ 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)); - - storager.startPlay(streamInfo); } diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java index 775cb0f..86f05da 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java @@ -74,6 +74,15 @@ return sendPost("getMediaList",param); } + public JSONObject getMediaInfo(String app, String schema, String stream){ + Map<String, Object> param = new HashMap<>(); + param.put("app",app); + param.put("schema",schema); + param.put("stream",stream); + param.put("vhost","__defaultVhost__"); + return sendPost("getMediaInfo",param); + } + public JSONObject getRtpInfo(String stream_id){ Map<String, Object> param = new HashMap<>(); param.put("stream_id",stream_id); diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMUtils.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMUtils.java index 93e6a24..f88d59c 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMUtils.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMUtils.java @@ -37,7 +37,7 @@ System.out.println(jsonObject.toJSONString()); return newPort; }else { - return getNewRTPPort(streamId); + return getNewRTPPort(ssrc); } } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java index 99f19ee..1e68095 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/jdbc/VideoManagerJdbcStoragerImpl.java @@ -165,7 +165,7 @@ @Override public void updateCatch() { - + System.out.println("##################"); } @Override 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 ad0ff0c..3827fc7 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 @@ -64,18 +64,25 @@ while (lockFlag) { try { - if (System.currentTimeMillis() - startTime > 15 * 1000) { storager.stopPlay(streamInfo); return new ResponseEntity<String>("timeout",HttpStatus.OK); }else { + streamInfo = storager.queryPlayByDevice(deviceId, channelId); JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(streamId); - if (rtpInfo == null || !rtpInfo.getBoolean("exist") || storager.queryPlayByDevice(deviceId, channelId).getFlv() == null){ + if (rtpInfo != null && rtpInfo.getBoolean("exist") && streamInfo.getFlv() != null){ + JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo("rtp", "rtmp", streamId); + if (mediaInfo.getInteger("code") == 0 && mediaInfo.getBoolean("online")) { + lockFlag = false; + JSONArray tracks = mediaInfo.getJSONArray("tracks"); + streamInfo.setTracks(tracks); + storager.startPlay(streamInfo); + }else { + + } + }else { Thread.sleep(2000); continue; - }else { - lockFlag = false; - streamInfo = storager.queryPlay(streamInfo); }; } } catch (InterruptedException e) { diff --git a/web_src/src/components/channelList.vue b/web_src/src/components/channelList.vue index b3980c3..8e6638a 100644 --- a/web_src/src/components/channelList.vue +++ b/web_src/src/components/channelList.vue @@ -54,12 +54,15 @@ </el-table-column> <el-table-column prop="ptztypeText" label="浜戝彴绫诲瀷"> </el-table-column> - <el-table-column label="鎿嶄綔" width="240" align="center" fixed="right"> + <el-table-column label="鎿嶄綔" width="280" align="center" fixed="right"> <template slot-scope="scope"> - <el-button size="mini" icon="el-icon-video-play" v-if="scope.row.parental == 0" @click="sendDevicePush(scope.row)">鎾斁</el-button> - <el-button size="mini" icon="el-icon-switch-button" type="danger" v-if="scope.row.play" @click="stopDevicePush(scope.row)">鍋滄</el-button> - <el-button size="mini" icon="el-icon-s-open" type="primary" v-if="scope.row.parental == 1" @click="changeSubchannel(scope.row)">鏌ョ湅瀛愮洰褰�</el-button> - <!-- <el-button size="mini" @click="sendDevicePush(scope.row)">褰曞儚鏌ヨ</el-button> --> + <el-button-group> + <el-button size="mini" icon="el-icon-video-play" v-if="scope.row.parental == 0" @click="sendDevicePush(scope.row)">鎾斁</el-button> + <el-button size="mini" icon="el-icon-switch-button" type="danger" v-if="scope.row.play" @click="stopDevicePush(scope.row)">鍋滄</el-button> + <el-button size="mini" icon="el-icon-s-open" type="primary" v-if="scope.row.parental == 1" @click="changeSubchannel(scope.row)">鏌ョ湅</el-button> +<!-- <el-button size="mini" icon="el-icon-video-camera" type="primary" >璁惧褰曡薄</el-button>--> + <!-- <el-button size="mini" @click="sendDevicePush(scope.row)">褰曞儚鏌ヨ</el-button> --> + </el-button-group> </template> </el-table-column> </el-table> diff --git a/web_src/src/components/gb28181/devicePlayer.vue b/web_src/src/components/gb28181/devicePlayer.vue index 2f2cfc0..18a8d51 100644 --- a/web_src/src/components/gb28181/devicePlayer.vue +++ b/web_src/src/components/gb28181/devicePlayer.vue @@ -1,8 +1,7 @@ <template> <div id="devicePlayer"> <el-dialog title="瑙嗛鎾斁" top="0" :visible.sync="showVideoDialog" :destroy-on-close="true" @close="close()"> - <LivePlayer v-if="showVideoDialog && hasaudio" ref="videoPlayer" :videoUrl="videoUrl" :error="videoError" hasaudio fluent autoplay live ></LivePlayer> - <LivePlayer v-if="showVideoDialog && !hasaudio" ref="videoPlayer" :videoUrl="videoUrl" :error="videoError" fluent autoplay live ></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"> @@ -123,20 +122,17 @@ methods: { play: function(streamInfo, deviceId, channelId, hasAudio) { - // this.hasaudio = hasAudio; - if (!hasAudio) { // hasaudio == false鏃惰缃挱鏀惧櫒hasaudio false, 鍚﹀垯涓嶈缃� - this.hasaudio = hasAudio; - } + this.hasaudio = hasAudio; // 鏍规嵁濯掍綋娴佷俊鎭簩娆″垽鏂� - // if( this.hasaudio && !!streamInfo.tracks && streamInfo.tracks.length > 0) { - // var realHasAudio = false; - // for (let i = 0; i < streamInfo.tracks; i++) { - // if (streamInfo.tracks[i].codec_type == 1) { // 鍒ゆ柇涓洪煶棰� - // realHasAudio = true; - // } - // } - // this.hasaudio = realHasAudio && this.hasaudio; - // } + if( this.hasaudio && !!streamInfo.tracks && streamInfo.tracks.length > 0) { + var realHasAudio = false; + for (let i = 0; i < streamInfo.tracks; i++) { + if (streamInfo.tracks[i].codec_type == 1) { // 鍒ゆ柇涓洪煶棰� + realHasAudio = true; + } + } + this.hasaudio = realHasAudio && this.hasaudio; + } this.ssrc = streamInfo.ssrc; this.deviceId = deviceId; this.channelId = channelId; -- Gitblit v1.8.0