因为网上没找到资料,现在把我目前做出来的成功总结一下,打算日后再继续优化,殷切希望有大佬指导下我该怎么优化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");
}
}
然后就是激动人心的时刻了:
获得图片:
图片显示正常: