需求:
现在有一批https的监控视频流URL,需要对视频流进行每三秒截屏一次,并保存到本地路径,png格式,以当前时间命名。
代码:
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main(String[] args) throws IOException {
//视频路径URL
String file = "https://os7.com/v3/openlive/K95.m3u8?expire=1731&id=5658&ev=100";
FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(file);
grabber.setOption("rtsp_transport", "tcp"); // 使用tcp的方式,不然会丢包很严重
// grabber.setImageWidth(1920);
// grabber.setImageHeight(1080);
// 设置采集器构造超时时间(单位微秒,1秒=1000000微秒)
grabber.setOption("stimeout", "9000000");
System.out.println("grabber start");
grabber.start();
//1.播放视频
/*
CanvasFrame canvasFrame = new CanvasFrame("摄像机");
canvasFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
canvasFrame.setAlwaysOnTop(true);
OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();
while (true){
Frame frame = grabber.grabImage();
opencv_core.Mat mat = converter.convertToMat(frame);
canvasFrame.showImage(frame);
}
*/
// 2.帧截图
while (true) {
try {
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss");
System.out.println("当前时间" + dateFormat.format(date));
File outPut = new File("D:\\截屏\\截取1\\" + dateFormat.format(date) + ".png");
Frame frame = grabber.grabImage();
if (frame != null) {
/**
* 发送post请求
*/
// try {
// HttpUtil.doPostToJson("http://sc.dev-forestrycloud.cn/detect",frame);
// } catch (Exception e) {
// throw new RuntimeException(e);
// }
ImageIO.write(FrameToBufferedImage(frame), "png", outPut);
System.out.println("图片已保存");
}
//睡眠三秒钟
Thread.currentThread().sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
grabber.stop();
grabber.release();
e.printStackTrace();
}
}
}
/**
* 创建BufferedImage对象
*/
public static BufferedImage FrameToBufferedImage(Frame frame) {
Java2DFrameConverter converter = new Java2DFrameConverter();
BufferedImage bufferedImage = converter.getBufferedImage(frame);
// bufferedImage=rotateClockwise90(bufferedImage);
return bufferedImage;
}
/**
* 处理图片,将图片旋转90度。
*/
// public static BufferedImage rotateClockwise90(BufferedImage bi) {
// int width = bi.getWidth();
// int height = bi.getHeight();
// BufferedImage bufferedImage = new BufferedImage(height, width, bi.getType());
// for (int i = 0; i < width; i++)
// for (int j = 0; j < height; j++)
// bufferedImage.setRGB(j, i, bi.getRGB(i, j));
// return bufferedImage;
// }
}
这是一个Maven工程,还需要在pom文件导入如下依赖
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.4.4</version>
</dependency>
运行
打包(jar包)
由于IDAE太吃内存了,截取视频流需要挂在后台一直跑,我们打包丢在cmd里跑
因为在Maven中引入了依赖,所以打包前要在pom文件加入如下build
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.5.5</version>
<configuration>
<archive>
<manifest>
<mainClass>com.yj.TCPClient.upload.App</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<!-- 添加此项后,可直接使用mvn package | mvn install -->
<!-- 不添加此项,需直接使用mvn package assembly:single -->
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
直接使用Maven进行package
打包完成后target下会有两个jar包
带-with-dependencies的就是含有依赖的jar包
打开cmd Java-jar
发现报错了,找不到或无法加载主类 com.yj.TCPClient.upload.App
使用压缩软件打开此jar包下的META-INF
再用记事本打开MANIFEST.MF
用来是Main-Class出现了错误,我们自己手动修改一下
主类路径,就是java包下main方法的相对路径
修改后
然后再跑一次
方法二
参考了下面博客打包它的Main-Class是正确的
解决IDEA打Jar包找不到或无法加载主类问题_敲代码的余文乐的博客-CSDN博客_启动jar包找不到或无法加载主类
按照上面这篇博客重新打包一次,在项目的out下会生成一个jar包,可以直接跑
检查一下,这个jar包的MANIFEST.MF
正确!
对比一下,IDEA与cmd消耗内存对比