//javacv抽取图片

public void AiVideoAnalysisProcessor() throws Exception{

//rtsp地址

FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(url);

// 使用tcp的方式,不然会丢包很严重

grabber.setOption("rtsp_transport", "tcp");

//开始拉流

grabber.start();

//获取摄像头宽高

int width = grabber.getImageWidth();

int height = grabber.getImageHeight();

Frame frame = null;

ByteArrayOutputStream stream = null;

while (true) {

try{

//抽帧

frame = grabber.grabImage();

if (frame.image == null) {

continue;

}

BufferedImage image = null;

image = createBufferedImage(frame,image);

stream = new ByteArrayOutputStream();

//生成UUID

//String uuid = UUID.randomUUID().toString().toUpperCase();

//BufferedImage bufferedImage = Java2DFrameUtils.toBufferedImage(frame);

//输出流

ImageIO.write(image, "jpg", stream);

String base64 = Base64.encode(stream.toByteArray());

//往队列里面插入数据

redisService.lPush(RedisUtils.PJOB_LIST_CACHE_NAME + context.getJobId(), base64);//TODO 还有AI返回的分析信息,用来编码

}catch (Exception e){

if(grabber != null) {

grabber.close();

}

if(stream != null) {

stream.close();

}

throw e;

}

}

}

private static BufferedImage createBufferedImage(Frame frame, BufferedImage image) {

ByteBuffer buffer = (ByteBuffer) frame.image[0].position(0);

if(image == null) {

ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);

ColorModel cm = new ComponentColorModel(cs, false,false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE);

// this assumes BGR format

DataBuffer dataBuffer = new DataBufferByte(buffer.limit());

WritableRaster wr = Raster.createWritableRaster(new ComponentSampleModel(DataBuffer.TYPE_BYTE, frame.imageWidth, frame.imageHeight, frame.imageChannels, frame.imageStride, new int[] {2, 1, 0}), dataBuffer,null);

byte[] bufferPixels = ((DataBufferByte) wr.getDataBuffer()).getData();

buffer.get(bufferPixels);

return new BufferedImage(cm, wr, false, null);

}

else {

WritableRaster wr = image.getRaster();

byte[] bufferPixels = ((DataBufferByte) wr.getDataBuffer()).getData();

buffer.get(bufferPixels);

return image;

}

}

//图片转rtsp播放

public void AiVideoBrowseRtspProcessor() throws Exception{

String pushPath = "rtsp://" + nodeConfig.getAddress() + "/" + nodeConfig.getName();

int width = 1920, height = 1080;

//开启日志级别

//avutil.av_log_set_level(avutil.AV_LOG_ERROR);

//FFmpegLogCallback.set();

FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(pushPath, width, height, 0);// 流媒体输出地址,分辨率(长,高),是否录制音频(0:不录制/1:录制)

recorder.setVideoCodec(AV_CODEC_ID_H264);

recorder.setFormat("rtsp"); // flv:rtmp的类型、rtsp:rtsp类型

//recorder.setPixelFormat(0);

//recorder.setVideoOption("tune", "zerolatency");// 降低编码延时

//recorder.setVideoOption("preset", "ultrafast");// 提升编码速度

recorder.setVideoOption("crf", "28");// 视频质量参数(详见 https://trac.ffmpeg.org/wiki/Encode/H.264)

recorder.start();

ByteArrayInputStream bais = null;

//Frame frame = null;

IplImage img = null;

Frame frame = null;

OpenCVFrameConverter converter = new OpenCVFrameConverter.ToIplImage();

while (true) {

try {

Long start = System.currentTimeMillis();

//轮询获取解析后的图片信息

String image = (String) redisService.lPop

(RedisUtils.PJOB_LIST_CACHE_NAME + saveAiVideRtspSaveJobRequest.getTaskPJobId());

if (resultInfo == null) {//TODO 是否能够lpop到数据,此处需要判断返回值是否可以这样判断空值

//Thread.sleep(1000);

continue;

}

byte[] bytes = Base64.decode(image);

bais = new ByteArrayInputStream(bytes);

BufferedImage bufferedImage = ImageIO.read(bais);

frame = createFrame(bufferedImage,frame);

if(frame == null){

continue;

}

Map map = resultInfo.getInfo();

//坐标 二维数组

JSONArray boxxes = (JSONArray) map.get("bboxes");// [[503, 246, 110, 37]]

//json转对象

//image是图片对象 从redis list获取pop(根据key)

//画框

img = converter.convertToIplImage(frame);

for (int i = 0; i < boxxes.size(); i++) {

JSONArray array = (JSONArray) boxxes.get(i);

cvRectangle(img, cvPoint(Integer.parseInt(array.get(0).toString()),

Integer.parseInt(array.get(1).toString())),

cvPoint(Integer.parseInt(array.get(2).toString()),

Integer.parseInt(array.get(3).toString())),

CV_RGB(255, 0, 0), 5, 4, 0); //TODO 编码 具体参数不清楚 找 魏望浩

}

//recorder.record(Java2DFrameUtils.toFrame(img)); //推图片

recorder.record(converter.convert(img));

Long end = System.currentTimeMillis();

} catch (Exception e) {

if(recorder != null) {

recorder.close();

}

if (bais != null) {

bais.close();

}

if(img != null){

img.close();

}

throw e;

}

}

}

