添加视频流图片预处理,可用作视觉识别

This commit is contained in:
xgc 2024-01-17 12:36:39 +08:00
parent d321011e6c
commit facf67d256
7 changed files with 83 additions and 7 deletions

View File

@ -29,7 +29,8 @@ public class FLVController {
HttpServletRequest request) { HttpServletRequest request) {
String url = openFLVService.getUrl(channel); String url = openFLVService.getUrl(channel);
if(!StringUtils.isEmpty(url)){ if(!StringUtils.isEmpty(url)){
service.open(url, response, request); service.open(channel,url, response, request);
} }
} }
} }

View File

@ -1,6 +1,8 @@
package com.gc.easy.flv.factories; package com.gc.easy.flv.factories;
import com.alibaba.fastjson.util.IOUtils; 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 lombok.extern.slf4j.Slf4j;
import org.bytedeco.ffmpeg.avcodec.AVPacket; import org.bytedeco.ffmpeg.avcodec.AVPacket;
import org.bytedeco.ffmpeg.global.avcodec; import org.bytedeco.ffmpeg.global.avcodec;
@ -10,6 +12,7 @@ import org.bytedeco.javacv.FFmpegFrameRecorder;
import javax.servlet.AsyncContext; import javax.servlet.AsyncContext;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.Date;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -60,11 +63,16 @@ public class ConverterFactories extends Thread implements Converter {
*/ */
private Map<String, Converter> factories; private Map<String, Converter> factories;
public ConverterFactories(String url, String key, Map<String, Converter> factories, List<AsyncContext> outEntitys) { private IOutputStreamService iOutputStreamService;
private Integer channel;
public ConverterFactories(String url, String key, Map<String, Converter> factories, List<AsyncContext> outEntitys, IOutputStreamService iOutputStreamService,Integer channel) {
this.url = url; this.url = url;
this.key = key; this.key = key;
this.factories = factories; this.factories = factories;
this.outEntitys = outEntitys; this.outEntitys = outEntitys;
this.iOutputStreamService=iOutputStreamService;
this.channel=channel;
} }
@Override @Override
@ -116,6 +124,13 @@ public class ConverterFactories extends Thread implements Converter {
if (stream.size() > 0) { if (stream.size() > 0) {
byte[] b = stream.toByteArray(); byte[] b = stream.toByteArray();
stream.reset(); 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); writeResponse(b);
if (outEntitys.isEmpty()) { if (outEntitys.isEmpty()) {
log.info("没有输出退出"); log.info("没有输出退出");
@ -134,7 +149,7 @@ public class ConverterFactories extends Thread implements Converter {
} else { } else {
isCloseGrabberAndResponse = false; isCloseGrabberAndResponse = false;
// 需要转码为视频H264格式,音频AAC格式 // 需要转码为视频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); factories.put(key, c);
c.start(); c.start();
} }

View File

@ -1,6 +1,8 @@
package com.gc.easy.flv.factories; package com.gc.easy.flv.factories;
import com.alibaba.fastjson.util.IOUtils; 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 lombok.extern.slf4j.Slf4j;
import org.bytedeco.ffmpeg.global.avcodec; import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.javacv.FFmpegFrameGrabber; import org.bytedeco.javacv.FFmpegFrameGrabber;
@ -10,6 +12,7 @@ import org.bytedeco.javacv.Frame;
import javax.servlet.AsyncContext; import javax.servlet.AsyncContext;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.Date;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -59,13 +62,19 @@ public class ConverterTranFactories extends Thread implements Converter {
*/ */
private Map<String, Converter> factories; private Map<String, Converter> factories;
private IOutputStreamService iOutputStreamService;
private Integer channel;
public ConverterTranFactories(String url, String key, Map<String, Converter> factories, public ConverterTranFactories(String url, String key, Map<String, Converter> factories,
List<AsyncContext> outEntitys, FFmpegFrameGrabber grabber) { List<AsyncContext> outEntitys, FFmpegFrameGrabber grabber, IOutputStreamService iOutputStreamService,Integer channel) {
this.url = url; this.url = url;
this.key = key; this.key = key;
this.factories = factories; this.factories = factories;
this.outEntitys = outEntitys; this.outEntitys = outEntitys;
this.grabber = grabber; this.grabber = grabber;
this.iOutputStreamService=iOutputStreamService;
this.channel=channel;
} }
@Override @Override
@ -116,6 +125,13 @@ public class ConverterTranFactories extends Thread implements Converter {
if (stream.size() > 0) { if (stream.size() > 0) {
byte[] b = stream.toByteArray(); byte[] b = stream.toByteArray();
stream.reset(); 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); writeResponse(b);
if (outEntitys.isEmpty()) { if (outEntitys.isEmpty()) {
log.info("没有输出退出"); log.info("没有输出退出");

View File

@ -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;
}

View File

@ -11,6 +11,6 @@ public interface IFLVService {
* @param url * @param url
* @param response * @param response
*/ */
public void open(String url, HttpServletResponse response, HttpServletRequest request); public void open(Integer channel,String url, HttpServletResponse response, HttpServletRequest request);
} }

View File

@ -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);
}

View File

@ -4,7 +4,9 @@ package com.gc.easy.flv.service.impl;
import com.gc.easy.flv.factories.Converter; import com.gc.easy.flv.factories.Converter;
import com.gc.easy.flv.factories.ConverterFactories; import com.gc.easy.flv.factories.ConverterFactories;
import com.gc.easy.flv.service.IFLVService; import com.gc.easy.flv.service.IFLVService;
import com.gc.easy.flv.service.IOutputStreamService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.servlet.AsyncContext; import javax.servlet.AsyncContext;
@ -27,9 +29,11 @@ import java.util.concurrent.ConcurrentHashMap;
public class FLVService implements IFLVService { public class FLVService implements IFLVService {
private ConcurrentHashMap<String, Converter> converters = new ConcurrentHashMap<>(); private ConcurrentHashMap<String, Converter> converters = new ConcurrentHashMap<>();
@Autowired(required = false)
private IOutputStreamService iOutputStreamService;
@Override @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); String key = md5(url);
AsyncContext async = request.startAsync(); AsyncContext async = request.startAsync();
async.setTimeout(0); async.setTimeout(0);
@ -44,7 +48,7 @@ public class FLVService implements IFLVService {
} else { } else {
List<AsyncContext> outs = new ArrayList<>(); List<AsyncContext> outs = new ArrayList<>();
outs.add(async); outs.add(async);
ConverterFactories c = new ConverterFactories(url, key, converters, outs); ConverterFactories c = new ConverterFactories(url, key, converters, outs,iOutputStreamService,channel);
c.start(); c.start();
converters.put(key, c); converters.put(key, c);
} }