pom.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
web_src/src/components/channelList.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
web_src/src/components/gb28181/devicePlayer.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
pom.xml
@@ -163,6 +163,7 @@ <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> @@ -176,6 +177,18 @@ <configuration> <source>1.8</source> <target>1.8</target> <!-- <webResources> <resource> <directory>${project.basedir}/libs</directory> <targetPath>WEB-INF/lib</targetPath> <filtering>true</filtering> <includes> <include>**/*.jar</include> </includes> </resource> </webResources> --> </configuration> </plugin> @@ -183,6 +196,7 @@ <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> </plugin> </plugins> </build> </project> src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java
@@ -276,6 +276,7 @@ PageResult pageResult = new PageResult<Device>(); pageResult.setPage(page); pageResult.setCount(count); Device device = null; if (deviceIds == null || deviceIds.length == 0) { @@ -284,11 +285,21 @@ pageResult.setTotal(deviceIdList.size()); int maxCount = (page + 1)* count; for (int i = page * count; i < (pageResult.getTotal() > maxCount ? maxCount : pageResult.getTotal() ); i++) { devices.add((Device)redis.get((String)deviceIdList.get(i))); // devices.add((Device)redis.get((String)deviceIdList.get(i))); device =(Device)redis.get((String)deviceIdList.get(i)); if (redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX+device.getDeviceId()).size() == 0){ outline(device.getDeviceId()); } devices.add(device); } } else { for (int i = 0; i < deviceIds.length; i++) { devices.add((Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i])); // devices.add((Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i])); device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i]); if (redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX+device.getDeviceId()).size() == 0){ outline(device.getDeviceId()); } devices.add(device); } } pageResult.setData(devices); @@ -304,16 +315,25 @@ @Override public List<Device> queryVideoDeviceList(String[] deviceIds) { List<Device> devices = new ArrayList<>(); Device device = null; if (deviceIds == null || deviceIds.length == 0) { // List<Object> deviceIdList = redis.keys(VideoManagerConstants.DEVICE_PREFIX+"*"); List<Object> deviceIdList = redis.scan(VideoManagerConstants.DEVICE_PREFIX+"*"); for (int i = 0; i < deviceIdList.size(); i++) { devices.add((Device)redis.get((String)deviceIdList.get(i))); device =(Device)redis.get((String)deviceIdList.get(i)); if (redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX+device.getDeviceId()).size() == 0){ outline(device.getDeviceId()); } devices.add(device); } } else { for (int i = 0; i < deviceIds.length; i++) { devices.add((Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i])); device = (Device)redis.get(VideoManagerConstants.DEVICE_PREFIX+deviceIds[i]); if (redis.scan(VideoManagerConstants.KEEPLIVEKEY_PREFIX+device.getDeviceId()).size() == 0){ outline(device.getDeviceId()); } devices.add(device); } } return devices; src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java
@@ -39,7 +39,8 @@ private ZLMRESTfulUtils zlmresTfulUtils; @GetMapping("/play/{deviceId}/{channelId}") public ResponseEntity<String> play(@PathVariable String deviceId, @PathVariable String channelId) { public ResponseEntity<String> play(@PathVariable String deviceId, @PathVariable String channelId, Integer getEncoding) { Device device = storager.queryVideoDevice(deviceId); StreamInfo streamInfo = storager.queryPlayByDevice(deviceId, channelId); @@ -64,40 +65,49 @@ long startTime = System.currentTimeMillis(); JSONObject rtpInfo = null; while (lockFlag) { try { if (System.currentTimeMillis() - startTime > 60 * 1000) { storager.stopPlay(streamInfo); logger.info("播放等待超时"); return new ResponseEntity<String>("timeout", HttpStatus.OK); } else { streamInfo = storager.queryPlayByDevice(deviceId, channelId); if (!rtpPushed) { logger.info("查询RTP推流信息..."); rtpInfo = zlmresTfulUtils.getRtpInfo(streamId); } if (rtpInfo != null && rtpInfo.getBoolean("exist") && streamInfo != null && streamInfo.getFlv() != null) { logger.info("查询流编码信息:" + streamInfo.getFlv()); rtpPushed = true; Thread.sleep(2000); JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo("rtp", "rtmp", streamId); if (mediaInfo.getInteger("code") == 0 && mediaInfo.getBoolean("online")) { lockFlag = false; logger.info("流编码信息已获取"); JSONArray tracks = mediaInfo.getJSONArray("tracks"); streamInfo.setTracks(tracks); storager.startPlay(streamInfo); } else { logger.info("流编码信息未获取,2秒后重试..."); } if (getEncoding == 1) { while (lockFlag) { try { if (System.currentTimeMillis() - startTime > 60 * 1000) { storager.stopPlay(streamInfo); logger.info("播放等待超时"); return new ResponseEntity<String>("timeout", HttpStatus.OK); } else { Thread.sleep(2000); continue; streamInfo = storager.queryPlayByDevice(deviceId, channelId); if (!rtpPushed) { logger.info("查询RTP推流信息..."); rtpInfo = zlmresTfulUtils.getRtpInfo(streamId); } if (rtpInfo != null && rtpInfo.getBoolean("exist") && streamInfo != null && streamInfo.getFlv() != null) { logger.info("查询流编码信息:" + streamInfo.getFlv()); rtpPushed = true; Thread.sleep(2000); JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo("rtp", "rtmp", streamId); if (mediaInfo.getInteger("code") == 0 && mediaInfo.getBoolean("online")) { lockFlag = false; logger.info("流编码信息已获取"); JSONArray tracks = mediaInfo.getJSONArray("tracks"); streamInfo.setTracks(tracks); storager.startPlay(streamInfo); } else { logger.info("流编码信息未获取,2秒后重试..."); } } else { Thread.sleep(2000); continue; } } } catch (InterruptedException e) { e.printStackTrace(); } } catch (InterruptedException e) { e.printStackTrace(); } } else { String flv = storager.getMediaInfo().getLocalIP() + ":" + storager.getMediaInfo().getHttpPort() + "/rtp/" + streamId + ".flv"; streamInfo.setFlv("http://" + flv); streamInfo.setWs_flv("ws://" + flv); storager.startPlay(streamInfo); } if (logger.isDebugEnabled()) { web_src/src/components/channelList.vue
@@ -58,8 +58,8 @@ <el-button size="mini" icon="el-icon-video-play" @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" @click="queryRecords(scope.row)">设备录象</el-button> <!-- <el-button size="mini" @click="sendDevicePush(scope.row)">录像查询</el-button> --> <el-button size="mini" icon="el-icon-video-camera" type="primary" @click="queryRecords(scope.row)">设备录象</el-button> <!-- <el-button size="mini" @click="sendDevicePush(scope.row)">录像查询</el-button> --> </el-button-group> </template> </el-table-column> @@ -197,20 +197,21 @@ let deviceId = this.deviceId; this.isLoging = true; let channelId = itemData.channelId; console.log("通知设备推流1:" + deviceId + " : " + channelId); let getEncoding = itemData.hasAudio ? '1' : '0' console.log("通知设备推流1:" + deviceId + " : " + channelId + ":" + getEncoding); let that = this; this.$axios({ method: 'get', url: '/api/play/' + deviceId + '/' + channelId url: '/api/play/' + deviceId + '/' + channelId + '?getEncoding=' + getEncoding }).then(function (res) { console.log(res.data) let ssrc = res.data.ssrc; that.isLoging = false; if (!!ssrc) { // that.$refs.devicePlayer.play(res.data, deviceId, channelId, itemData.hasAudio); that.$refs.devicePlayer.openDialog("media", deviceId, channelId,{ streamInfo: res.data, hasAudio: itemData.hasAudio that.$refs.devicePlayer.openDialog("media", deviceId, channelId, { streamInfo: res.data, hasAudio: itemData.hasAudio }); that.initData(); } else { @@ -219,10 +220,10 @@ }).catch(function (e) {}); }, queryRecords: function (itemData) { var format = moment().format("YYYY-M-D"); let deviceId = this.deviceId; let channelId = itemData.channelId; this.$refs.devicePlayer.openDialog("record", deviceId, channelId, {date:format}) var format = moment().format("YYYY-M-D"); let deviceId = this.deviceId; let channelId = itemData.channelId; this.$refs.devicePlayer.openDialog("record", deviceId, channelId, {date: format}) }, stopDevicePush: function (itemData) { console.log(itemData) web_src/src/components/gb28181/devicePlayer.vue
@@ -223,7 +223,7 @@ play: function (streamInfo, hasAudio) { this.hasaudio = hasAudio; // 根据媒体流信息二次判断 if (!!streamInfo.tracks && streamInfo.tracks.length > 0) { if (!!streamInfo.tracks && streamInfo.tracks.length > 0 && hasAudio) { var realHasAudio = false; for (let i = 0; i < streamInfo.tracks.length; i++) { if (streamInfo.tracks[i].codec_type == 1 && streamInfo.tracks[i].codec_id_name == "CodecAAC") { // 判断为AAC音频