1、摄像头功能修改
2、配置文件增加摄像头相关配置
This commit is contained in:
parent
7d7f942ee3
commit
537aae0af7
@ -43,8 +43,8 @@ public class CameraController extends AbstractController {
|
|||||||
})
|
})
|
||||||
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
|
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
|
||||||
@GetMapping("camera-pullflow/{cityCameraId}")
|
@GetMapping("camera-pullflow/{cityCameraId}")
|
||||||
public SuccessResultData<String> cameraPullFlow(@PathVariable("cityCameraId") String cityCameraId) throws SearchException {
|
public CameraDTO cameraPullFlow(@PathVariable("cityCameraId") String cityCameraId) throws SearchException {
|
||||||
return new SuccessResultData(cameraService.cameraPullFlow(cityCameraId));
|
return cameraService.cameraPullFlow(cityCameraId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,106 @@
|
|||||||
|
package com.cm.population.pojo.dtos.camera;
|
||||||
|
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 摄像头配置
|
||||||
|
* @author : LY
|
||||||
|
* @date :2023-12-28 16:37
|
||||||
|
* @description :
|
||||||
|
* @modyified By:
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Component
|
||||||
|
@ConfigurationProperties(prefix = "camera")
|
||||||
|
public class CameraConfig {
|
||||||
|
|
||||||
|
private String ffmpegPath;
|
||||||
|
private rtmpPlayConfig rtmpPlay;
|
||||||
|
private HttpPlayConfig httpPlay;
|
||||||
|
|
||||||
|
public String getFfmpegPath() {
|
||||||
|
return ffmpegPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFfmpegPath(String ffmpegPath) {
|
||||||
|
this.ffmpegPath = ffmpegPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public rtmpPlayConfig getRtmpPlay() {
|
||||||
|
return rtmpPlay;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRtmpPlay(rtmpPlayConfig rtmpPlay) {
|
||||||
|
this.rtmpPlay = rtmpPlay;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HttpPlayConfig getHttpPlay() {
|
||||||
|
return httpPlay;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHttpPlay(HttpPlayConfig httpPlay) {
|
||||||
|
this.httpPlay = httpPlay;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class HttpPlayConfig {
|
||||||
|
private String name;
|
||||||
|
private String ip;
|
||||||
|
private String port;
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getIp() {
|
||||||
|
return ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIp(String ip) {
|
||||||
|
this.ip = ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPort() {
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPort(String port) {
|
||||||
|
this.port = port;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class rtmpPlayConfig {
|
||||||
|
private String name;
|
||||||
|
private String ip;
|
||||||
|
private String port;
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getIp() {
|
||||||
|
return ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIp(String ip) {
|
||||||
|
this.ip = ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPort() {
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPort(String port) {
|
||||||
|
this.port = port;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -27,6 +27,8 @@ public class CameraDTO {
|
|||||||
private String cameraRtspLink;
|
private String cameraRtspLink;
|
||||||
private String remark;
|
private String remark;
|
||||||
|
|
||||||
|
private String playAddress;
|
||||||
|
|
||||||
|
|
||||||
public String getCityCameraId() {
|
public String getCityCameraId() {
|
||||||
return cityCameraId;
|
return cityCameraId;
|
||||||
@ -131,4 +133,12 @@ public class CameraDTO {
|
|||||||
public void setRemark(String remark) {
|
public void setRemark(String remark) {
|
||||||
this.remark = remark;
|
this.remark = remark;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getPlayAddress() {
|
||||||
|
return playAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPlayAddress(String playAddress) {
|
||||||
|
this.playAddress = playAddress;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,125 +0,0 @@
|
|||||||
package com.cm.population.pojo.dtos.camera.media;
|
|
||||||
|
|
||||||
import com.cm.common.annotation.CheckEmptyAnnotation;
|
|
||||||
import io.swagger.annotations.ApiModel;
|
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ClassName: MediaConfigVO
|
|
||||||
* @Description:
|
|
||||||
* @Author: wanggeng
|
|
||||||
* @Date: 2023/9/2 20:55
|
|
||||||
* @Version: 1.0
|
|
||||||
*/
|
|
||||||
@ApiModel
|
|
||||||
public class MediaConfig {
|
|
||||||
|
|
||||||
@ApiModelProperty(name = "ffmpegPath", value = "FFMPEG路径")
|
|
||||||
@CheckEmptyAnnotation(name = "FFMPEG路径")
|
|
||||||
private String ffmpegPath;
|
|
||||||
@ApiModelProperty(name = "nginxPath", value = "NGINX路径")
|
|
||||||
@CheckEmptyAnnotation(name = "NGINX路径")
|
|
||||||
private String nginxPath;
|
|
||||||
@ApiModelProperty(name = "nginxConfPath", value = "NGINX CONF文件路径")
|
|
||||||
@CheckEmptyAnnotation(name = "NGINX CONF文件路径")
|
|
||||||
private String nginxConfPath;
|
|
||||||
@ApiModelProperty(name = "nginxRtmpPlayUrl", value = "NGINX RTMP直播地址")
|
|
||||||
@CheckEmptyAnnotation(name = "NGINX RTMP直播地址")
|
|
||||||
private String nginxRtmpPlayUrl;
|
|
||||||
@ApiModelProperty(name = "nginxRtmpRelayUrl", value = "NGINX RTMP转播地址")
|
|
||||||
@CheckEmptyAnnotation(name = "NGINX RTMP转播地址")
|
|
||||||
private String nginxRtmpRelayUrl;
|
|
||||||
@ApiModelProperty(name = "nginxRtmpTranscodeUrl", value = "NGINX RTMP转码地址")
|
|
||||||
@CheckEmptyAnnotation(name = "NGINX RTMP转码地址")
|
|
||||||
private String nginxRtmpTranscodeUrl;
|
|
||||||
@ApiModelProperty(name = "nginxRtmpChannelCount", value = "NGINX RTMP频道数")
|
|
||||||
@CheckEmptyAnnotation(name = "NGINX RTMP频道数")
|
|
||||||
private Integer nginxRtmpChannelCount;
|
|
||||||
@ApiModelProperty(name = "nginxHttpPlayUrl", value = "NGINX HTTP播放地址")
|
|
||||||
@CheckEmptyAnnotation(name = "NGINX HTTP播放地址")
|
|
||||||
private String nginxHttpPlayUrl;
|
|
||||||
@ApiModelProperty(name = "nginxHttpControlUrl", value = "NGINX HTTP控制URL")
|
|
||||||
@CheckEmptyAnnotation(name = "NGINX HTTP控制URL")
|
|
||||||
private String nginxHttpControlUrl;
|
|
||||||
|
|
||||||
public String getFfmpegPath() {
|
|
||||||
return ffmpegPath == null ? "" : ffmpegPath.trim();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setFfmpegPath(String ffmpegPath) {
|
|
||||||
this.ffmpegPath = ffmpegPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getNginxPath() {
|
|
||||||
return nginxPath == null ? "" : nginxPath.trim();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setNginxPath(String nginxPath) {
|
|
||||||
this.nginxPath = nginxPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getNginxConfPath() {
|
|
||||||
return nginxConfPath == null ? "" : nginxConfPath.trim();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setNginxConfPath(String nginxConfPath) {
|
|
||||||
this.nginxConfPath = nginxConfPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getNginxRtmpPlayUrl() {
|
|
||||||
return nginxRtmpPlayUrl == null ? "" : nginxRtmpPlayUrl.trim();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setNginxRtmpPlayUrl(String nginxRtmpPlayUrl) {
|
|
||||||
this.nginxRtmpPlayUrl = nginxRtmpPlayUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getNginxRtmpRelayUrl() {
|
|
||||||
return nginxRtmpRelayUrl == null ? "" : nginxRtmpRelayUrl.trim();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setNginxRtmpRelayUrl(String nginxRtmpRelayUrl) {
|
|
||||||
this.nginxRtmpRelayUrl = nginxRtmpRelayUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getNginxRtmpTranscodeUrl() {
|
|
||||||
return nginxRtmpTranscodeUrl == null ? "" : nginxRtmpTranscodeUrl.trim();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setNginxRtmpTranscodeUrl(String nginxRtmpTranscodeUrl) {
|
|
||||||
this.nginxRtmpTranscodeUrl = nginxRtmpTranscodeUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getNginxRtmpChannelCount() {
|
|
||||||
return nginxRtmpChannelCount == null ? 0 : nginxRtmpChannelCount;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setNginxRtmpChannelCount(Integer nginxRtmpChannelCount) {
|
|
||||||
this.nginxRtmpChannelCount = nginxRtmpChannelCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getNginxHttpPlayUrl() {
|
|
||||||
return nginxHttpPlayUrl == null ? "" : nginxHttpPlayUrl.trim();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setNginxHttpPlayUrl(String nginxHttpPlayUrl) {
|
|
||||||
this.nginxHttpPlayUrl = nginxHttpPlayUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getNginxHttpControlUrl() {
|
|
||||||
return nginxHttpControlUrl == null ? "" : nginxHttpControlUrl.trim();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setNginxHttpControlUrl(String nginxHttpControlUrl) {
|
|
||||||
this.nginxHttpControlUrl = nginxHttpControlUrl;
|
|
||||||
}
|
|
||||||
}
|
|
@ -29,7 +29,7 @@ public interface ICameraService {
|
|||||||
* @param cameraId
|
* @param cameraId
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
SuccessResultData<String> cameraPullFlow(String cameraId);
|
CameraDTO cameraPullFlow(String cameraId);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ public class CameraServiceImpl extends AbstractService implements ICameraService
|
|||||||
@Autowired
|
@Autowired
|
||||||
private IRtmpService rtmpService;
|
private IRtmpService rtmpService;
|
||||||
|
|
||||||
public SuccessResultData<String> cameraPullFlow(String cameraId){
|
public CameraDTO cameraPullFlow(String cameraId){
|
||||||
CameraDTO cameraDTO = this.get(cameraId);
|
CameraDTO cameraDTO = this.get(cameraId);
|
||||||
if(cameraDTO == null){
|
if(cameraDTO == null){
|
||||||
throw new SearchException("未获取到摄像头信息");
|
throw new SearchException("未获取到摄像头信息");
|
||||||
@ -47,8 +47,10 @@ public class CameraServiceImpl extends AbstractService implements ICameraService
|
|||||||
if(StringUtils.isEmpty(cameraDTO.getCameraRtspLink())){
|
if(StringUtils.isEmpty(cameraDTO.getCameraRtspLink())){
|
||||||
throw new SearchException("摄像头RTSP地址为空");
|
throw new SearchException("摄像头RTSP地址为空");
|
||||||
}
|
}
|
||||||
int code = new Random().nextInt(99999) + 10000;
|
/*int code = new Random().nextInt(99999) + 10000;*/
|
||||||
return new SuccessResultData(rtmpService.pullFlow(cameraDTO.getCameraRtspLink(), Integer.toString(code)));
|
// 转码拉流
|
||||||
|
cameraDTO.setPlayAddress(rtmpService.pullFlow(cameraDTO.getCameraRtspLink(), cameraId));
|
||||||
|
return cameraDTO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -6,8 +6,8 @@ public interface IRtmpService {
|
|||||||
/**
|
/**
|
||||||
* 拉流转码
|
* 拉流转码
|
||||||
* @param rtmpUrl
|
* @param rtmpUrl
|
||||||
* @param ident
|
* @param cameraId
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
String pullFlow(String rtmpUrl, String ident);
|
String pullFlow(String rtmpUrl, String cameraId);
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,13 @@
|
|||||||
package com.cm.population.service.camera.rtmp.impl;
|
package com.cm.population.service.camera.rtmp.impl;
|
||||||
|
|
||||||
import com.cm.common.base.AbstractService;
|
import com.cm.common.base.AbstractService;
|
||||||
|
import com.cm.common.exception.ParamsException;
|
||||||
|
import com.cm.population.pojo.dtos.camera.CameraConfig;
|
||||||
import com.cm.population.service.camera.command.AbstractCommandStream;
|
import com.cm.population.service.camera.command.AbstractCommandStream;
|
||||||
import com.cm.population.service.camera.command.CommandUtil;
|
import com.cm.population.service.camera.command.CommandUtil;
|
||||||
import com.cm.population.service.camera.rtmp.IRtmpService;
|
import com.cm.population.service.camera.rtmp.IRtmpService;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -19,21 +23,34 @@ import java.util.List;
|
|||||||
@Service
|
@Service
|
||||||
public class RtmpServiceImpl extends AbstractService implements IRtmpService {
|
public class RtmpServiceImpl extends AbstractService implements IRtmpService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CameraConfig cameraConfig;
|
||||||
|
|
||||||
//private static final Logger LOG = LoggerFactory.getLogger(RtmpServiceImpl.class);
|
|
||||||
|
|
||||||
|
|
||||||
//String rtmpUrl = "rtmp://ns8.indexforce.com/home/mystream";
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 拉流转码
|
* 拉流转码
|
||||||
* @param rtmpUrl 推流地址
|
* @param rtmpUrl 推流地址
|
||||||
|
* @param cameraId 摄像头标识
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public String pullFlow(String rtmpUrl, String ident){
|
public String pullFlow(String rtmpUrl, String cameraId){
|
||||||
|
String ffmpegPath = cameraConfig.getFfmpegPath();
|
||||||
|
String rtmpIp = cameraConfig.getRtmpPlay().getIp();
|
||||||
|
String rtmpPort = cameraConfig.getRtmpPlay().getPort();
|
||||||
|
String rtmpName = cameraConfig.getRtmpPlay().getName();
|
||||||
|
|
||||||
|
String httpIp = cameraConfig.getHttpPlay().getIp();
|
||||||
|
String httpPort = cameraConfig.getHttpPlay().getPort();
|
||||||
|
String httpName = cameraConfig.getHttpPlay().getName();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if(StringUtils.isEmpty(ffmpegPath)){
|
||||||
|
throw new ParamsException("未配置摄像头查看参数-请检查配置文件");
|
||||||
|
}
|
||||||
List<String> commands = new ArrayList<>();
|
List<String> commands = new ArrayList<>();
|
||||||
commands.add("D:\\CF_work\\ffmpeg\\ffmpeg-2023-11-28-git-47e214245b-essentials_build\\bin\\ffmpeg.exe");
|
commands.add(ffmpegPath); // D:\CF_work\ffmpeg\ffmpeg-2023-11-28-git-47e214245b-essentials_build\bin\ffmpeg.exe
|
||||||
commands.add("-i");
|
commands.add("-i");
|
||||||
commands.add(rtmpUrl);
|
commands.add(rtmpUrl);
|
||||||
commands.add("-vcodec");
|
commands.add("-vcodec");
|
||||||
@ -42,7 +59,7 @@ public class RtmpServiceImpl extends AbstractService implements IRtmpService {
|
|||||||
commands.add("aac");
|
commands.add("aac");
|
||||||
commands.add("-f");
|
commands.add("-f");
|
||||||
commands.add("flv");
|
commands.add("flv");
|
||||||
commands.add("rtmp://127.0.0.1:8081/live/" + ident);
|
commands.add(String.format("rtmp://%s:%s/%s/%s", rtmpIp, rtmpPort, rtmpName, cameraId));
|
||||||
CommandUtil.execute(commands, new AbstractCommandStream(){
|
CommandUtil.execute(commands, new AbstractCommandStream(){
|
||||||
@Override
|
@Override
|
||||||
protected void input(String inputLine) throws Exception {
|
protected void input(String inputLine) throws Exception {
|
||||||
@ -53,7 +70,15 @@ public class RtmpServiceImpl extends AbstractService implements IRtmpService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
return "http://127.0.0.1:8080/live?port=8081&app=live&stream=" + ident;
|
return String.format(
|
||||||
|
"http://%s:%s/%s?port=%s&app=%s&stream=%s",
|
||||||
|
httpIp,
|
||||||
|
httpPort,
|
||||||
|
httpName,
|
||||||
|
rtmpPort,
|
||||||
|
rtmpName,
|
||||||
|
cameraId
|
||||||
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
server:
|
server:
|
||||||
port: 7023
|
port: 9999
|
||||||
url: http://192.168.0.115:7023/population
|
url: http://192.168.0.120:9999/population
|
||||||
title: population
|
title: population
|
||||||
servlet:
|
servlet:
|
||||||
context-path: /population
|
context-path: /population
|
||||||
|
|
||||||
spring:
|
spring:
|
||||||
thymeleaf:
|
thymeleaf:
|
||||||
prefix: classpath:/templates/
|
prefix: classpath:/templates/
|
||||||
@ -21,10 +20,12 @@ spring:
|
|||||||
datasource:
|
datasource:
|
||||||
druid:
|
druid:
|
||||||
url: jdbc:mysql://192.168.0.151:3306/db_baotou_city?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&autoReconnect=true&failOverReadOnly=false&useSSL=false
|
url: jdbc:mysql://192.168.0.151:3306/db_baotou_city?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&autoReconnect=true&failOverReadOnly=false&useSSL=false
|
||||||
|
#url: jdbc:mysql://127.0.0.1:3306/db_baotou_city?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&autoReconnect=true&failOverReadOnly=false&useSSL=false
|
||||||
db-type: mysql
|
db-type: mysql
|
||||||
driver-class-name: com.mysql.jdbc.Driver
|
driver-class-name: com.mysql.jdbc.Driver
|
||||||
username: root
|
|
||||||
password: root
|
password: root
|
||||||
|
username: root
|
||||||
|
#password: 123456
|
||||||
initial-size: 2
|
initial-size: 2
|
||||||
min-idle: 2
|
min-idle: 2
|
||||||
max-active: 5
|
max-active: 5
|
||||||
@ -61,7 +62,7 @@ swagger:
|
|||||||
|
|
||||||
# 文件
|
# 文件
|
||||||
file:
|
file:
|
||||||
uploadPath: C:\Users\TS-QD1\Desktop\UploadFiles\
|
uploadPath: D:\CF_work\ideaWorkSpace\uploadFiles\
|
||||||
imageTypes: png,jpg,jpeg,gif,blob
|
imageTypes: png,jpg,jpeg,gif,blob
|
||||||
videoTypes: mp4
|
videoTypes: mp4
|
||||||
audioTypes: mp3,wav,amr
|
audioTypes: mp3,wav,amr
|
||||||
@ -72,10 +73,15 @@ file:
|
|||||||
security:
|
security:
|
||||||
oauth2:
|
oauth2:
|
||||||
oauth-server: http://192.168.0.15:7021/usercenter
|
oauth-server: http://192.168.0.15:7021/usercenter
|
||||||
|
# #oauth-server: http://121.36.71.250:58038/usercenter
|
||||||
|
#oauth-server: http://219.147.99.164:8082/usercenter
|
||||||
oauth-logout: ${security.oauth2.oauth-server}/logout?redirect_uri=${server.url}
|
oauth-logout: ${security.oauth2.oauth-server}/logout?redirect_uri=${server.url}
|
||||||
client:
|
client:
|
||||||
client-id: 00b49298399641448405170d55a3614b
|
client-id: e6cd01761ed14679952397c0f73db881
|
||||||
client-secret: Z0RQUmZTdENUckprWVRtdGQ3Sm5ldmlCZFJKT1NBNHJZWnNrM1RSSWU3NG1ac2wwZTJHWk5NbXh3L3h3U2c4Rg==
|
client-secret: SDZnNVV6WUtkdXZTQmtMV1J3ZVcyQzhBTnNzOEEyZE5jc1lveGdUZlJOY21ac2wwZTJHWk5NbXh3L3h3U2c4Rg==
|
||||||
|
|
||||||
|
# client-id: 084d50a02c2b4f92984684ff50661690
|
||||||
|
# client-secret: ZWQyMjBtN2hvWEZ1OW9pNUU2aU1HSFowdEllZ3NZNVYrSndzLzRWbVJqQW1ac2wwZTJHWk5NbXh3L3h3U2c4Rg==
|
||||||
user-authorization-uri: ${security.oauth2.oauth-server}/oauth_client/authorize
|
user-authorization-uri: ${security.oauth2.oauth-server}/oauth_client/authorize
|
||||||
access-token-uri: ${security.oauth2.oauth-server}/oauth_client/token
|
access-token-uri: ${security.oauth2.oauth-server}/oauth_client/token
|
||||||
grant-type: authorization_code
|
grant-type: authorization_code
|
||||||
@ -120,8 +126,22 @@ logging:
|
|||||||
root: error
|
root: error
|
||||||
com.cm: debug
|
com.cm: debug
|
||||||
|
|
||||||
|
|
||||||
server-other:
|
server-other:
|
||||||
area-url: http://192.168.0.15:7022/servicecity
|
area-url: http://192.168.0.15:7022/servicecity
|
||||||
population-update-log: true
|
population-update-log: true
|
||||||
population-insert-log: true
|
population-insert-log: true
|
||||||
population-delete-log: false
|
population-delete-log: false
|
||||||
|
|
||||||
|
camera:
|
||||||
|
ffmpeg-path: D:\CF_work\ffmpeg\ffmpeg-2023-11-28-git-47e214245b-essentials_build\bin\ffmpeg.exe
|
||||||
|
rtmp-play:
|
||||||
|
ip: 127.0.0.1
|
||||||
|
port: 8081
|
||||||
|
name: live
|
||||||
|
http-play:
|
||||||
|
ip: 127.0.0.1
|
||||||
|
port: 8080
|
||||||
|
name: live
|
||||||
|
|
||||||
|
|
||||||
|
10585
src/main/resources/static/assets/js/flv.js
Normal file
10585
src/main/resources/static/assets/js/flv.js
Normal file
File diff suppressed because it is too large
Load Diff
@ -70,9 +70,11 @@
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="layui-fluid layui-anim layui-anim-fadein" id="LAY-component-grid-mobile">
|
<div class="layui-fluid layui-anim layui-anim-fadein" id="LAY-component-grid-mobile">
|
||||||
|
<div class="layui-row layui-col-space12" style="padding: 6px">
|
||||||
|
注:如提示 “所有播放窗口已占用”,请先暂停一个窗口的视频,在点击要查看的摄像头
|
||||||
|
</div>
|
||||||
<div class="layui-row layui-col-space12">
|
<div class="layui-row layui-col-space12">
|
||||||
<div class="layui-col-md3 camera-list">
|
<div class="layui-col-md3 camera-list">
|
||||||
|
|
||||||
<div class="layui-card">
|
<div class="layui-card">
|
||||||
<div class="layui-card-header container">
|
<div class="layui-card-header container">
|
||||||
<div class="layui-inline layui-form search-item" id="streetSelectTemplateBox" lay-filter="streetSelectTemplateBox"></div>
|
<div class="layui-inline layui-form search-item" id="streetSelectTemplateBox" lay-filter="streetSelectTemplateBox"></div>
|
||||||
@ -90,25 +92,25 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="layui-col-md9 camera-feed">
|
<div class="layui-col-md9 camera-feed" id="videoDiv">
|
||||||
<div class="layui-row layui-col-space10">
|
<div class="layui-row layui-col-space10">
|
||||||
<div class="layui-col-md6">
|
<div class="layui-col-md6">
|
||||||
<div class="layui-card">
|
<div class="layui-card">
|
||||||
<div class="layui-card-header">
|
<div class="layui-card-header">
|
||||||
摄像头一
|
暂无摄像头
|
||||||
</div>
|
</div>
|
||||||
<div class="layui-card-body">
|
<div class="layui-card-body">
|
||||||
<video id="video1" class="centeredVideo" controls width="1024" height="576"></video>
|
<video class="centeredVideo" controls width="1024" height="576"></video>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="layui-col-md6">
|
<div class="layui-col-md6">
|
||||||
<div class="layui-card">
|
<div class="layui-card">
|
||||||
<div class="layui-card-header">
|
<div class="layui-card-header">
|
||||||
摄像头一
|
暂无摄像头
|
||||||
</div>
|
</div>
|
||||||
<div class="layui-card-body">
|
<div class="layui-card-body">
|
||||||
<video id="video2" class="centeredVideo" controls width="1024" height="576"></video>
|
<video class="centeredVideo" controls width="1024" height="576"></video>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -117,16 +119,21 @@
|
|||||||
<div class="layui-col-md6">
|
<div class="layui-col-md6">
|
||||||
<div class="layui-card">
|
<div class="layui-card">
|
||||||
<div class="layui-card-header">
|
<div class="layui-card-header">
|
||||||
摄像头一
|
暂无摄像头
|
||||||
</div>
|
</div>
|
||||||
<div class="layui-card-body">
|
<div class="layui-card-body">
|
||||||
<video id="video3" class="centeredVideo" controls width="1024" height="576"></video>
|
<video class="centeredVideo" controls width="1024" height="576"></video>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="layui-col-md6">
|
<div class="layui-col-md6">
|
||||||
<div class="layui-card">
|
<div class="layui-card">
|
||||||
|
<div class="layui-card-header">
|
||||||
|
暂无摄像头
|
||||||
|
</div>
|
||||||
|
<div class="layui-card-body">
|
||||||
|
<video class="centeredVideo" controls width="1024" height="576"></video>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -278,82 +285,56 @@
|
|||||||
|
|
||||||
$(document).on('click', '.camera', function() {
|
$(document).on('click', '.camera', function() {
|
||||||
var id = $(this).attr('id');
|
var id = $(this).attr('id');
|
||||||
var name = $(this).find('.camera-name').text();
|
var videos = document.getElementById("videoDiv").getElementsByTagName('video');
|
||||||
var address = $(this).find('.camera-location').text();
|
for (var i = 0; i < videos.length; i++) {
|
||||||
if(video_play_list.includes(id)){
|
var v = videos[i];
|
||||||
top.dialog.msg('该摄像头已播放')
|
if(v.getAttribute('id') == id){
|
||||||
return;
|
top.dialog.msg('该摄像头已播放')
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (v.paused && v.currentTime == 0) {
|
||||||
|
v.setAttribute('id',id);
|
||||||
|
initVideo(videos[i], id)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(i == videos.length - 1){
|
||||||
|
top.dialog.msg('所有播放窗口已占用');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
//video_play(id);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// 播放
|
|
||||||
var video_play = function (id) {
|
|
||||||
|
// 初始化video
|
||||||
|
var initVideo = function(vElement, id){
|
||||||
top.restAjax.get(top.restAjax.path('api/camera/camera-pullflow/{cityCameraId}', [id]), {}, null, function(code, data) {
|
top.restAjax.get(top.restAjax.path('api/camera/camera-pullflow/{cityCameraId}', [id]), {}, null, function(code, data) {
|
||||||
var play_url = data.data.data;
|
var card = vElement.parentNode.parentNode;
|
||||||
video_play_list.push(id);
|
var cardHeader = card.getElementsByClassName("layui-card-header")[0];
|
||||||
switch (video_play_list.length) {
|
cardHeader.innerText = data.cameraName;
|
||||||
case 1:
|
if (flvjs.isSupported()) {
|
||||||
initVideo(document.getElementById('video1'), play_url);
|
var flvPlayer = flvjs.createPlayer({
|
||||||
break;
|
type: 'flv',
|
||||||
case 2:
|
enableWorker: true, //浏览器端开启flv.js的worker,多进程运行flv.js
|
||||||
initVideo(document.getElementById('video2'), play_url);
|
isLive: true, //直播模式
|
||||||
break;
|
autoplay: true, // 设置自动播放
|
||||||
case 3:
|
hasAudio: true, //关闭音频
|
||||||
initVideo(document.getElementById('video3'), play_url);
|
hasVideo: true,
|
||||||
break;
|
stashInitialSize: 128,
|
||||||
case 4:
|
enableStashBuffer: true, //播放flv时,设置是否启用播放缓存,只在直播起作用。
|
||||||
initVideo(document.getElementById('video4'), play_url);
|
url: data.playAddress
|
||||||
break;
|
});
|
||||||
default:
|
flvPlayer.attachMediaElement(vElement)
|
||||||
console.log(video_play_list)
|
flvPlayer.load();
|
||||||
video_play_list.shift();
|
|
||||||
console.log(video_play_list)
|
|
||||||
initVideo(document.getElementById('video1'), play_url);;
|
|
||||||
}
|
}
|
||||||
}, function(code, data) {
|
}, function(code, data) {
|
||||||
top.dialog.msg(data.msg);
|
top.dialog.msg(data.msg);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// 初始化video
|
|
||||||
var initVideo = function(vElement, url){
|
|
||||||
if (flvjs.isSupported()) {
|
|
||||||
/* var vElement = document.getElementById('videoElement')*/
|
|
||||||
var flvPlayer = flvjs.createPlayer({
|
|
||||||
type: 'flv',
|
|
||||||
enableWorker: true, //浏览器端开启flv.js的worker,多进程运行flv.js
|
|
||||||
isLive: true, //直播模式
|
|
||||||
hasAudio: true, //关闭音频
|
|
||||||
hasVideo: true,
|
|
||||||
stashInitialSize: 128,
|
|
||||||
enableStashBuffer: false, //播放flv时,设置是否启用播放缓存,只在直播起作用。
|
|
||||||
url: url
|
|
||||||
});
|
|
||||||
flvPlayer.attachMediaElement(vElement)
|
|
||||||
flvPlayer.load();//加载
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// 关闭流
|
|
||||||
var closeStream = function(flvPlayer) {
|
|
||||||
flvPlayer.pause();
|
|
||||||
flvPlayer.unload();
|
|
||||||
flvPlayer.detachMediaElement();
|
|
||||||
flvPlayer.destroy();
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$(function(){
|
$(function(){
|
||||||
// 样式
|
// 样式
|
||||||
var windowHeight = $(window).height() - 50;
|
var windowHeight = $(window).height() - 75;
|
||||||
$('.camera-list .layui-card-body').css({
|
$('.camera-list .layui-card-body').css({
|
||||||
'height': (windowHeight - 50) + 'px',
|
'height': (windowHeight - 50) + 'px',
|
||||||
'overflow' : 'auto'
|
'overflow' : 'auto'
|
||||||
|
Loading…
Reference in New Issue
Block a user