Bladeren bron

修改flv播放问题

huangfei 2 jaren geleden
bovenliggende
commit
f140a55380

+ 16 - 5
src/main/java/com/coyee/stream/controller/StreamController.java

@@ -56,14 +56,25 @@ public class StreamController {
      */
     @GetMapping(value = "/live/{key}.flv")
     public void flvLive(HttpServletResponse response,
-                        HttpServletRequest request, @PathVariable(value = "key") String key) {
+                        HttpServletRequest request, @PathVariable(value = "key") String key) throws InterruptedException {
         Converter converter = ConverterFactory.get(key);
         if (converter == null || converter instanceof FlvConverter == false) {
             JsonResult.sendError(response, 500, "转换器未注册!");
             return;
         }
         FlvConverter flvConverter = (FlvConverter) converter;
-        flvConverter.play(request, response);
+        try {
+            flvConverter.play(request, response);
+        } catch (InterruptedException e) {
+            try {
+                String url = flvConverter.getEndpoint();
+                ConverterFactory.cancle(key);
+                flvConverter = ConverterFactory.registerFlv(url, key);
+                flvConverter.play(request, response);
+            } catch (InterruptedException er) {
+                log.error("流转换任务转换失败:{}",er.getMessage());
+            }
+        }
     }
 
     /**
@@ -84,11 +95,11 @@ public class StreamController {
                 JsonResult.sendError(response, 500, "转换器未注册!");
                 return;
             }
-            String url=converter.getEndpoint();
-            ConverterFactory.registerHls(url,key);//检查生成的文件,一旦过期马上重新生成,以此解决流中断导致文件不及时的问题
+            String url = converter.getEndpoint();
+            ConverterFactory.registerHls(url, key);//检查生成的文件,一旦过期马上重新生成,以此解决流中断导致文件不及时的问题
             HlsConverter hlsConverter = (HlsConverter) converter;
             File indexFile = hlsConverter.getIndexFile();
-            if(indexFile.exists()==false){
+            if (indexFile.exists() == false) {
                 JsonResult.sendError(response, 404, "没有找到文件!");
                 return;
             }

+ 9 - 4
src/main/java/com/coyee/stream/converter/FlvConverter.java

@@ -10,6 +10,7 @@ import javax.servlet.AsyncContext;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import com.coyee.stream.exception.ServiceException;
 import org.bytedeco.ffmpeg.avcodec.AVPacket;
 import org.bytedeco.ffmpeg.global.avcodec;
 import org.bytedeco.javacv.*;
@@ -213,13 +214,17 @@ public class FlvConverter extends Converter{
         }
     }
 
-    public void play(HttpServletRequest request,HttpServletResponse response){
-        AsyncContext async = request.startAsync();
-        async.setTimeout(0);
-        if(this.isAlive()==false){
+    public void play(HttpServletRequest request,HttpServletResponse response) throws InterruptedException{
+        State state=this.getState();
+        if(state==State.NEW){
             this.start();
+        }else if(state==State.TERMINATED){
+            log.info("{}的转流已停止,需要重新开启",endpoint);
+            throw new InterruptedException("转流线程已停止,需要重新开启");
         }
         try {
+            AsyncContext async = request.startAsync();
+            async.setTimeout(0);
             this.addOutputStreamEntity(async);
         } catch (IOException e) {
             log.error(e.getMessage(), e);