JAVA从url中分离ip和port

本文介绍了一个用于从URL中解析出主机IP及端口的Java类NetAddrUtil,包括从URL中提取IP地址和同时提取IP与端口号的功能实现。

具体代码:

public class NetAddrUtil {
	/**
	 * 从url中分析出hostIP<br/>
	 * @param url
	 * @author wull 
	 * @return
	 */
	public static String getIpFromUrl(String url) {
		// 1.判断是否为空
		if (url == null || url.trim().equals("")) {
			return "";
		}
		
		// 2. 如果是以localhost,那么替换成127.0.0.1
		if(url.startsWith("http://" + C.Net.LOCALHOST_STR) ){
			url = url.replace("http://" + C.Net.LOCALHOST_STR, "http://" + C.Net.LOCALHOST_NUM) ;
		}
		
		String host = "";
		Pattern p = Pattern.compile("(?<=//|)((\\w)+\\.)+\\w+");
		Matcher matcher = p.matcher(url);
		if (matcher.find()) {
			host = matcher.group();
		}
		return host;
	}
	
	/**
	 * 从url中分析出hostIP:PORT<br/>
	 * @param url
	 * @author wull	 */
	public static IpPortAddr getIpPortFromUrl(String url) {
		// 1.判断是否为空
		if (url == null || url.trim().equals("")) {
			return null;
		}
		
		// 2. 如果是以localhost,那么替换成127.0.0.1
		if(url.startsWith("http://" + C.Net.LOCALHOST_STR) ){
			url = url.replace("http://" + C.Net.LOCALHOST_STR, "http://" + C.Net.LOCALHOST_NUM) ;
		}
		
		String host = "";
		Pattern p = Pattern.compile("(?<=//|)((\\w)+\\.)+\\w+(:\\d{0,5})?");
		Matcher matcher = p.matcher(url);
		if (matcher.find()) {
			host = matcher.group() ;
		}
		
		// 如果
		if(host.contains(":") == false){
			return new IpPortAddr(host, 80 );
		}
		
		String[] ipPortArr = host.split(":");
		return new IpPortAddr(ipPortArr[0] , ConfigUtil.parseInt( ipPortArr[1] ));
	}
	
	public static void main(String [] args){
		String url = "http://10.33.32.81:8080/login.action";
		System.out.println(NetAddrUtil.getIpFromUrl(url) );
		IpPortAddr addr= NetAddrUtil.getIpPortFromUrl(url) ;
		System.out.println(addr.getIp() +"=========>" +addr.getPort() );
	}
}

 

执行结果:

10.33.32.81
10.33.32.81=========>8080

 


10.33.32.81
10.33.32.81=========>8080


 

 

