Ver código fonte

优化了一些

MisterZhang 4 anos atrás
pai
commit
f051da8913

+ 7 - 4
pom.xml

@@ -47,10 +47,13 @@
 			</exclusions>
 		</dependency>
 
-		<!-- <dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv-platform</artifactId> 
-			<version>1.5.4</version> </dependency> -->
-
 		<dependency>
+			<groupId>org.bytedeco</groupId>
+			<artifactId>javacv-platform</artifactId>
+			<version>1.5.4</version>
+		</dependency>
+
+<!-- 		<dependency>
 			<groupId>org.bytedeco</groupId>
 			<artifactId>javacv</artifactId>
 			<version>1.5.4</version>
@@ -60,7 +63,7 @@
 			<groupId>org.bytedeco</groupId>
 			<artifactId>ffmpeg-platform</artifactId>
 			<version>4.3.1-1.5.4</version>
-		</dependency>
+		</dependency> -->
 
 
 		<dependency>

+ 22 - 2
src/main/java/com/zj/entity/Camera.java

@@ -19,14 +19,34 @@ public class Camera implements Serializable {
 	private static final long serialVersionUID = -5575352151805386129L;
 	
 	private String id;
+	
 	/**
-	 * rtsp、rtmp、d:/flv/test.mp4
+	 * rtsp、rtmp、d:/flv/test.mp4、desktop
 	 */
 	private String url;
+	
+	/**
+	 * 流备注
+	 */
 	private String remark;
 	
+	/**
+	 * flv开启状态
+	 */
 	private boolean status;
 	
-	//0网络流,1本地视频
+	/**
+	 * hls开启状态
+	 */
+	private boolean hlsStatus;
+	
+	/**
+	 * md5 key,媒体标识
+	 */
+	private String mediaKey;
+	
+	/**
+	 * 0网络流,1本地视频
+	 */
 	private int type = 0;
 }

+ 12 - 9
src/main/java/com/zj/service/MediaService.java

@@ -6,7 +6,6 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import com.zj.entity.Camera;
-import com.zj.thread.MediaConvert;
 import com.zj.thread.MediaRecodeOrTransfer;
 
 import cn.hutool.core.thread.ThreadUtil;
@@ -29,25 +28,26 @@ public class MediaService {
 	/**
 	 * 网络超时
 	 */
-	@Value("${mediaserver.netTimeout}")
-	private String netTimeout = "15000000";
+	@Value("${mediaserver.netTimeout:15000000}")
+	private String netTimeout;
 	/**
 	 * 读写超时
 	 */
-	@Value("${mediaserver.readOrWriteTimeout}")
-	private String readOrWriteTimeout = "15000000";
+	@Value("${mediaserver.readOrWriteTimeout:15000000}")
+	private String readOrWriteTimeout;
 
 	/**
 	 * 无人拉流观看是否自动关闭流
 	 */
-	@Value("${mediaserver.autoClose}")
-	private boolean autoClose=true;
+	@Value("${mediaserver.autoClose:true}")
+	private boolean autoClose;
 
 	/**
 	 * 无人拉流观看持续多久自动关闭,1分钟
 	 */
-	@Value("${mediaserver.autoClose.noClientsDuration}")
-	private long noClientsDuration=60000;
+	@Value("${mediaserver.autoClose.noClientsDuration:60000}")
+	private long noClientsDuration;
+	
 	/**
 	 *http-flv播放
 	 * @param camera
@@ -58,6 +58,7 @@ public class MediaService {
 
 		// 区分不同媒体
 		String mediaKey = MD5.create().digestHex(camera.getUrl());
+		camera.setMediaKey(mediaKey);
 
 		if (cameras.containsKey(mediaKey)) {
 			MediaRecodeOrTransfer mediaConvert = cameras.get(mediaKey);
@@ -75,6 +76,7 @@ public class MediaService {
 
 		// 区分不同媒体
 		String mediaKey = MD5.create().digestHex(camera.getUrl());
+		camera.setMediaKey(mediaKey);
 
 		if (cameras.containsKey(mediaKey)) {
 			MediaRecodeOrTransfer mediaConvert = cameras.get(mediaKey);
@@ -96,6 +98,7 @@ public class MediaService {
 
 		// 区分不同媒体
 		String mediaKey = MD5.create().digestHex(camera.getUrl());
+		camera.setMediaKey(mediaKey);
 
 		if (!cameras.containsKey(mediaKey)) {
 			MediaRecodeOrTransfer mediaConvert = new MediaRecodeOrTransfer(camera, autoClose,noClientsDuration,netTimeout,readOrWriteTimeout);

+ 10 - 7
src/main/java/com/zj/thread/MediaRecodeOrTransfer.java

@@ -17,7 +17,6 @@ import org.bytedeco.javacv.FrameGrabber.Exception;
 import com.zj.entity.Camera;
 import com.zj.service.MediaService;
 
-import cn.hutool.crypto.digest.MD5;
 import io.netty.buffer.Unpooled;
 import io.netty.channel.ChannelFuture;
 import io.netty.channel.ChannelHandlerContext;
@@ -73,10 +72,13 @@ public class MediaRecodeOrTransfer extends Thread {
 	 */
 	private long noClientsDuration = 60000;
 
+	/**
+	 * 当前在线人数
+	 */
 	private int hcSize, wcSize = 0;
 
 	/**
-	 * 没有客户端计数
+	 * 用于没有客户端时候的计时
 	 */
 	private int noClient = 0;
 
@@ -185,6 +187,7 @@ public class MediaRecodeOrTransfer extends Thread {
 			log.info("\r\n{}\r\n启动拉流器成功",camera.getUrl());
 			return grabberStatus = true;
 		} catch (Exception e) {
+			MediaService.cameras.remove(camera.getMediaKey());
 			log.error("\r\n{}\r\n启动拉流器失败,网络超时或视频源不可用", camera.getUrl());
 			e.printStackTrace();
 		}
@@ -223,6 +226,7 @@ public class MediaRecodeOrTransfer extends Thread {
 				return recorderStatus=true;
 			} catch (org.bytedeco.javacv.FrameRecorder.Exception e1) {
 				log.info("启动转码录制器失败", e1);
+				MediaService.cameras.remove(camera.getMediaKey());
 				e1.printStackTrace();
 			}
 		}else {
@@ -523,13 +527,12 @@ public class MediaRecodeOrTransfer extends Thread {
 		}
 		if (httpClients.isEmpty() && wsClients.isEmpty()) {
 			// 等待20秒还没有客户端,则关闭推流
-			if (noClient > 20) {
+			if (noClient > noClientsDuration) {
 				running = false;
-				String mediaKey = MD5.create().digestHex(camera.getUrl());
-				MediaService.cameras.remove(mediaKey);
+				MediaService.cameras.remove(camera.getMediaKey());
 			} else {
-				noClient += 1;
-//				log.info("\r\n{}\r\n {} 秒自动关闭推拉流 \r\n", camera.getUrl(), 11-noClient);
+				noClient += 1000;
+//				log.info("\r\n{}\r\n {} 秒自动关闭推拉流 \r\n", camera.getUrl(), noClientsDuration-noClient);
 			}
 		} else {
 			noClient = 0;

+ 2 - 0
src/main/resources/application.properties

@@ -1,3 +1,5 @@
+#版本号
+mediaserver.version = 1.0
 #web端口
 server.port = 8888
 #流媒体服务端口