private Frame createFrame(BufferedImage image, Frame frame) {

DataBufferByte imageBuffer = (DataBufferByte) image.getRaster().getDataBuffer();

int stride = imageBuffer.getData().length / image.getHeight();

if(frame == null || frame.imageWidth != image.getWidth() || frame.imageHeight != image.getHeight())

frame = new Frame(image.getWidth(), image.getHeight(), 8, 3, stride);

ByteBuffer frameBuffer = (ByteBuffer) frame.image[0].position(0);

frameBuffer.put(((DataBufferByte) image.getRaster().getDataBuffer()).getData());

frameBuffer.position(0);

return frame;

}

Java高全级别灰色_想问下用过JAVACV的大兄弟,为啥我这边抽取图片总是有灰色图片...相关推荐

  1. mysql存储过程实验几轮_想问下数据库中有关存储过程的实验,求大神!

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 DELIMITER || CREATE PROCEDURE procedure_for_customers () BEGIN -- 定义参数 DECLAR ...

  2. 华南理工计算机应用基础考试答案,我想问下华南理工大学继续教育学院大学英语B(一)和计算机应用基础的随堂练习答案有吗?复习题纲有吗?...

    我想问下华南理工大学继续教育学院大学英语B(一)和计算机应用基础的随堂练习答案有吗?复习题纲有吗?,一.我想问下华南理工大学继续教育学院大学英语B(一)和计算机应用基础的随堂练习答案有吗?复习题纲有吗 ...

  3. 什么分数适合学计算机,我是今年高考毕业生分数293,我想问下女孩子学计算机类的专业合适吗?还有我这个分数可以学吗?...

    我是今年高考毕业生分数293,我想问下女孩子学计算机类的专业合适吗?还有我这个分数可以学吗?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶 ...

  4. java高并发面试题目_列举Java高并发面试题附答案解析

    Java高并发面试题是程序员面试过程中的必修课,只有熟练掌握这些技术要点,在我们的学习中才会脱颖而出,在这里,达内石家庄Java培训老师作深入解答. Java并发面试题附答案 1. 什么是原子操作?在 ...

  5. java项目使用技术要求_想学JAVA 这些技术要求你必须知道,否则没戏

    在当今时代,随着电子产业的迅猛发展,Java技术也得到越来越广泛的应用,Java工程师随之也成为受欢迎的IT岗位,但是Java工程师到底是干什么的呢?安博亚威告诉你. Java工程师,直白点来说,就好 ...

  6. mysql存储过程执行两边_麻烦问下,为什么我的mysql存储过程一次调用,会被执行了两次?...

    你的位置: 问答吧 -> MySQL -> 问题详情 麻烦问下,为什么我的mysql存储过程一次调用,会被执行了两次? mysql版本是 mysql-community-5.1.45 系统 ...

  7. 让我摘下星星送给你_想摘下星星给你摘下月亮给你是什么歌

    最近中国新说唱有一首歌很是好听,这首歌歌曲开头是想摘下星星给你摘下月亮给你,那么这首歌是什么歌呢?下面就让我们来了解一下吧. 想摘下星星给你摘下月亮给你是什么歌 据悉这首歌叫作<星球坠落 (Li ...

  8. java怎么把数组的元素个数_想问一下怎样才可以把一个数 放在已知数组里面

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import java.util.Arrays; public class Test { public static void main(String.. ...

  9. 数据库和python有关系吗_想问一下,数据跟代码种类有关系么? 比如我用MySQL数据库,必须要用python或者JAVA之类的要求...

    你可以访问python数据库接口及api查看详细的支持数据库列表.不同的数据库你需要下载不同的db api模块,例如你需要访问oracle数据库和mysql数据,你需要下载oracle和mysql数据 ...

最新文章

  1. 4.3 IDEA 常用快捷键
  2. 物联网产品背后潜藏着危机
  3. WIN7 中配置局域网
  4. 《挑战程序设计竞赛》2.2 贪心法-其它 POJ3617 3069 3253 2393 1017 3040 1862 3262
  5. vue下拉框值改变事件_vue和element ui 下拉框select的change事件
  6. 招商银行信用卡中心华泰证券暑期实习软开笔试小结
  7. Python1 安装和配置
  8. java 执行 awk_3.1 biostar lesson3 linux学习日记;java版本;awk
  9. 京东回应 5000 万用户数据泄露;百度向今日头条索赔 9000 万;腾讯全球专利申请量第二 | 极客头条...
  10. 二维随机变量函数卷积公式的推导
  11. 旅游信息管理后台(SSM后台管理系统)
  12. 计算机质量检测技术,计算机技术在建材质量检测中的应用分析
  13. 上交计算机考研专业课,2020上海交通大学计算机考研经验,过来人谈考研
  14. java生成报表_用java实现报表导出
  15. 联想微型计算机beta2,联想的两款Detachable 2-in-1新品,可能是我未来会买的移动办公/床头娱乐本...
  16. sql server 完全卸载后报错unknown\comopnents\.....\...... vertify that you have sufficient access to thatkey
  17. Android UI切图命名规范
  18. 大型开源车牌数据集CCPD及私有车牌数据集介绍
  19. Elasticsearch中安装IK分词器
  20. web实现html页面思维导图效果

热门文章

  1. 无序列表圆点变空心_前端HTML -- 列表标签
  2. Linux下配置简单的图形桌面环境
  3. 【英语学习】【Level 08】U01 Let's Read L6 Person of the year
  4. 【英语学习】【Level 07】U05 Best Destination L3 An Australian Adventure
  5. 【英语学习】【加州教材】【G3】【科学】Science目录及术语表
  6. MMORPG的一份Unity手游性能蓝皮书
  7. Keras-11 GAN MNIST
  8. VLfeat win10 vs2015 编译
  9. 翻译自 RedHat 文章:What is middleware? (什么是中间件?)
  10. 【算法与数据结构实战】线性表操作-实现A并B,结果放入A中