通过javacv在ssm中使用mqtt抓拍IP摄像头的数据流照片

因为网上没找到资料,现在把我目前做出来的成功总结一下,打算日后再继续优化,殷切希望有大佬指导下我该怎么优化javacv工具包。

首先是在ssm中要引用:

</dependency> 
    <dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv-platform</artifactId>
    <version>1.3.3</version>
</dependency>

然后把javacv工具类放入工具包中:

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.bytedeco.javacv.FrameGrabber.Exception;

public class Javacv {
	private FFmpegFrameGrabber fGrabber;
	public Javacv() {
		super();
		// TODO Auto-generated constructor stub
	}
	/**
     * framestart 开启播放流,并抓拍
     * @param inputFile-该地址可以是网络直播/录播地址,也可以是远程/本地文件路径 
     */
    public BufferedImage intercept(String inputFile){
        // 根据视频源抓拍
        try {
        	fGrabber = new FFmpegFrameGrabber(inputFile);
        	fGrabber.start();
        	Frame frame = null;
        	BufferedImage bImage = null;
        	byte[] data = null;
        	while(data==null||data.length<500) {
        		frame = fGrabber.grab();
        		bImage = doExecuteFrame(frame);
        		if(bImage!=null&&bImage.getData()!=null&&bImage.getData().getDataBuffer()!=null&&((DataBufferByte)bImage.getData().getDataBuffer()).getData()!=null) {
        			data   =   ((DataBufferByte)bImage.getData().getDataBuffer()).getData();
                	System.out.println(data.length);
        		}
        	}
        	fGrabber.stop();
			return bImage;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			System.out.println("抓拍报错了");
			e.printStackTrace();
			return null;
		}
    }
    //保存方法
    public int save(BufferedImage bi,String Path) {
    	File output =new File(Path);
        try {
            ImageIO.write(bi,"jpg",output);
            return 1;
        }catch (IOException e) {
            e.printStackTrace();
            return 0;
        }
    	
    }
    //转换图片
    public BufferedImage doExecuteFrame(Frame f) {
        if (null ==f ||null ==f.image) {
            return null;
        }
        Java2DFrameConverter converter =new Java2DFrameConverter();
        BufferedImage bi =converter.getBufferedImage(f);
        
		return bi;
    }
}

创建一个servlet层spring管理的java类来对javacv工具进行封装:

import java.awt.image.BufferedImage;

import org.bytedeco.javacpp.RealSense.frame;
import org.bytedeco.javacpp.RealSense.intrinsics;
import org.bytedeco.javacv.Frame;
import org.springframework.stereotype.Service;

import com.iot.floor.db.Javacv;
@Service("JavacvService")
public class JavacvServiceimpl {

	private Javacv javacv;
	
	public JavacvServiceimpl() {
		// TODO Auto-generated constructor stub
		javacv = new Javacv();
	}
	
	public BufferedImage intercept(String inputFile) {
		return javacv.intercept(inputFile);
	}
	public int save(BufferedImage image,String Path) {
		
		return javacv.save(image, Path);
	}
}

因为mqtt不是本章的主题,所以这里只粘贴判断话题的代码:

 public void startCase(Message<String> recmsg){
	                //mqtt5.0
	    	 System.out.println("ok 00");
	        String topic = (String) recmsg.getHeaders().get("mqtt_topic");
	        String payload = recmsg.getPayload();
	        if(topic.equals("cloudofface")){
	        	System.out.println("进入");
        		BufferedImage image = javacvService.intercept("rtsp://IP:554/onvif1");
        		System.out.println("保存");
        		javacvService.save(image, "C:\\Users\\Asus\\Desktop\\资料\\"+payload+".png");
            }
}

然后就是激动人心的时刻了:

获得图片:

图片显示正常:

发布了12 篇原创文章 · 获赞 6 · 访问量 1873
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览