1, update spring boot version to 2.5.2
2, fix video record playback bugspull/184/head
parent
b922898129
commit
5333a4d7ae
18
pom.xml
18
pom.xml
|
@ -6,12 +6,12 @@
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-parent</artifactId>
|
<artifactId>spring-boot-starter-parent</artifactId>
|
||||||
<version>2.3.5.RELEASE</version>
|
<version>2.5.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<groupId>com.genersoft</groupId>
|
<groupId>com.genersoft</groupId>
|
||||||
<artifactId>wvp-pro</artifactId>
|
<artifactId>wvp-pro</artifactId>
|
||||||
<version>2.0</version>
|
<version>2.0.1</version>
|
||||||
<name>web video platform</name>
|
<name>web video platform</name>
|
||||||
<description>国标28181视频平台</description>
|
<description>国标28181视频平台</description>
|
||||||
|
|
||||||
|
@ -240,6 +240,20 @@
|
||||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
<configuration>
|
<configuration>
|
||||||
<includeSystemScope>true</includeSystemScope>
|
<includeSystemScope>true</includeSystemScope>
|
||||||
|
<image>
|
||||||
|
<name>registry.kilox.com/local/${project.artifactId}:${project.version}</name>
|
||||||
|
<publish>true</publish>
|
||||||
|
</image>
|
||||||
|
<!--配置构建宿主机信息,本机不用配置-->
|
||||||
|
<docker>
|
||||||
|
<host>http://172.16.2.88:2375</host>
|
||||||
|
<tlsVerify>false</tlsVerify>
|
||||||
|
<publishRegistry>
|
||||||
|
<username>1</username>
|
||||||
|
<password>1</password>
|
||||||
|
<url>registry.kilox.com</url>
|
||||||
|
</publishRegistry>
|
||||||
|
</docker>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
|
|
|
@ -99,13 +99,13 @@ public class SIPRequestHeaderProvider {
|
||||||
return request;
|
return request;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Request createPlaybackInviteRequest(Device device, String channelId, String content, String viaTag, String fromTag, String toTag, CallIdHeader callIdHeader) throws ParseException, InvalidArgumentException, PeerUnavailableException {
|
public Request createPlaybackInviteRequest(Device device, String channelId, String content, String viaTag, String fromTag, String toTag,String ssrc, CallIdHeader callIdHeader) throws ParseException, InvalidArgumentException, PeerUnavailableException {
|
||||||
Request request = null;
|
Request request = null;
|
||||||
//请求行
|
//请求行
|
||||||
SipURI requestLine = sipFactory.createAddressFactory().createSipURI(device.getDeviceId(), device.getHostAddress());
|
SipURI requestLine = sipFactory.createAddressFactory().createSipURI(channelId, device.getHostAddress());
|
||||||
// via
|
// via
|
||||||
ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
|
ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
|
||||||
ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(device.getIp(), device.getPort(), device.getTransport(), viaTag);
|
ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getIp(), device.getPort(), device.getTransport(), viaTag);
|
||||||
viaHeader.setRPort();
|
viaHeader.setRPort();
|
||||||
viaHeaders.add(viaHeader);
|
viaHeaders.add(viaHeader);
|
||||||
//from
|
//from
|
||||||
|
@ -128,6 +128,11 @@ public class SIPRequestHeaderProvider {
|
||||||
// Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), device.getHost().getIp()+":"+device.getHost().getPort()));
|
// Address concatAddress = sipFactory.createAddressFactory().createAddress(sipFactory.createAddressFactory().createSipURI(sipConfig.getId(), device.getHost().getIp()+":"+device.getHost().getPort()));
|
||||||
request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress));
|
request.addHeader(sipFactory.createHeaderFactory().createContactHeader(concatAddress));
|
||||||
|
|
||||||
|
|
||||||
|
// Subject
|
||||||
|
SubjectHeader subjectHeader = sipFactory.createHeaderFactory().createSubjectHeader(String.format("%s:%s,%s:%s", channelId, ssrc, sipConfig.getId(), 0));
|
||||||
|
request.addHeader(subjectHeader);
|
||||||
|
|
||||||
ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP");
|
ContentTypeHeader contentTypeHeader = sipFactory.createHeaderFactory().createContentTypeHeader("APPLICATION", "SDP");
|
||||||
request.setContent(content, contentTypeHeader);
|
request.setContent(content, contentTypeHeader);
|
||||||
return request;
|
return request;
|
||||||
|
|
|
@ -468,7 +468,7 @@ public class SIPCommander implements ISIPCommander {
|
||||||
|
|
||||||
StringBuffer content = new StringBuffer(200);
|
StringBuffer content = new StringBuffer(200);
|
||||||
content.append("v=0\r\n");
|
content.append("v=0\r\n");
|
||||||
content.append("o="+sipConfig.getId()+" 0 0 IN IP4 "+sipConfig.getIp()+"\r\n");
|
content.append("o="+"00000"+" 0 0 IN IP4 "+mediaServerItem.getSdpIp()+"\r\n");
|
||||||
content.append("s=Playback\r\n");
|
content.append("s=Playback\r\n");
|
||||||
content.append("u="+channelId+":0\r\n");
|
content.append("u="+channelId+":0\r\n");
|
||||||
content.append("c=IN IP4 "+mediaServerItem.getSdpIp()+"\r\n");
|
content.append("c=IN IP4 "+mediaServerItem.getSdpIp()+"\r\n");
|
||||||
|
@ -532,7 +532,7 @@ public class SIPCommander implements ISIPCommander {
|
||||||
CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
|
CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
|
||||||
: udpSipProvider.getNewCallId();
|
: udpSipProvider.getNewCallId();
|
||||||
|
|
||||||
Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, "fromplybck" + tm, null, callIdHeader);
|
Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, "fromplybck" + tm, null,ssrcInfo.getSsrc(), callIdHeader);
|
||||||
|
|
||||||
transmitRequest(device, request, errorEvent, okEvent -> {
|
transmitRequest(device, request, errorEvent, okEvent -> {
|
||||||
Dialog dialog = okEvent.getClientTransaction().getDialog();
|
Dialog dialog = okEvent.getClientTransaction().getDialog();
|
||||||
|
@ -640,7 +640,7 @@ public class SIPCommander implements ISIPCommander {
|
||||||
CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
|
CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
|
||||||
: udpSipProvider.getNewCallId();
|
: udpSipProvider.getNewCallId();
|
||||||
|
|
||||||
Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, "fromplybck" + tm, null, callIdHeader);
|
Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, "fromplybck" + tm, null,"1" + ssrcInfo.getSsrc().substring(1), callIdHeader);
|
||||||
|
|
||||||
ClientTransaction transaction = transmitRequest(device, request, errorEvent);
|
ClientTransaction transaction = transmitRequest(device, request, errorEvent);
|
||||||
streamSession.put(device.getDeviceId(), channelId, ssrcInfo.getSsrc(), ssrcInfo.getStreamId(), mediaServerItem.getId(), transaction);
|
streamSession.put(device.getDeviceId(), channelId, ssrcInfo.getSsrc(), ssrcInfo.getStreamId(), mediaServerItem.getId(), transaction);
|
||||||
|
|
|
@ -35,7 +35,7 @@ public interface IMediaServerService {
|
||||||
void setZLMConfig(MediaServerItem mediaServerItem);
|
void setZLMConfig(MediaServerItem mediaServerItem);
|
||||||
|
|
||||||
SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId);
|
SSRCInfo openRTPServer(MediaServerItem mediaServerItem, String streamId);
|
||||||
|
SSRCInfo openRTPServer1(MediaServerItem mediaServerItem, String streamId);
|
||||||
void closeRTPServer(Device device, String channelId);
|
void closeRTPServer(Device device, String channelId);
|
||||||
|
|
||||||
void clearRTPServer(MediaServerItem mediaServerItem);
|
void clearRTPServer(MediaServerItem mediaServerItem);
|
||||||
|
|
|
@ -120,6 +120,32 @@ public class MediaServerServiceImpl implements IMediaServerService, CommandLineR
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SSRCInfo openRTPServer1(MediaServerItem mediaServerItem, String streamId) {
|
||||||
|
if (mediaServerItem == null || mediaServerItem.getId() == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// 获取mediaServer可用的ssrc
|
||||||
|
String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + mediaServerItem.getId();
|
||||||
|
|
||||||
|
SsrcConfig ssrcConfig = mediaServerItem.getSsrcConfig();
|
||||||
|
if (ssrcConfig == null) {
|
||||||
|
logger.info("media server [ {} ] ssrcConfig is null", mediaServerItem.getId());
|
||||||
|
return null;
|
||||||
|
}else {
|
||||||
|
String ssrc = ssrcConfig.getPlayBackSsrc();
|
||||||
|
if (streamId == null) {
|
||||||
|
streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase();
|
||||||
|
}
|
||||||
|
int rtpServerPort = mediaServerItem.getRtpProxyPort();
|
||||||
|
if (mediaServerItem.isRtpEnable()) {
|
||||||
|
rtpServerPort = zlmrtpServerFactory.createRTPServer(mediaServerItem, streamId);
|
||||||
|
}
|
||||||
|
redisUtil.set(key, mediaServerItem);
|
||||||
|
return new SSRCInfo(rtpServerPort, ssrc, streamId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void closeRTPServer(Device device, String channelId) {
|
public void closeRTPServer(Device device, String channelId) {
|
||||||
String mediaServerId = streamSession.getMediaServerId(device.getDeviceId(), channelId);
|
String mediaServerId = streamSession.getMediaServerId(device.getDeviceId(), channelId);
|
||||||
|
|
|
@ -103,7 +103,7 @@ public class DownloadController {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null);
|
SSRCInfo ssrcInfo = mediaServerService.openRTPServer1(newMediaServerItem, null);
|
||||||
|
|
||||||
cmder.downloadStreamCmd(newMediaServerItem, ssrcInfo, device, channelId, startTime, endTime, downloadSpeed, (MediaServerItem mediaServerItem, JSONObject response) -> {
|
cmder.downloadStreamCmd(newMediaServerItem, ssrcInfo, device, channelId, startTime, endTime, downloadSpeed, (MediaServerItem mediaServerItem, JSONObject response) -> {
|
||||||
logger.info("收到订阅消息: " + response.toJSONString());
|
logger.info("收到订阅消息: " + response.toJSONString());
|
||||||
|
|
|
@ -85,7 +85,7 @@ public class PlaybackController {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
MediaServerItem newMediaServerItem = playService.getNewMediaServerItem(device);
|
MediaServerItem newMediaServerItem = playService.getNewMediaServerItem(device);
|
||||||
SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null);
|
SSRCInfo ssrcInfo = mediaServerService.openRTPServer1(newMediaServerItem, null);
|
||||||
|
|
||||||
// 超时处理
|
// 超时处理
|
||||||
result.onTimeout(()->{
|
result.onTimeout(()->{
|
||||||
|
|
|
@ -2,9 +2,9 @@ spring:
|
||||||
# REDIS数据库配置
|
# REDIS数据库配置
|
||||||
redis:
|
redis:
|
||||||
# [必须修改] Redis服务器IP, REDIS安装在本机的,使用127.0.0.1
|
# [必须修改] Redis服务器IP, REDIS安装在本机的,使用127.0.0.1
|
||||||
host: 127.0.0.1
|
host: 172.16.2.230
|
||||||
# [必须修改] 端口号
|
# [必须修改] 端口号
|
||||||
port: 6379
|
port: 26379
|
||||||
# [可选] 数据库 DB
|
# [可选] 数据库 DB
|
||||||
database: 6
|
database: 6
|
||||||
# [可选] 访问密码,若你的redis服务器没有设置密码,就不需要用密码去连接
|
# [可选] 访问密码,若你的redis服务器没有设置密码,就不需要用密码去连接
|
||||||
|
@ -14,20 +14,13 @@ spring:
|
||||||
# [可选] jdbc数据库配置, 项目使用sqlite作为数据库,一般不需要配置
|
# [可选] jdbc数据库配置, 项目使用sqlite作为数据库,一般不需要配置
|
||||||
datasource:
|
datasource:
|
||||||
# 使用mysql 打开23-28行注释, 删除29-36行
|
# 使用mysql 打开23-28行注释, 删除29-36行
|
||||||
# name: wvp
|
name: wvp
|
||||||
# url: jdbc:mysql://127.0.0.1:3306/wvp?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true
|
url: jdbc:mysql://172.16.2.230:23306/wvp?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true
|
||||||
# username:
|
username: wvp
|
||||||
# password:
|
password: mysql@wvp
|
||||||
# type: com.alibaba.druid.pool.DruidDataSource
|
|
||||||
# driver-class-name: com.mysql.cj.jdbc.Driver
|
|
||||||
name: eiot
|
|
||||||
url: jdbc:sqlite::resource:wvp.sqlite
|
|
||||||
username:
|
|
||||||
password:
|
|
||||||
type: com.alibaba.druid.pool.DruidDataSource
|
type: com.alibaba.druid.pool.DruidDataSource
|
||||||
driver-class-name: org.sqlite.JDBC
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
max-active: 1
|
|
||||||
min-idle: 1
|
|
||||||
|
|
||||||
# [可选] WVP监听的HTTP端口, 网页和接口调用都是这个端口
|
# [可选] WVP监听的HTTP端口, 网页和接口调用都是这个端口
|
||||||
server:
|
server:
|
||||||
|
@ -36,7 +29,7 @@ server:
|
||||||
# 作为28181服务器的配置
|
# 作为28181服务器的配置
|
||||||
sip:
|
sip:
|
||||||
# [必须修改] 本机的IP
|
# [必须修改] 本机的IP
|
||||||
ip: 192.168.0.100
|
ip: 172.16.2.66
|
||||||
# [可选] 28181服务监听的端口
|
# [可选] 28181服务监听的端口
|
||||||
port: 5060
|
port: 5060
|
||||||
# 根据国标6.1.2中规定,domain宜采用ID统一编码的前十位编码。国标附录D中定义前8位为中心编码(由省级、市级、区级、基层编号组成,参照GB/T 2260-2007)
|
# 根据国标6.1.2中规定,domain宜采用ID统一编码的前十位编码。国标附录D中定义前8位为中心编码(由省级、市级、区级、基层编号组成,参照GB/T 2260-2007)
|
||||||
|
@ -52,9 +45,9 @@ sip:
|
||||||
#zlm 默认服务器配置
|
#zlm 默认服务器配置
|
||||||
media:
|
media:
|
||||||
# [必须修改] zlm服务器的内网IP
|
# [必须修改] zlm服务器的内网IP
|
||||||
ip: 127.0.0.1
|
ip: 172.16.2.230
|
||||||
# [必须修改] zlm服务器的http.port
|
# [必须修改] zlm服务器的http.port
|
||||||
http-port: 80
|
http-port: 3080
|
||||||
# [可选] zlm服务器的hook.admin_params=secret
|
# [可选] zlm服务器的hook.admin_params=secret
|
||||||
secret: 035c73f7-bb6b-4889-a715-d9eb2d1925cc
|
secret: 035c73f7-bb6b-4889-a715-d9eb2d1925cc
|
||||||
# 启用多端口模式, 多端口模式使用端口区分每路流,兼容性更好。 单端口使用流的ssrc区分, 点播超时建议使用多端口测试
|
# 启用多端口模式, 多端口模式使用端口区分每路流,兼容性更好。 单端口使用流的ssrc区分, 点播超时建议使用多端口测试
|
||||||
|
@ -62,9 +55,8 @@ media:
|
||||||
# [可选] 是否启用多端口模式, 开启后会在portRange范围内选择端口用于媒体流传输
|
# [可选] 是否启用多端口模式, 开启后会在portRange范围内选择端口用于媒体流传输
|
||||||
enable: true
|
enable: true
|
||||||
# [可选] 在此范围内选择端口用于媒体流传输,
|
# [可选] 在此范围内选择端口用于媒体流传输,
|
||||||
port-range: 30000,30500 # 端口范围
|
port-range: 30000,30100 # 端口范围
|
||||||
# [可选] 国标级联在此范围内选择端口发送媒体流,
|
send-port-range': 30000,30100
|
||||||
send-port-range: 30000,30500 # 端口范围
|
|
||||||
# 录像辅助服务, 部署此服务可以实现zlm录像的管理与下载, 0 表示不使用
|
# 录像辅助服务, 部署此服务可以实现zlm录像的管理与下载, 0 表示不使用
|
||||||
record-assist-port: 0
|
record-assist-port: 0
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
spring:
|
spring:
|
||||||
profiles:
|
profiles:
|
||||||
active: local
|
active: dev
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2,9 +2,7 @@ package com.genersoft.iot.vmp.service.impl;
|
||||||
|
|
||||||
import com.genersoft.iot.vmp.gb28181.bean.DeviceAlarm;
|
import com.genersoft.iot.vmp.gb28181.bean.DeviceAlarm;
|
||||||
import com.genersoft.iot.vmp.service.IDeviceAlarmService;
|
import com.genersoft.iot.vmp.service.IDeviceAlarmService;
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
import org.springframework.test.context.junit4.SpringRunner;
|
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
|
@ -12,7 +10,7 @@ import java.util.Date;
|
||||||
|
|
||||||
|
|
||||||
@SpringBootTest
|
@SpringBootTest
|
||||||
@RunWith(SpringRunner.class)
|
|
||||||
class DeviceAlarmServiceImplTest {
|
class DeviceAlarmServiceImplTest {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
|
|
|
@ -1,12 +1,8 @@
|
||||||
package com.genersoft.iot.vmp.service.impl;
|
package com.genersoft.iot.vmp.service.impl;
|
||||||
|
|
||||||
import com.genersoft.iot.vmp.service.IRoleService;
|
import com.genersoft.iot.vmp.service.IRoleService;
|
||||||
import com.genersoft.iot.vmp.service.IUserService;
|
|
||||||
import com.genersoft.iot.vmp.storager.dao.dto.Role;
|
import com.genersoft.iot.vmp.storager.dao.dto.Role;
|
||||||
import com.genersoft.iot.vmp.storager.dao.dto.User;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
import org.springframework.test.context.junit4.SpringRunner;
|
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
|
@ -14,7 +10,7 @@ import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
@SpringBootTest
|
@SpringBootTest
|
||||||
@RunWith(SpringRunner.class)
|
|
||||||
class RoleServiceImplTest {
|
class RoleServiceImplTest {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
|
|
|
@ -1,22 +1,17 @@
|
||||||
package com.genersoft.iot.vmp.service.impl;
|
package com.genersoft.iot.vmp.service.impl;
|
||||||
|
|
||||||
import com.genersoft.iot.vmp.gb28181.bean.DeviceAlarm;
|
|
||||||
import com.genersoft.iot.vmp.service.IDeviceAlarmService;
|
|
||||||
import com.genersoft.iot.vmp.service.IUserService;
|
import com.genersoft.iot.vmp.service.IUserService;
|
||||||
import com.genersoft.iot.vmp.storager.dao.dto.Role;
|
import com.genersoft.iot.vmp.storager.dao.dto.Role;
|
||||||
import com.genersoft.iot.vmp.storager.dao.dto.User;
|
import com.genersoft.iot.vmp.storager.dao.dto.User;
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
import org.springframework.test.context.junit4.SpringRunner;
|
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
@SpringBootTest
|
@SpringBootTest
|
||||||
@RunWith(SpringRunner.class)
|
|
||||||
class UserServiceImplTest {
|
class UserServiceImplTest {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue