添加视频流图片预处理,可用作视觉识别
This commit is contained in:
parent
d321011e6c
commit
facf67d256
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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("没有输出退出");
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
}
|
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user