commit
4e8659e156
14
pom.xml
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>
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
|
||||||
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 {
|
} else {
|
||||||
Thread.sleep(2000);
|
streamInfo = storager.queryPlayByDevice(deviceId, channelId);
|
||||||
continue;
|
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()) {
|
if (logger.isDebugEnabled()) {
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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…
Reference in New Issue