Browse Source

Merge pull request #10 from lawrencehj/master

优化播放程序,缩短加载时间
pull/1/head
648540858 4 years ago
committed by GitHub
parent
commit
4e8659e156
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 14
      pom.xml
  2. 28
      src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java
  3. 70
      src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java
  4. 23
      web_src/src/components/channelList.vue
  5. 2
      web_src/src/components/gb28181/devicePlayer.vue

14
pom.xml

@ -163,6 +163,7 @@
<build> <build>
<plugins> <plugins>
<plugin> <plugin>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>
@ -176,6 +177,18 @@
<configuration> <configuration>
<source>1.8</source> <source>1.8</source>
<target>1.8</target> <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> </configuration>
</plugin> </plugin>
@ -183,6 +196,7 @@
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId> <artifactId>maven-surefire-plugin</artifactId>
</plugin> </plugin>
</plugins> </plugins>
</build> </build>
</project> </project>

28
src/main/java/com/genersoft/iot/vmp/storager/redis/VideoManagerRedisStoragerImpl.java

@ -276,6 +276,7 @@ public class VideoManagerRedisStoragerImpl implements IVideoManagerStorager {
PageResult pageResult = new PageResult<Device>(); PageResult pageResult = new PageResult<Device>();
pageResult.setPage(page); pageResult.setPage(page);
pageResult.setCount(count); pageResult.setCount(count);
Device device = null;
if (deviceIds == null || deviceIds.length == 0) { if (deviceIds == null || deviceIds.length == 0) {
@ -284,11 +285,21 @@ public class VideoManagerRedisStoragerImpl implements IVideoManagerStorager {
pageResult.setTotal(deviceIdList.size()); pageResult.setTotal(deviceIdList.size());
int maxCount = (page + 1)* count; int maxCount = (page + 1)* count;
for (int i = page * count; i < (pageResult.getTotal() > maxCount ? maxCount : pageResult.getTotal() ); i++) { 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 { } else {
for (int i = 0; i < deviceIds.length; i++) { 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); pageResult.setData(devices);
@ -304,16 +315,25 @@ public class VideoManagerRedisStoragerImpl implements IVideoManagerStorager {
@Override @Override
public List<Device> queryVideoDeviceList(String[] deviceIds) { public List<Device> queryVideoDeviceList(String[] deviceIds) {
List<Device> devices = new ArrayList<>(); List<Device> devices = new ArrayList<>();
Device device = null;
if (deviceIds == null || deviceIds.length == 0) { if (deviceIds == null || deviceIds.length == 0) {
// List<Object> deviceIdList = redis.keys(VideoManagerConstants.DEVICE_PREFIX+"*"); // List<Object> deviceIdList = redis.keys(VideoManagerConstants.DEVICE_PREFIX+"*");
List<Object> deviceIdList = redis.scan(VideoManagerConstants.DEVICE_PREFIX+"*"); List<Object> deviceIdList = redis.scan(VideoManagerConstants.DEVICE_PREFIX+"*");
for (int i = 0; i < deviceIdList.size(); i++) { 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 { } else {
for (int i = 0; i < deviceIds.length; i++) { 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; return devices;

70
src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java

@ -39,7 +39,8 @@ public class PlayController {
private ZLMRESTfulUtils zlmresTfulUtils; private ZLMRESTfulUtils zlmresTfulUtils;
@GetMapping("/play/{deviceId}/{channelId}") @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); Device device = storager.queryVideoDevice(deviceId);
StreamInfo streamInfo = storager.queryPlayByDevice(deviceId, channelId); StreamInfo streamInfo = storager.queryPlayByDevice(deviceId, channelId);
@ -64,40 +65,49 @@ public class PlayController {
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
JSONObject rtpInfo = null; JSONObject rtpInfo = null;
while (lockFlag) { if (getEncoding == 1) {
try { while (lockFlag) {
if (System.currentTimeMillis() - startTime > 60 * 1000) { try {
storager.stopPlay(streamInfo); if (System.currentTimeMillis() - startTime > 60 * 1000) {
logger.info("播放等待超时"); storager.stopPlay(streamInfo);
return new ResponseEntity<String>("timeout", HttpStatus.OK); logger.info("播放等待超时");
} else { return new ResponseEntity<String>("timeout", HttpStatus.OK);
streamInfo = storager.queryPlayByDevice(deviceId, channelId); } else {
if (!rtpPushed) { streamInfo = storager.queryPlayByDevice(deviceId, channelId);
logger.info("查询RTP推流信息..."); if (!rtpPushed) {
rtpInfo = zlmresTfulUtils.getRtpInfo(streamId); logger.info("查询RTP推流信息...");
} rtpInfo = zlmresTfulUtils.getRtpInfo(streamId);
if (rtpInfo != null && rtpInfo.getBoolean("exist") && streamInfo != null && streamInfo.getFlv() != null) { }
logger.info("查询流编码信息:" + streamInfo.getFlv()); if (rtpInfo != null && rtpInfo.getBoolean("exist") && streamInfo != null
rtpPushed = true; && streamInfo.getFlv() != null) {
Thread.sleep(2000); logger.info("查询流编码信息:" + streamInfo.getFlv());
JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo("rtp", "rtmp", streamId); rtpPushed = true;
if (mediaInfo.getInteger("code") == 0 && mediaInfo.getBoolean("online")) { Thread.sleep(2000);
lockFlag = false; JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo("rtp", "rtmp", streamId);
logger.info("流编码信息已获取"); if (mediaInfo.getInteger("code") == 0 && mediaInfo.getBoolean("online")) {
JSONArray tracks = mediaInfo.getJSONArray("tracks"); lockFlag = false;
streamInfo.setTracks(tracks); logger.info("流编码信息已获取");
storager.startPlay(streamInfo); JSONArray tracks = mediaInfo.getJSONArray("tracks");
streamInfo.setTracks(tracks);
storager.startPlay(streamInfo);
} else {
logger.info("流编码信息未获取,2秒后重试...");
}
} else { } else {
logger.info("流编码信息未获取,2秒后重试..."); Thread.sleep(2000);
continue;
} }
} 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()) { if (logger.isDebugEnabled()) {

23
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-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-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-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" 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" @click="sendDevicePush(scope.row)">录像查询</el-button> -->
</el-button-group> </el-button-group>
</template> </template>
</el-table-column> </el-table-column>
@ -197,20 +197,21 @@ export default {
let deviceId = this.deviceId; let deviceId = this.deviceId;
this.isLoging = true; this.isLoging = true;
let channelId = itemData.channelId; let channelId = itemData.channelId;
console.log("通知设备推流1:" + deviceId + " : " + channelId); let getEncoding = itemData.hasAudio ? '1' : '0'
console.log("通知设备推流1:" + deviceId + " : " + channelId + ":" + getEncoding);
let that = this; let that = this;
this.$axios({ this.$axios({
method: 'get', method: 'get',
url: '/api/play/' + deviceId + '/' + channelId url: '/api/play/' + deviceId + '/' + channelId + '?getEncoding=' + getEncoding
}).then(function (res) { }).then(function (res) {
console.log(res.data) console.log(res.data)
let ssrc = res.data.ssrc; let ssrc = res.data.ssrc;
that.isLoging = false; that.isLoging = false;
if (!!ssrc) { if (!!ssrc) {
// that.$refs.devicePlayer.play(res.data, deviceId, channelId, itemData.hasAudio); // that.$refs.devicePlayer.play(res.data, deviceId, channelId, itemData.hasAudio);
that.$refs.devicePlayer.openDialog("media", deviceId, channelId,{ that.$refs.devicePlayer.openDialog("media", deviceId, channelId, {
streamInfo: res.data, streamInfo: res.data,
hasAudio: itemData.hasAudio hasAudio: itemData.hasAudio
}); });
that.initData(); that.initData();
} else { } else {
@ -219,10 +220,10 @@ export default {
}).catch(function (e) {}); }).catch(function (e) {});
}, },
queryRecords: function (itemData) { queryRecords: function (itemData) {
var format = moment().format("YYYY-M-D"); var format = moment().format("YYYY-M-D");
let deviceId = this.deviceId; let deviceId = this.deviceId;
let channelId = itemData.channelId; let channelId = itemData.channelId;
this.$refs.devicePlayer.openDialog("record", deviceId, channelId, {date:format}) this.$refs.devicePlayer.openDialog("record", deviceId, channelId, {date: format})
}, },
stopDevicePush: function (itemData) { stopDevicePush: function (itemData) {
console.log(itemData) console.log(itemData)

2
web_src/src/components/gb28181/devicePlayer.vue

@ -223,7 +223,7 @@ export default {
play: function (streamInfo, hasAudio) { play: function (streamInfo, hasAudio) {
this.hasaudio = hasAudio; this.hasaudio = hasAudio;
// //
if (!!streamInfo.tracks && streamInfo.tracks.length > 0) { if (!!streamInfo.tracks && streamInfo.tracks.length > 0 && hasAudio) {
var realHasAudio = false; var realHasAudio = false;
for (let i = 0; i < streamInfo.tracks.length; i++) { for (let i = 0; i < streamInfo.tracks.length; i++) {
if (streamInfo.tracks[i].codec_type == 1 && streamInfo.tracks[i].codec_id_name == "CodecAAC") { // AAC if (streamInfo.tracks[i].codec_type == 1 && streamInfo.tracks[i].codec_id_name == "CodecAAC") { // AAC

Loading…
Cancel
Save