Java高全级别灰色_想问下用过JAVACV的大兄弟,为啥我这边抽取图片总是有灰色图片...
//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的大兄弟,为啥我这边抽取图片总是有灰色图片...相关推荐
- mysql存储过程实验几轮_想问下数据库中有关存储过程的实验,求大神!
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 DELIMITER || CREATE PROCEDURE procedure_for_customers () BEGIN -- 定义参数 DECLAR ...
- 华南理工计算机应用基础考试答案,我想问下华南理工大学继续教育学院大学英语B(一)和计算机应用基础的随堂练习答案有吗?复习题纲有吗?...
我想问下华南理工大学继续教育学院大学英语B(一)和计算机应用基础的随堂练习答案有吗?复习题纲有吗?,一.我想问下华南理工大学继续教育学院大学英语B(一)和计算机应用基础的随堂练习答案有吗?复习题纲有吗 ...
- 什么分数适合学计算机,我是今年高考毕业生分数293,我想问下女孩子学计算机类的专业合适吗?还有我这个分数可以学吗?...
我是今年高考毕业生分数293,我想问下女孩子学计算机类的专业合适吗?还有我这个分数可以学吗?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶 ...
- java高并发面试题目_列举Java高并发面试题附答案解析
Java高并发面试题是程序员面试过程中的必修课,只有熟练掌握这些技术要点,在我们的学习中才会脱颖而出,在这里,达内石家庄Java培训老师作深入解答. Java并发面试题附答案 1. 什么是原子操作?在 ...
- java项目使用技术要求_想学JAVA 这些技术要求你必须知道,否则没戏
在当今时代,随着电子产业的迅猛发展,Java技术也得到越来越广泛的应用,Java工程师随之也成为受欢迎的IT岗位,但是Java工程师到底是干什么的呢?安博亚威告诉你. Java工程师,直白点来说,就好 ...
- mysql存储过程执行两边_麻烦问下,为什么我的mysql存储过程一次调用,会被执行了两次?...
你的位置: 问答吧 -> MySQL -> 问题详情 麻烦问下,为什么我的mysql存储过程一次调用,会被执行了两次? mysql版本是 mysql-community-5.1.45 系统 ...
- 让我摘下星星送给你_想摘下星星给你摘下月亮给你是什么歌
最近中国新说唱有一首歌很是好听,这首歌歌曲开头是想摘下星星给你摘下月亮给你,那么这首歌是什么歌呢?下面就让我们来了解一下吧. 想摘下星星给你摘下月亮给你是什么歌 据悉这首歌叫作<星球坠落 (Li ...
- java怎么把数组的元素个数_想问一下怎样才可以把一个数 放在已知数组里面
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import java.util.Arrays; public class Test { public static void main(String.. ...
- 数据库和python有关系吗_想问一下,数据跟代码种类有关系么? 比如我用MySQL数据库,必须要用python或者JAVA之类的要求...
你可以访问python数据库接口及api查看详细的支持数据库列表.不同的数据库你需要下载不同的db api模块,例如你需要访问oracle数据库和mysql数据,你需要下载oracle和mysql数据 ...
最新文章
- 4.3 IDEA 常用快捷键
- 物联网产品背后潜藏着危机
- WIN7 中配置局域网
- 《挑战程序设计竞赛》2.2 贪心法-其它 POJ3617 3069 3253 2393 1017 3040 1862 3262
- vue下拉框值改变事件_vue和element ui 下拉框select的change事件
- 招商银行信用卡中心华泰证券暑期实习软开笔试小结
- Python1 安装和配置
- java 执行 awk_3.1 biostar lesson3 linux学习日记;java版本;awk
- 京东回应 5000 万用户数据泄露;百度向今日头条索赔 9000 万;腾讯全球专利申请量第二 | 极客头条...
- 二维随机变量函数卷积公式的推导
- 旅游信息管理后台(SSM后台管理系统)
- 计算机质量检测技术,计算机技术在建材质量检测中的应用分析
- 上交计算机考研专业课,2020上海交通大学计算机考研经验,过来人谈考研
- java生成报表_用java实现报表导出
- 联想微型计算机beta2,联想的两款Detachable 2-in-1新品,可能是我未来会买的移动办公/床头娱乐本...
- sql server 完全卸载后报错unknown\comopnents\.....\...... vertify that you have sufficient access to thatkey
- Android UI切图命名规范
- 大型开源车牌数据集CCPD及私有车牌数据集介绍
- Elasticsearch中安装IK分词器
- web实现html页面思维导图效果
热门文章
- 无序列表圆点变空心_前端HTML -- 列表标签
- Linux下配置简单的图形桌面环境
- 【英语学习】【Level 08】U01 Let's Read L6 Person of the year
- 【英语学习】【Level 07】U05 Best Destination L3 An Australian Adventure
- 【英语学习】【加州教材】【G3】【科学】Science目录及术语表
- MMORPG的一份Unity手游性能蓝皮书
- Keras-11 GAN MNIST
- VLfeat win10 vs2015 编译
- 翻译自 RedHat 文章:What is middleware? (什么是中间件?)
- 【算法与数据结构实战】线性表操作-实现A并B,结果放入A中