From facf67d25669d42283c974b0701f5b5523ba395f Mon Sep 17 00:00:00 2001 From: xgc Date: Wed, 17 Jan 2024 12:36:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=A7=86=E9=A2=91=E6=B5=81?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E9=A2=84=E5=A4=84=E7=90=86=EF=BC=8C=E5=8F=AF?= =?UTF-8?q?=E7=94=A8=E4=BD=9C=E8=A7=86=E8=A7=89=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gc/easy/flv/controller/FLVController.java | 3 ++- .../flv/factories/ConverterFactories.java | 19 +++++++++++++-- .../flv/factories/ConverterTranFactories.java | 18 ++++++++++++++- .../easy/flv/factories/state/OutputImage.java | 23 +++++++++++++++++++ .../com/gc/easy/flv/service/IFLVService.java | 2 +- .../flv/service/IOutputStreamService.java | 17 ++++++++++++++ .../gc/easy/flv/service/impl/FLVService.java | 8 +++++-- 7 files changed, 83 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/gc/easy/flv/factories/state/OutputImage.java create mode 100644 src/main/java/com/gc/easy/flv/service/IOutputStreamService.java 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 a4ce6b2..66d1c82 100644 --- a/src/main/java/com/gc/easy/flv/controller/FLVController.java +++ b/src/main/java/com/gc/easy/flv/controller/FLVController.java @@ -29,7 +29,8 @@ public class FLVController { HttpServletRequest request) { String url = openFLVService.getUrl(channel); if(!StringUtils.isEmpty(url)){ - service.open(url, response, request); + service.open(channel,url, response, request); } } + } 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 9560916..73c7385 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,8 @@ package com.gc.easy.flv.factories; import com.alibaba.fastjson.util.IOUtils; +import com.gc.easy.flv.factories.state.OutputImage; +import com.gc.easy.flv.service.IOutputStreamService; import lombok.extern.slf4j.Slf4j; import org.bytedeco.ffmpeg.avcodec.AVPacket; import org.bytedeco.ffmpeg.global.avcodec; @@ -10,6 +12,7 @@ import org.bytedeco.javacv.FFmpegFrameRecorder; import javax.servlet.AsyncContext; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -60,11 +63,16 @@ public class ConverterFactories extends Thread implements Converter { */ private Map factories; - public ConverterFactories(String url, String key, Map factories, List outEntitys) { + private IOutputStreamService iOutputStreamService; + private Integer channel; + + public ConverterFactories(String url, String key, Map factories, List outEntitys, IOutputStreamService iOutputStreamService,Integer channel) { this.url = url; this.key = key; this.factories = factories; this.outEntitys = outEntitys; + this.iOutputStreamService=iOutputStreamService; + this.channel=channel; } @Override @@ -116,6 +124,13 @@ public class ConverterFactories extends Thread implements Converter { if (stream.size() > 0) { byte[] b = stream.toByteArray(); stream.reset(); + if(iOutputStreamService!=null){ + OutputImage image = OutputImage.builder().image(b).recordTime(new Date()).channel(channel).build(); + byte[] handler = iOutputStreamService.handler(image); + if(iOutputStreamService.write()){ + b=handler; + } + } writeResponse(b); if (outEntitys.isEmpty()) { log.info("没有输出退出"); @@ -134,7 +149,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,iOutputStreamService,channel); 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..26b43dc 100644 --- a/src/main/java/com/gc/easy/flv/factories/ConverterTranFactories.java +++ b/src/main/java/com/gc/easy/flv/factories/ConverterTranFactories.java @@ -1,6 +1,8 @@ package com.gc.easy.flv.factories; import com.alibaba.fastjson.util.IOUtils; +import com.gc.easy.flv.factories.state.OutputImage; +import com.gc.easy.flv.service.IOutputStreamService; import lombok.extern.slf4j.Slf4j; import org.bytedeco.ffmpeg.global.avcodec; import org.bytedeco.javacv.FFmpegFrameGrabber; @@ -10,6 +12,7 @@ import org.bytedeco.javacv.Frame; import javax.servlet.AsyncContext; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -59,13 +62,19 @@ public class ConverterTranFactories extends Thread implements Converter { */ private Map factories; + private IOutputStreamService iOutputStreamService; + private Integer channel; + public ConverterTranFactories(String url, String key, Map factories, - List outEntitys, FFmpegFrameGrabber grabber) { + List outEntitys, FFmpegFrameGrabber grabber, IOutputStreamService iOutputStreamService,Integer channel) { this.url = url; this.key = key; this.factories = factories; this.outEntitys = outEntitys; this.grabber = grabber; + this.iOutputStreamService=iOutputStreamService; + this.channel=channel; + } @Override @@ -116,6 +125,13 @@ public class ConverterTranFactories extends Thread implements Converter { if (stream.size() > 0) { byte[] b = stream.toByteArray(); stream.reset(); + if(iOutputStreamService!=null){ + OutputImage image = OutputImage.builder().image(b).recordTime(new Date()).channel(channel).build(); + byte[] handler = iOutputStreamService.handler(image); + if(iOutputStreamService.write()){ + b=handler; + } + } writeResponse(b); if (outEntitys.isEmpty()) { log.info("没有输出退出"); diff --git a/src/main/java/com/gc/easy/flv/factories/state/OutputImage.java b/src/main/java/com/gc/easy/flv/factories/state/OutputImage.java new file mode 100644 index 0000000..7f0b719 --- /dev/null +++ b/src/main/java/com/gc/easy/flv/factories/state/OutputImage.java @@ -0,0 +1,23 @@ +package com.gc.easy.flv.factories.state; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class OutputImage { + //图片 + private byte[] image; + + private Date recordTime; + + private Integer channel; + + +} 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 dfe4bf9..8453b9a 100644 --- a/src/main/java/com/gc/easy/flv/service/IFLVService.java +++ b/src/main/java/com/gc/easy/flv/service/IFLVService.java @@ -11,6 +11,6 @@ public interface IFLVService { * @param url * @param response */ - public void open(String url, HttpServletResponse response, HttpServletRequest request); + public void open(Integer channel,String url, HttpServletResponse response, HttpServletRequest request); } diff --git a/src/main/java/com/gc/easy/flv/service/IOutputStreamService.java b/src/main/java/com/gc/easy/flv/service/IOutputStreamService.java new file mode 100644 index 0000000..4758b9e --- /dev/null +++ b/src/main/java/com/gc/easy/flv/service/IOutputStreamService.java @@ -0,0 +1,17 @@ +package com.gc.easy.flv.service; + +import com.gc.easy.flv.factories.state.OutputImage; + +public interface IOutputStreamService { + + //是否回写流 + public boolean write(); + + /** + * 通过通道号获取url + * @param image 需要处理的图片 + * @return 处理后的图片 + */ + public byte[] handler(OutputImage image); + +} \ 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 708c308..169fd5f 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,7 +4,9 @@ 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.IOutputStreamService; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.servlet.AsyncContext; @@ -27,9 +29,11 @@ import java.util.concurrent.ConcurrentHashMap; public class FLVService implements IFLVService { private ConcurrentHashMap converters = new ConcurrentHashMap<>(); + @Autowired(required = false) + private IOutputStreamService iOutputStreamService; @Override - public void open(String url, HttpServletResponse response, HttpServletRequest request) { + public void open(Integer channel,String url, HttpServletResponse response, HttpServletRequest request) { String key = md5(url); AsyncContext async = request.startAsync(); async.setTimeout(0); @@ -44,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,iOutputStreamService,channel); c.start(); converters.put(key, c); }