diff --git a/src/main/java/com/gc/easy/flv/controller/FLVController.java b/src/main/java/com/gc/easy/flv/controller/FLVController.java index 6e46971..a89dad4 100644 --- a/src/main/java/com/gc/easy/flv/controller/FLVController.java +++ b/src/main/java/com/gc/easy/flv/controller/FLVController.java @@ -30,7 +30,7 @@ public class FLVController { HttpServletRequest request) { String url = openFLVService.getUrl(channel); if(!StringUtils.isEmpty(url)){ - service.open(channel,url, response, request); + service.open(channel,url, response, request,openFLVService); } } @GetMapping(value = "/get/flv/hls/stream") @@ -38,7 +38,7 @@ public class FLVController { HttpServletRequest request) throws UnsupportedEncodingException { if(!StringUtils.isEmpty(url)){ String decodedUrl = java.net.URLDecoder.decode(url, "UTF-8"); - service.open(decodedUrl, response, request); + service.open(decodedUrl, response, request,openFLVService); } } } diff --git a/src/main/java/com/gc/easy/flv/factories/ConverterFactories.java b/src/main/java/com/gc/easy/flv/factories/ConverterFactories.java index 52e44d2..96eaf70 100644 --- a/src/main/java/com/gc/easy/flv/factories/ConverterFactories.java +++ b/src/main/java/com/gc/easy/flv/factories/ConverterFactories.java @@ -1,6 +1,7 @@ package com.gc.easy.flv.factories; import com.alibaba.fastjson.util.IOUtils; +import com.gc.easy.flv.service.IOpenFLVService; import lombok.extern.slf4j.Slf4j; import org.bytedeco.ffmpeg.avcodec.AVPacket; import org.bytedeco.ffmpeg.global.avcodec; @@ -60,12 +61,15 @@ public class ConverterFactories extends Thread implements Converter { */ private Map factories; + private IOpenFLVService openFLVService; - public ConverterFactories(String url, String key, Map factories, List outEntitys) { + + public ConverterFactories(String url, String key, Map factories, List outEntitys, IOpenFLVService openFLVService) { this.url = url; this.key = key; this.factories = factories; this.outEntitys = outEntitys; + this.openFLVService=openFLVService; } @Override @@ -79,7 +83,7 @@ public class ConverterFactories extends Thread implements Converter { } grabber.start(); if (avcodec.AV_CODEC_ID_H264 == grabber.getVideoCodec() - && (grabber.getAudioChannels() == 0 || avcodec.AV_CODEC_ID_AAC == grabber.getAudioCodec())) { + && (grabber.getAudioChannels() == 0 || avcodec.AV_CODEC_ID_AAC == grabber.getAudioCodec())&&(openFLVService==null||!openFLVService.openPreview())) { log.info("this url:{} converterFactories start", url); // 来源视频H264格式,音频AAC格式 // 无须转码,更低的资源消耗,更低的延迟 @@ -135,7 +139,7 @@ public class ConverterFactories extends Thread implements Converter { } else { isCloseGrabberAndResponse = false; // 需要转码为视频H264格式,音频AAC格式 - ConverterTranFactories c = new ConverterTranFactories(url, key, factories, outEntitys, grabber); + ConverterTranFactories c = new ConverterTranFactories(url, key, factories, outEntitys, grabber,openFLVService); factories.put(key, c); c.start(); } diff --git a/src/main/java/com/gc/easy/flv/factories/ConverterTranFactories.java b/src/main/java/com/gc/easy/flv/factories/ConverterTranFactories.java index b9f0237..0b9d6a6 100644 --- a/src/main/java/com/gc/easy/flv/factories/ConverterTranFactories.java +++ b/src/main/java/com/gc/easy/flv/factories/ConverterTranFactories.java @@ -1,11 +1,14 @@ package com.gc.easy.flv.factories; import com.alibaba.fastjson.util.IOUtils; +import com.gc.easy.flv.service.IOpenFLVService; import lombok.extern.slf4j.Slf4j; import org.bytedeco.ffmpeg.global.avcodec; import org.bytedeco.javacv.FFmpegFrameGrabber; import org.bytedeco.javacv.FFmpegFrameRecorder; import org.bytedeco.javacv.Frame; +import org.bytedeco.javacv.OpenCVFrameConverter; +import org.bytedeco.opencv.opencv_core.IplImage; import javax.servlet.AsyncContext; import java.io.ByteArrayOutputStream; @@ -59,13 +62,18 @@ public class ConverterTranFactories extends Thread implements Converter { */ private Map factories; + private OpenCVFrameConverter.ToIplImage converter; + private IOpenFLVService openFLVService; + + public ConverterTranFactories(String url, String key, Map factories, - List outEntitys, FFmpegFrameGrabber grabber) { + List outEntitys, FFmpegFrameGrabber grabber, IOpenFLVService openFLVService) { this.url = url; this.key = key; this.factories = factories; this.outEntitys = outEntitys; this.grabber = grabber; + this.openFLVService=openFLVService; } @Override @@ -82,6 +90,8 @@ public class ConverterTranFactories extends Thread implements Converter { stream = new ByteArrayOutputStream(); recorder = new FFmpegFrameRecorder(stream, grabber.getImageWidth(), grabber.getImageHeight(), grabber.getAudioChannels()); + converter = new OpenCVFrameConverter.ToIplImage(); + recorder.setInterleaved(true); recorder.setVideoOption("preset", "ultrafast"); recorder.setVideoOption("tune", "zerolatency"); @@ -107,6 +117,14 @@ public class ConverterTranFactories extends Thread implements Converter { while (runing) { // 抓取一帧 Frame f = grabber.grab(); + if(openFLVService!=null&&openFLVService.openPreview()){ + //预处理 + IplImage iplImage = converter.convert(f);//抓取一帧视频并将其转换为图像,至于用这个图像用来做什么?加水印,人脸识别等等自行添加 + if (iplImage != null) { + openFLVService.preview(iplImage); + f = converter.convert(iplImage); + } + } if (f != null) { try { // 转码 diff --git a/src/main/java/com/gc/easy/flv/service/IFLVService.java b/src/main/java/com/gc/easy/flv/service/IFLVService.java index 81b8bc5..13889ee 100644 --- a/src/main/java/com/gc/easy/flv/service/IFLVService.java +++ b/src/main/java/com/gc/easy/flv/service/IFLVService.java @@ -11,7 +11,7 @@ public interface IFLVService { * @param url * @param response */ - public void open(Integer channel,String url, HttpServletResponse response, HttpServletRequest request); - public void open(String url, HttpServletResponse response, HttpServletRequest request); + public void open(Integer channel,String url, HttpServletResponse response, HttpServletRequest request,IOpenFLVService openFLVService); + public void open(String url, HttpServletResponse response, HttpServletRequest request,IOpenFLVService openFLVService); } diff --git a/src/main/java/com/gc/easy/flv/service/IOpenFLVService.java b/src/main/java/com/gc/easy/flv/service/IOpenFLVService.java index 98276c3..988c21a 100644 --- a/src/main/java/com/gc/easy/flv/service/IOpenFLVService.java +++ b/src/main/java/com/gc/easy/flv/service/IOpenFLVService.java @@ -1,5 +1,7 @@ package com.gc.easy.flv.service; +import org.bytedeco.opencv.opencv_core.IplImage; + public interface IOpenFLVService { @@ -8,5 +10,17 @@ public interface IOpenFLVService { * @param channel * @return */ - public String getUrl(Integer channel); + String getUrl(Integer channel); + + /** + * 抓取一帧视频并将其转换为图像预处理 + * @param iplImage + */ + void preview(IplImage iplImage); + + /** + * 开启预处理 + * @return + */ + boolean openPreview(); } \ No newline at end of file diff --git a/src/main/java/com/gc/easy/flv/service/impl/FLVService.java b/src/main/java/com/gc/easy/flv/service/impl/FLVService.java index 98ceddf..0a25e0f 100644 --- a/src/main/java/com/gc/easy/flv/service/impl/FLVService.java +++ b/src/main/java/com/gc/easy/flv/service/impl/FLVService.java @@ -4,6 +4,7 @@ package com.gc.easy.flv.service.impl; import com.gc.easy.flv.factories.Converter; import com.gc.easy.flv.factories.ConverterFactories; import com.gc.easy.flv.service.IFLVService; +import com.gc.easy.flv.service.IOpenFLVService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -28,11 +29,11 @@ public class FLVService implements IFLVService { private ConcurrentHashMap converters = new ConcurrentHashMap<>(); @Override - public void open(String url, HttpServletResponse response, HttpServletRequest request) { - open(null,url,response,request); + public void open(String url, HttpServletResponse response, HttpServletRequest request,IOpenFLVService openFLVService) { + open(null,url,response,request,openFLVService); } @Override - public void open(Integer channel,String url, HttpServletResponse response, HttpServletRequest request) { + public void open(Integer channel, String url, HttpServletResponse response, HttpServletRequest request, IOpenFLVService openFLVService) { String key = md5(url); AsyncContext async = request.startAsync(); async.setTimeout(0); @@ -47,7 +48,7 @@ public class FLVService implements IFLVService { } else { List outs = new ArrayList<>(); outs.add(async); - ConverterFactories c = new ConverterFactories(url, key, converters, outs); + ConverterFactories c = new ConverterFactories(url, key, converters, outs,openFLVService); c.start(); converters.put(key, c); }