Ui互联网门户网站建设中国 日本 韩国
需求:
现在有一批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 {//视频路径URLString 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 blockgrabber.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消耗内存对比
