Commit f68cfd8de2cf6e516e220d1a706cecabb2b185aa
1 parent
366d57b2
优化播放程序,缩短播放加载时间
Showing
3 changed files
with
53 additions
and
42 deletions
src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java
| @@ -39,7 +39,8 @@ public class PlayController { | @@ -39,7 +39,8 @@ public class PlayController { | ||
| 39 | private ZLMRESTfulUtils zlmresTfulUtils; | 39 | private ZLMRESTfulUtils zlmresTfulUtils; |
| 40 | 40 | ||
| 41 | @GetMapping("/play/{deviceId}/{channelId}") | 41 | @GetMapping("/play/{deviceId}/{channelId}") |
| 42 | - public ResponseEntity<String> play(@PathVariable String deviceId, @PathVariable String channelId) { | 42 | + public ResponseEntity<String> play(@PathVariable String deviceId, @PathVariable String channelId, |
| 43 | + Integer getEncoding) { | ||
| 43 | 44 | ||
| 44 | Device device = storager.queryVideoDevice(deviceId); | 45 | Device device = storager.queryVideoDevice(deviceId); |
| 45 | StreamInfo streamInfo = storager.queryPlayByDevice(deviceId, channelId); | 46 | StreamInfo streamInfo = storager.queryPlayByDevice(deviceId, channelId); |
| @@ -64,40 +65,49 @@ public class PlayController { | @@ -64,40 +65,49 @@ public class PlayController { | ||
| 64 | long startTime = System.currentTimeMillis(); | 65 | long startTime = System.currentTimeMillis(); |
| 65 | JSONObject rtpInfo = null; | 66 | JSONObject rtpInfo = null; |
| 66 | 67 | ||
| 67 | - while (lockFlag) { | ||
| 68 | - try { | ||
| 69 | - if (System.currentTimeMillis() - startTime > 60 * 1000) { | ||
| 70 | - storager.stopPlay(streamInfo); | ||
| 71 | - logger.info("播放等待超时"); | ||
| 72 | - return new ResponseEntity<String>("timeout", HttpStatus.OK); | ||
| 73 | - } else { | ||
| 74 | - streamInfo = storager.queryPlayByDevice(deviceId, channelId); | ||
| 75 | - if (!rtpPushed) { | ||
| 76 | - logger.info("查询RTP推流信息..."); | ||
| 77 | - rtpInfo = zlmresTfulUtils.getRtpInfo(streamId); | ||
| 78 | - } | ||
| 79 | - if (rtpInfo != null && rtpInfo.getBoolean("exist") && streamInfo != null && streamInfo.getFlv() != null) { | ||
| 80 | - logger.info("查询流编码信息:" + streamInfo.getFlv()); | ||
| 81 | - rtpPushed = true; | ||
| 82 | - Thread.sleep(2000); | ||
| 83 | - JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo("rtp", "rtmp", streamId); | ||
| 84 | - if (mediaInfo.getInteger("code") == 0 && mediaInfo.getBoolean("online")) { | ||
| 85 | - lockFlag = false; | ||
| 86 | - logger.info("流编码信息已获取"); | ||
| 87 | - JSONArray tracks = mediaInfo.getJSONArray("tracks"); | ||
| 88 | - streamInfo.setTracks(tracks); | ||
| 89 | - storager.startPlay(streamInfo); | 68 | + if (getEncoding == 1) { |
| 69 | + while (lockFlag) { | ||
| 70 | + try { | ||
| 71 | + if (System.currentTimeMillis() - startTime > 60 * 1000) { | ||
| 72 | + storager.stopPlay(streamInfo); | ||
| 73 | + logger.info("播放等待超时"); | ||
| 74 | + return new ResponseEntity<String>("timeout", HttpStatus.OK); | ||
| 75 | + } else { | ||
| 76 | + streamInfo = storager.queryPlayByDevice(deviceId, channelId); | ||
| 77 | + if (!rtpPushed) { | ||
| 78 | + logger.info("查询RTP推流信息..."); | ||
| 79 | + rtpInfo = zlmresTfulUtils.getRtpInfo(streamId); | ||
| 80 | + } | ||
| 81 | + if (rtpInfo != null && rtpInfo.getBoolean("exist") && streamInfo != null | ||
| 82 | + && streamInfo.getFlv() != null) { | ||
| 83 | + logger.info("查询流编码信息:" + streamInfo.getFlv()); | ||
| 84 | + rtpPushed = true; | ||
| 85 | + Thread.sleep(2000); | ||
| 86 | + JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo("rtp", "rtmp", streamId); | ||
| 87 | + if (mediaInfo.getInteger("code") == 0 && mediaInfo.getBoolean("online")) { | ||
| 88 | + lockFlag = false; | ||
| 89 | + logger.info("流编码信息已获取"); | ||
| 90 | + JSONArray tracks = mediaInfo.getJSONArray("tracks"); | ||
| 91 | + streamInfo.setTracks(tracks); | ||
| 92 | + storager.startPlay(streamInfo); | ||
| 93 | + } else { | ||
| 94 | + logger.info("流编码信息未获取,2秒后重试..."); | ||
| 95 | + } | ||
| 90 | } else { | 96 | } else { |
| 91 | - logger.info("流编码信息未获取,2秒后重试..."); | 97 | + Thread.sleep(2000); |
| 98 | + continue; | ||
| 92 | } | 99 | } |
| 93 | - } else { | ||
| 94 | - Thread.sleep(2000); | ||
| 95 | - continue; | ||
| 96 | } | 100 | } |
| 101 | + } catch (InterruptedException e) { | ||
| 102 | + e.printStackTrace(); | ||
| 97 | } | 103 | } |
| 98 | - } catch (InterruptedException e) { | ||
| 99 | - e.printStackTrace(); | ||
| 100 | } | 104 | } |
| 105 | + } else { | ||
| 106 | + String flv = storager.getMediaInfo().getLocalIP() + ":" + storager.getMediaInfo().getHttpPort() + "/rtp/" | ||
| 107 | + + streamId + ".flv"; | ||
| 108 | + streamInfo.setFlv("http://" + flv); | ||
| 109 | + streamInfo.setWs_flv("ws://" + flv); | ||
| 110 | + storager.startPlay(streamInfo); | ||
| 101 | } | 111 | } |
| 102 | 112 | ||
| 103 | if (logger.isDebugEnabled()) { | 113 | if (logger.isDebugEnabled()) { |
web_src/src/components/channelList.vue
| @@ -58,8 +58,8 @@ | @@ -58,8 +58,8 @@ | ||
| 58 | <el-button size="mini" icon="el-icon-video-play" @click="sendDevicePush(scope.row)">播放</el-button> | 58 | <el-button size="mini" icon="el-icon-video-play" @click="sendDevicePush(scope.row)">播放</el-button> |
| 59 | <el-button size="mini" icon="el-icon-switch-button" type="danger" v-if="scope.row.play" @click="stopDevicePush(scope.row)">停止</el-button> | 59 | <el-button size="mini" icon="el-icon-switch-button" type="danger" v-if="scope.row.play" @click="stopDevicePush(scope.row)">停止</el-button> |
| 60 | <el-button size="mini" icon="el-icon-s-open" type="primary" v-if="scope.row.parental == 1" @click="changeSubchannel(scope.row)">查看</el-button> | 60 | <el-button size="mini" icon="el-icon-s-open" type="primary" v-if="scope.row.parental == 1" @click="changeSubchannel(scope.row)">查看</el-button> |
| 61 | - <el-button size="mini" icon="el-icon-video-camera" type="primary" @click="queryRecords(scope.row)">设备录象</el-button> | ||
| 62 | -<!-- <el-button size="mini" @click="sendDevicePush(scope.row)">录像查询</el-button> --> | 61 | + <el-button size="mini" icon="el-icon-video-camera" type="primary" @click="queryRecords(scope.row)">设备录象</el-button> |
| 62 | + <!-- <el-button size="mini" @click="sendDevicePush(scope.row)">录像查询</el-button> --> | ||
| 63 | </el-button-group> | 63 | </el-button-group> |
| 64 | </template> | 64 | </template> |
| 65 | </el-table-column> | 65 | </el-table-column> |
| @@ -197,20 +197,21 @@ export default { | @@ -197,20 +197,21 @@ export default { | ||
| 197 | let deviceId = this.deviceId; | 197 | let deviceId = this.deviceId; |
| 198 | this.isLoging = true; | 198 | this.isLoging = true; |
| 199 | let channelId = itemData.channelId; | 199 | let channelId = itemData.channelId; |
| 200 | - console.log("通知设备推流1:" + deviceId + " : " + channelId); | 200 | + let getEncoding = itemData.hasAudio ? '1' : '0' |
| 201 | + console.log("通知设备推流1:" + deviceId + " : " + channelId + ":" + getEncoding); | ||
| 201 | let that = this; | 202 | let that = this; |
| 202 | this.$axios({ | 203 | this.$axios({ |
| 203 | method: 'get', | 204 | method: 'get', |
| 204 | - url: '/api/play/' + deviceId + '/' + channelId | 205 | + url: '/api/play/' + deviceId + '/' + channelId + '?getEncoding=' + getEncoding |
| 205 | }).then(function (res) { | 206 | }).then(function (res) { |
| 206 | console.log(res.data) | 207 | console.log(res.data) |
| 207 | let ssrc = res.data.ssrc; | 208 | let ssrc = res.data.ssrc; |
| 208 | that.isLoging = false; | 209 | that.isLoging = false; |
| 209 | if (!!ssrc) { | 210 | if (!!ssrc) { |
| 210 | // that.$refs.devicePlayer.play(res.data, deviceId, channelId, itemData.hasAudio); | 211 | // that.$refs.devicePlayer.play(res.data, deviceId, channelId, itemData.hasAudio); |
| 211 | - that.$refs.devicePlayer.openDialog("media", deviceId, channelId,{ | ||
| 212 | - streamInfo: res.data, | ||
| 213 | - hasAudio: itemData.hasAudio | 212 | + that.$refs.devicePlayer.openDialog("media", deviceId, channelId, { |
| 213 | + streamInfo: res.data, | ||
| 214 | + hasAudio: itemData.hasAudio | ||
| 214 | }); | 215 | }); |
| 215 | that.initData(); | 216 | that.initData(); |
| 216 | } else { | 217 | } else { |
| @@ -219,10 +220,10 @@ export default { | @@ -219,10 +220,10 @@ export default { | ||
| 219 | }).catch(function (e) {}); | 220 | }).catch(function (e) {}); |
| 220 | }, | 221 | }, |
| 221 | queryRecords: function (itemData) { | 222 | queryRecords: function (itemData) { |
| 222 | - var format = moment().format("YYYY-M-D"); | ||
| 223 | - let deviceId = this.deviceId; | ||
| 224 | - let channelId = itemData.channelId; | ||
| 225 | - this.$refs.devicePlayer.openDialog("record", deviceId, channelId, {date:format}) | 223 | + var format = moment().format("YYYY-M-D"); |
| 224 | + let deviceId = this.deviceId; | ||
| 225 | + let channelId = itemData.channelId; | ||
| 226 | + this.$refs.devicePlayer.openDialog("record", deviceId, channelId, {date: format}) | ||
| 226 | }, | 227 | }, |
| 227 | stopDevicePush: function (itemData) { | 228 | stopDevicePush: function (itemData) { |
| 228 | console.log(itemData) | 229 | console.log(itemData) |
web_src/src/components/gb28181/devicePlayer.vue
| @@ -223,7 +223,7 @@ export default { | @@ -223,7 +223,7 @@ export default { | ||
| 223 | play: function (streamInfo, hasAudio) { | 223 | play: function (streamInfo, hasAudio) { |
| 224 | this.hasaudio = hasAudio; | 224 | this.hasaudio = hasAudio; |
| 225 | // 根据媒体流信息二次判断 | 225 | // 根据媒体流信息二次判断 |
| 226 | - if (!!streamInfo.tracks && streamInfo.tracks.length > 0) { | 226 | + if (!!streamInfo.tracks && streamInfo.tracks.length > 0 && hasAudio) { |
| 227 | var realHasAudio = false; | 227 | var realHasAudio = false; |
| 228 | for (let i = 0; i < streamInfo.tracks.length; i++) { | 228 | for (let i = 0; i < streamInfo.tracks.length; i++) { |
| 229 | if (streamInfo.tracks[i].codec_type == 1 && streamInfo.tracks[i].codec_id_name == "CodecAAC") { // 判断为AAC音频 | 229 | if (streamInfo.tracks[i].codec_type == 1 && streamInfo.tracks[i].codec_id_name == "CodecAAC") { // 判断为AAC音频 |