<think>嗯,用户的问题是关于在Java中使用VideoCapture类通过RTSP URL初始化失败的情况,需要解决方案。首先,我应该回忆一下OpenCV在Java中处理RTSP流的常见问题。根据提供的引用,有几个可能的原因解决方法。 首先,用户提到的错误是“Width (0) and height (0) must be > 0”,这说明VideoCapture成功打开了连接,但无法获取有效的帧数据。这可能RTSP流的兼容性或编解码支持有关。比如,OpenCV可能不支持某些RTSP流的编码格式,或者需要特定的后端配置。比如引用3中提到,可能需要设置环境变量OPENCV_FFMPEG_CAPTURE_OPTIONS来调整参数,或者使用FFmpeg的支持,这可能是一个解决方向。 其次,RTSP URL的格式是否正确?引用1中的示例URL有特殊字符,比如问号&符号,可能需要转义处理。Java中字符串处理是否正确?比如是否使用了正确的转义符,或者在构造URL时是否正确编码了参数。例如,用户提到的URL中有“&”,这可能是HTML转义后的结果,实际在Java中应该用“&”符号,并且可能需要用双引号包裹整个URL,避免参数被截断。 另外,权限问题也是一个可能性。用户提供的RTSP URL中是否包含正确的用户名密码?比如引用3中的例子是“rtsp://admin:abc123456@192.168.1.64...”,格式是否正确?需要检查登录凭证是否正确,并且摄像头是否允许该用户访问。 还有,网络连接的问题。比如摄像头是否可达,端口是否开放,防火墙是否阻止了连接。可能需要先用其他工具如VLC测试RTSP流是否正常,确认URL有效。 另外,OpenCV版本是否支持RTSP流?比如引用4中使用的是较旧的CvCapture,而新版本可能使用VideoCapture,但不同版本的OpenCV可能有不同的支持情况。用户是否使用了正确的OpenCV版本,并且编译时包含了FFmpeg支持?例如,引用2提到的实时视频流传输项目可能需要特定的编译选项,如果OpenCV没有正确编译,可能导致RTSP支持不足。 还有,初始化后的延迟崩溃问题,如引用3提到的,可能需要多线程处理,避免主线程阻塞。比如在单独的线程中捕获帧,然后主线程进行处理显示,这样可以避免UI冻结崩溃。 总结可能的解决步骤:首先验证RTSP URL的正确性,使用VLC测试;检查OpenCV编译时的FFmpeg支持;调整OpenCV的参数,如使用FFMPEG backend,设置环境变量;处理URL中的特殊字符;检查网络连接权限;使用多线程处理视频捕获以避免阻塞;尝试不同的OpenCV版本或后端选项。</think>### 解答:Java中VideoCapture通过RTSP_URL初始化失败的解决方案 #### 1. **验证RTSP流的有效性** - 使用第三方工具(如VLC播放器)测试RTSP流是否能正常播放。 - 如果VLC也无法播放,需检查摄像头权限、网络连通性、端口开放性及URL格式[^1][^3]。 - 正确URL格式示例:`rtsp://username:password@ip:port/path`,注意避免特殊字符(如`&`需转义为`&`)。 #### 2. **检查OpenCV编译配置** - OpenCV需**启用FFmpeg支持**才能处理RTSP流。 - 若使用预编译库,可能需自行编译OpenCV并包含FFmpeg选项[^2][^3]。 - 验证命令:`System.loadLibrary(Core.NATIVE_LIBRARY_NAME);` 后输出支持的编解码器列表。 #### 3. **设置环境变量调整参数** - 通过环境变量强制指定协议或优化解码参数: ```java // 在初始化VideoCapture前设置 System.setProperty("OPENCV_FFMPEG_CAPTURE_OPTIONS", "rtsp_transport;tcp"); // 使用TCP传输减少丢包 VideoCapture cap = new VideoCapture("rtsp://..."); ``` 此方法可解决部分协议兼容性问题。 #### 4. **多线程处理视频流** - 视频流捕获可能阻塞主线程,导致初始化失败或崩溃。 ```java // 示例:在独立线程中捕获帧 new Thread(() -> { while (true) { Mat frame = new Mat(); if (cap.read(frame) && !frame.empty()) { // 处理帧 } } }).start(); ``` 引用[^3]中通过多线程分离捕获与处理逻辑,避免UI阻塞。 #### 5. **尝试其他后端或协议** - OpenCV的`VideoCapture`默认后端可能不支持特定RTSP流,可尝试: - 使用GStreamer后端(需配置管道)。 - 改用HTTP协议(如将RTSP转换为HTTP流)[^4]。 #### 6. **代码示例(含异常处理)** ```java public static void main(String[] args) { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); System.setProperty("OPENCV_FFMPEG_CAPTURE_OPTIONS", "rtsp_transport;tcp"); VideoCapture cap = new VideoCapture(); cap.open("rtsp://admin:password@192.168.1.64:554/stream"); if (!cap.isOpened()) { System.err.println("初始化失败"); return; } Mat frame = new Mat(); while (cap.read(frame)) { if (frame.empty()) continue; // 显示或处理帧 } cap.release(); } ``` #### 7. **调试与日志分析** - 启用OpenCV日志输出,检查底层错误: ```java // 设置日志级别 opencv.core.LogLevel.setLogLevel(opencv.core.LogLevel.LOG_LEVEL_VERBOSE); ``` --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值