Explorar el Código

!6 统一监视Javacv播放线程,不再一对一监视
Merge pull request !6 from 木易什么来着/master

eguid hace 2 años
padre
commit
61cacaa377

+ 3 - 1
src/main/java/com/zj/init/InitServer.java

@@ -20,7 +20,9 @@ import com.zj.mapper.CameraMapper;
 import com.zj.server.MediaServer;
 import com.zj.service.HlsService;
 import com.zj.service.MediaService;
+import com.zj.thread.MediaListenThread;
 
+import cn.hutool.core.thread.ThreadUtil;
 import cn.hutool.core.util.StrUtil;
 import lombok.extern.slf4j.Slf4j;
 
@@ -55,7 +57,7 @@ public class InitServer implements CommandLineRunner {
 	@Override
 	public void run(String... args) throws Exception {
 		initAutoPlay();
-		
+		ThreadUtil.execute(new MediaListenThread());
         String ip = InetAddress.getLocalHost().getHostAddress();
         String httpPort = env.getProperty("server.port");
         String path = env.getProperty("server.servlet.context-path");

+ 39 - 0
src/main/java/com/zj/thread/MediaListenThread.java

@@ -0,0 +1,39 @@
+package com.zj.thread;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.thread.ThreadUtil;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class MediaListenThread implements Runnable {
+    
+    private static ConcurrentMap<MediaTransfer, Integer> threadMap = new ConcurrentHashMap<>();
+    
+    public static void putThread(MediaTransfer mediaTransfer) {
+        log.info("线程{}加入到监视", mediaTransfer);
+        threadMap.put(mediaTransfer, 1);
+    }
+    
+    public static void removeThread(MediaTransfer mediaTransfer) {
+        log.info("线程{}退出监视", mediaTransfer);
+        threadMap.remove(mediaTransfer);
+    }
+    
+    @Override
+    public void run() {
+        log.info("启动播放线程的总监视线程......");
+        while (true) {
+            threadMap.forEach((thread, value) -> thread.hasClient());
+            try {
+                Thread.sleep(1000);
+            } catch ( InterruptedException e ) {
+            
+            }
+        }
+    }
+    
+}

+ 2 - 3
src/main/java/com/zj/thread/MediaTransfer.java

@@ -58,7 +58,6 @@ public abstract class MediaTransfer {
 	@Getter@Setter
 	public TransferCallback transferCallback;
 	
-//	public void addClient() {
-//		
-//	}
+	public abstract void hasClient();
+
 }

+ 3 - 13
src/main/java/com/zj/thread/MediaTransferFlvByFFmpeg.java

@@ -20,6 +20,7 @@ import com.zj.dto.CameraDto;
 import com.zj.service.MediaService;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.thread.ThreadUtil;
 import io.netty.buffer.Unpooled;
 import io.netty.channel.ChannelFuture;
 import io.netty.channel.ChannelHandlerContext;
@@ -54,7 +55,6 @@ public class MediaTransferFlvByFFmpeg extends MediaTransfer {
 	private Thread inputThread;
 	private Thread errThread;
 	private Thread outputThread;
-	private Thread listenThread;
 	private boolean running = false; // 启动
 	private boolean enableLog = true;
 
@@ -288,18 +288,7 @@ public class MediaTransferFlvByFFmpeg extends MediaTransfer {
 	 * 监听客户端
 	 */
 	public void listenClient() {
-		listenThread = new Thread(new Runnable() {
-			public void run() {
-				while (running) {
-					hasClient();
-					try {
-						Thread.sleep(1000);
-					} catch (InterruptedException e) {
-					}
-				}
-			}
-		});
-		listenThread.start();
+		MediaListenThread.putThread(this);
 	}
 
 	/**
@@ -473,6 +462,7 @@ public class MediaTransferFlvByFFmpeg extends MediaTransfer {
 	 * 
 	 * @return
 	 */
+	@Override
 	public void hasClient() {
 
 		int newHcSize = httpClients.size();

+ 5 - 18
src/main/java/com/zj/thread/MediaTransferFlvByJavacv.java

@@ -15,6 +15,7 @@ import com.zj.common.ClientType;
 import com.zj.dto.CameraDto;
 import com.zj.service.MediaService;
 
+import cn.hutool.core.thread.ThreadUtil;
 import io.netty.buffer.Unpooled;
 import io.netty.channel.ChannelFuture;
 import io.netty.channel.ChannelHandlerContext;
@@ -63,12 +64,7 @@ public class MediaTransferFlvByJavacv extends MediaTransfer implements Runnable
 	 * 相机
 	 */
 	private CameraDto cameraDto;
-
-	/**
-	 * 监听线程,用于监听状态
-	 */
-	private Thread listenThread;
-
+	
 	/**
 	 * @param cameraDto
 	 * @param autoClose 流是否可以自动关闭
@@ -417,6 +413,7 @@ public class MediaTransferFlvByJavacv extends MediaTransfer implements Runnable
 	 * 
 	 * @return
 	 */
+	@Override
 	public void hasClient() {
 
 		int newHcSize = httpClients.size();
@@ -450,18 +447,7 @@ public class MediaTransferFlvByJavacv extends MediaTransfer implements Runnable
 	 * 监听客户端,用于判断无人观看时自动关闭推流
 	 */
 	public void listenClient() {
-		listenThread = new Thread(new Runnable() {
-			public void run() {
-				while (running) {
-					hasClient();
-					try {
-						Thread.sleep(1000);
-					} catch (InterruptedException e) {
-					}
-				}
-			}
-		});
-		listenThread.start();
+		MediaListenThread.putThread(this);
 	}
 
 	/**
@@ -514,6 +500,7 @@ public class MediaTransferFlvByJavacv extends MediaTransfer implements Runnable
 				httpClients.remove(entry.getKey());
 			}
 		}
+		MediaListenThread.removeThread(this);
 	}
 
 	/**

+ 5 - 0
src/main/java/com/zj/thread/MediaTransferHls.java

@@ -199,4 +199,9 @@ public class MediaTransferHls extends MediaTransfer {
 		errThread.start();
 	}
 	
+	@Override
+	public void hasClient() {
+	
+	}
+	
 }