添加预处理扩展接口
This commit is contained in:
parent
f960667ff4
commit
7669895db7
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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<String, Converter> factories;
|
||||
|
||||
private IOpenFLVService openFLVService;
|
||||
|
||||
public ConverterFactories(String url, String key, Map<String, Converter> factories, List<AsyncContext> outEntitys) {
|
||||
|
||||
public ConverterFactories(String url, String key, Map<String, Converter> factories, List<AsyncContext> 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();
|
||||
}
|
||||
|
@ -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<String, Converter> factories;
|
||||
|
||||
private OpenCVFrameConverter.ToIplImage converter;
|
||||
private IOpenFLVService openFLVService;
|
||||
|
||||
|
||||
public ConverterTranFactories(String url, String key, Map<String, Converter> factories,
|
||||
List<AsyncContext> outEntitys, FFmpegFrameGrabber grabber) {
|
||||
List<AsyncContext> 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 {
|
||||
// 转码
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
@ -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<String, Converter> 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<AsyncContext> 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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user