Bläddra i källkod

在bin目录的convertToHlsList.default文件中添加流地址,配合expireMills: -1,服务启动时自动转流

huangfei 2 år sedan
förälder
incheckning
a56a630e7e

+ 9 - 0
src/main/java/com/coyee/stream/config/StreamServerConfig.java

@@ -7,8 +7,10 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
 import java.io.File;
 import java.io.IOException;
+import java.util.List;
 
 /**
  * @author hxfein
@@ -42,6 +44,10 @@ public class StreamServerConfig {
      * 播放列表数
      */
     private int hlsListSize=10;
+    /**
+     * 没有观众时流的关闭时间,-1为不关闭
+     */
+    private long expireMills=1000*60*5;
 
     /**
      * 系统启动时,先把hlsStoreDir里面的文件清除掉
@@ -49,6 +55,9 @@ public class StreamServerConfig {
     @PostConstruct
     public void onStreamServerStart() throws IOException {
         File dir=new File(hlsStoreDir);
+        if(dir.exists()==false){
+            dir.mkdir();
+        }
         log.info("准备清除hls目录的残留文件");
         File[] children=dir.listFiles();
         for(File child:children){

+ 1 - 0
src/main/java/com/coyee/stream/controller/StreamController.java

@@ -5,6 +5,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import com.coyee.stream.config.StreamServerConfig;
+import com.coyee.stream.converter.HlsConverter;
 import com.coyee.stream.result.JsonResult;
 import com.coyee.stream.service.IStreamService;
 import lombok.extern.slf4j.Slf4j;

+ 1 - 0
src/main/java/com/coyee/stream/converter/HlsConverter.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.util.IOUtils;
 import com.coyee.stream.config.StreamServerConfig;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.FilenameUtils;
 import org.bytedeco.ffmpeg.avcodec.AVPacket;
 import org.bytedeco.ffmpeg.avformat.AVFormatContext;

+ 2 - 0
src/main/java/com/coyee/stream/service/IStreamService.java

@@ -1,5 +1,7 @@
 package com.coyee.stream.service;
 
+import com.coyee.stream.converter.HlsConverter;
+
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.util.Date;

+ 32 - 1
src/main/java/com/coyee/stream/service/impl/StreamServiceImpl.java

@@ -1,9 +1,11 @@
 package com.coyee.stream.service.impl;
 
+import java.io.File;
 import java.io.IOException;
 import java.nio.charset.Charset;
 import java.util.*;
 
+import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
 import javax.servlet.AsyncContext;
 import javax.servlet.http.HttpServletRequest;
@@ -15,6 +17,7 @@ import com.coyee.stream.converter.Converter;
 import com.coyee.stream.converter.FlvConverter;
 import com.coyee.stream.service.IStreamService;
 import com.coyee.stream.util.Des;
+import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
@@ -121,6 +124,11 @@ public class StreamServiceImpl implements IStreamService {
 	@Scheduled(fixedDelay = 1*60*1000)
 	@Override
 	public void manageConverters() {
+		long expireMills=streamServerConfig.getExpireMills();
+		if(expireMills==-1){
+			log.info("因过期时间设为永久,管理任务没有运行:{}",new Date());
+			return;
+		}
 		log.info("管理任务开始运行:{}",new Date());
 		activeStreamMap.forEach((key,lastAccessTime)->{
 			if(lastAccessTime==null){
@@ -129,7 +137,7 @@ public class StreamServiceImpl implements IStreamService {
 			long accessTime=lastAccessTime.getTime();
 			long currentTime=System.currentTimeMillis();
 			long diff=currentTime-accessTime;
-			if(diff/(60*1000)>5){//上次访问时间大于5分钟
+			if(expireMills>=diff){
 				Converter flvConverter=flvConverters.get(key);
 				if(flvConverter!=null){
 					flvConverter.softClose();
@@ -146,4 +154,27 @@ public class StreamServiceImpl implements IStreamService {
 			}
 		});
 	}
+
+	/**
+	 * 打开默认需要打开的流
+	 */
+	@PostConstruct
+	public void openDefaultStreams() throws IOException{
+		File defaultOpenListFile=new File("convertToHlsList.default");
+		if(defaultOpenListFile.exists()){
+			log.info("已找到默认hls配置文件:{},准备开启",defaultOpenListFile.getAbsolutePath());
+			List<String> hlsUrlList= FileUtils.readLines(defaultOpenListFile,"utf-8");
+			StreamServiceImpl that=this;
+			hlsUrlList.stream().forEach((url->{
+				Thread thread= new Thread(() -> {
+					log.info("准备开启{}的转流",url);
+					that.open(url,"hls",null,null);
+					log.info("{}的转流开启成功!!",url);
+				});
+				thread.start();
+			}));
+		}else {
+			log.info("未找到默认hls配置文件:{}",defaultOpenListFile.getAbsolutePath());
+		}
+	}
 }

+ 2 - 1
src/main/resources/application.yml

@@ -26,4 +26,5 @@ streamserver:
   hlsStoreDir: /home/hls
   hlsTime: 5
   hlsWrap: 10
-  hlsListSize: 0
+  hlsListSize: 8
+  expireMills: -1