更换云端录像的代理方式
parent
77e3e0878f
commit
6bc6042197
|
@ -73,7 +73,7 @@ public class ProxyServletConfig {
|
||||||
if (ioException instanceof ConnectException) {
|
if (ioException instanceof ConnectException) {
|
||||||
logger.error("zlm 连接失败");
|
logger.error("zlm 连接失败");
|
||||||
} else if (ioException instanceof ClientAbortException) {
|
} else if (ioException instanceof ClientAbortException) {
|
||||||
logger.error("用户已中断连接,代理终止");
|
logger.error("zlm: 用户已中断连接,代理终止");
|
||||||
} else {
|
} else {
|
||||||
logger.error("zlm 代理失败: ", e);
|
logger.error("zlm 代理失败: ", e);
|
||||||
}
|
}
|
||||||
|
@ -141,4 +141,102 @@ public class ProxyServletConfig {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public ServletRegistrationBean recordServletRegistrationBean(){
|
||||||
|
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new RecordProxySerlet(),"/record_proxy/*");
|
||||||
|
servletRegistrationBean.setName("record_proxy");
|
||||||
|
servletRegistrationBean.addInitParameter("targetUri", "http://127.0.0.1:18081");
|
||||||
|
servletRegistrationBean.addUrlMappings();
|
||||||
|
if (logger.isDebugEnabled()) {
|
||||||
|
servletRegistrationBean.addInitParameter("log", "true");
|
||||||
|
}
|
||||||
|
return servletRegistrationBean;
|
||||||
|
}
|
||||||
|
|
||||||
|
class RecordProxySerlet extends ProxyServlet{
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 异常处理
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void handleRequestException(HttpRequest proxyRequest, HttpResponse proxyResonse, Exception e){
|
||||||
|
try {
|
||||||
|
super.handleRequestException(proxyRequest, proxyResonse, e);
|
||||||
|
} catch (ServletException servletException) {
|
||||||
|
logger.error("录像服务 代理失败: ", e);
|
||||||
|
} catch (IOException ioException) {
|
||||||
|
if (ioException instanceof ConnectException) {
|
||||||
|
logger.error("录像服务 连接失败");
|
||||||
|
} else if (ioException instanceof ClientAbortException) {
|
||||||
|
logger.error("录像服务:用户已中断连接,代理终止");
|
||||||
|
} else {
|
||||||
|
logger.error("录像服务 代理失败: ", e);
|
||||||
|
}
|
||||||
|
} catch (RuntimeException exception){
|
||||||
|
logger.error("录像服务 代理失败: ", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 对于为按照格式请求的可以直接返回404
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected String getTargetUri(HttpServletRequest servletRequest) {
|
||||||
|
String requestURI = servletRequest.getRequestURI();
|
||||||
|
IMediaServerItem mediaInfo = getMediaInfoByUri(requestURI);
|
||||||
|
|
||||||
|
String uri = null;
|
||||||
|
if (mediaInfo != null) {
|
||||||
|
// String realRequestURI = requestURI.substring(requestURI.indexOf(mediaInfo.getId())+ mediaInfo.getId().length());
|
||||||
|
uri = String.format("http://%s:%s", mediaInfo.getIp(), mediaInfo.getRecordAssistPort());
|
||||||
|
}else {
|
||||||
|
uri = "http://127.0.0.1:" + serverPort +"/index/hook/null"; // 只是一个能返回404的请求而已, 其他的也可以
|
||||||
|
}
|
||||||
|
return uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 动态替换请求目标
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected HttpHost getTargetHost(HttpServletRequest servletRequest) {
|
||||||
|
String requestURI = servletRequest.getRequestURI();
|
||||||
|
IMediaServerItem mediaInfo = getMediaInfoByUri(requestURI);
|
||||||
|
HttpHost host;
|
||||||
|
if (mediaInfo != null) {
|
||||||
|
host = new HttpHost(mediaInfo.getIp(), mediaInfo.getRecordAssistPort());
|
||||||
|
}else {
|
||||||
|
host = new HttpHost("127.0.0.1", serverPort);
|
||||||
|
}
|
||||||
|
return host;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据uri获取流媒体信息
|
||||||
|
*/
|
||||||
|
IMediaServerItem getMediaInfoByUri(String uri){
|
||||||
|
String[] split = uri.split("/");
|
||||||
|
String mediaServerId = split[2];
|
||||||
|
return mediaServerService.getOne(mediaServerId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 去掉url中的标志信息
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected String rewriteUrlFromRequest(HttpServletRequest servletRequest) {
|
||||||
|
String requestURI = servletRequest.getRequestURI();
|
||||||
|
IMediaServerItem mediaInfo = getMediaInfoByUri(requestURI);
|
||||||
|
String url = super.rewriteUrlFromRequest(servletRequest);
|
||||||
|
if (mediaInfo == null) {
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
return url.replace(mediaInfo.getId() + "/", "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,79 +0,0 @@
|
||||||
package com.genersoft.iot.vmp.vmanager.record;
|
|
||||||
|
|
||||||
import com.genersoft.iot.vmp.conf.MediaConfig;
|
|
||||||
import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig;
|
|
||||||
import com.genersoft.iot.vmp.media.zlm.dto.IMediaServerItem;
|
|
||||||
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
|
|
||||||
import com.genersoft.iot.vmp.service.IMediaServerService;
|
|
||||||
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.util.StringUtils;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
import org.springframework.web.client.HttpClientErrorException;
|
|
||||||
import org.springframework.web.client.RestTemplate;
|
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
|
|
||||||
import java.io.UnsupportedEncodingException;
|
|
||||||
import java.net.URLDecoder;
|
|
||||||
|
|
||||||
@RestController
|
|
||||||
@RequestMapping("/record_proxy")
|
|
||||||
public class RecoderProxyController {
|
|
||||||
|
|
||||||
|
|
||||||
// private final static Logger logger = LoggerFactory.getLogger(ZLMHTTPProxyController.class);
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private IRedisCatchStorage redisCatchStorage;
|
|
||||||
@Autowired
|
|
||||||
private IMediaServerService mediaServerService;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private MediaConfig mediaConfig;
|
|
||||||
|
|
||||||
@ResponseBody
|
|
||||||
@RequestMapping(value = "/**/**/**", produces = "application/json;charset=UTF-8")
|
|
||||||
public Object proxy(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException{
|
|
||||||
|
|
||||||
|
|
||||||
String baseRequestURI = request.getRequestURI();
|
|
||||||
String[] split = baseRequestURI.split("/");
|
|
||||||
if (split.length <= 2) {
|
|
||||||
response.setStatus(HttpStatus.NOT_FOUND.value());
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
String mediaId = split[2];
|
|
||||||
if (StringUtils.isEmpty(mediaId)){
|
|
||||||
response.setStatus(HttpStatus.BAD_REQUEST.value());
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
// 后续改为根据Id获取对应的ZLM
|
|
||||||
IMediaServerItem mediaInfo = mediaServerService.getOne(mediaId);
|
|
||||||
if (mediaInfo == null) {
|
|
||||||
response.setStatus(HttpStatus.NOT_FOUND.value());
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
String requestURI = String.format("http://%s:%s%s?%s",
|
|
||||||
mediaInfo.getSdpIp(),
|
|
||||||
mediaConfig.getRecordAssistPort(),
|
|
||||||
baseRequestURI.substring(baseRequestURI.indexOf(mediaId) + mediaId.length()),
|
|
||||||
URLDecoder.decode(request.getQueryString(), "UTF-8")
|
|
||||||
);
|
|
||||||
// 发送请求
|
|
||||||
RestTemplate restTemplate = new RestTemplate();
|
|
||||||
//将指定的url返回的参数自动封装到自定义好的对应类对象中
|
|
||||||
Object result = null;
|
|
||||||
try {
|
|
||||||
result = restTemplate.getForObject(requestURI,Object.class);
|
|
||||||
|
|
||||||
}catch (HttpClientErrorException httpClientErrorException) {
|
|
||||||
response.setStatus(httpClientErrorException.getStatusCode().value());
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -8,7 +8,8 @@
|
||||||
<div style="background-color: #FFFFFF; margin-bottom: 1rem; position: relative; padding: 0.5rem; text-align: left;">
|
<div style="background-color: #FFFFFF; margin-bottom: 1rem; position: relative; padding: 0.5rem; text-align: left;">
|
||||||
<span style="font-size: 1rem; font-weight: bold;">云端录像</span>
|
<span style="font-size: 1rem; font-weight: bold;">云端录像</span>
|
||||||
<div style="position: absolute; right: 5rem; top: 0.3rem;">
|
<div style="position: absolute; right: 5rem; top: 0.3rem;">
|
||||||
节点选择: <el-select size="mini" @change="chooseMediaChange" style="width: 16rem; margin-right: 1rem;" v-model="mediaServerId" placeholder="请选择">
|
节点选择:
|
||||||
|
<el-select size="mini" @change="chooseMediaChange" style="width: 16rem; margin-right: 1rem;" v-model="mediaServerId" placeholder="请选择" :disabled="recordDetail">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in mediaServerList"
|
v-for="item in mediaServerList"
|
||||||
:key="item.id"
|
:key="item.id"
|
||||||
|
|
Loading…
Reference in New Issue