注释监控截图功能

This commit is contained in:
guoshengxiong 2024-11-06 16:51:15 +08:00
parent 7bae930daa
commit 1760c801e4

View File

@ -1,133 +1,133 @@
package com.zhgd.xmgl.util; //package com.zhgd.xmgl.util;
//
import lombok.extern.slf4j.Slf4j; //import lombok.extern.slf4j.Slf4j;
import org.bytedeco.javacv.FFmpegFrameGrabber; //import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame; //import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.FrameGrabber; //import org.bytedeco.javacv.FrameGrabber;
import org.bytedeco.javacv.Java2DFrameConverter; //import org.bytedeco.javacv.Java2DFrameConverter;
//
import javax.imageio.ImageIO; //import javax.imageio.ImageIO;
import java.awt.*; //import java.awt.*;
import java.awt.image.BufferedImage; //import java.awt.image.BufferedImage;
import java.io.File; //import java.io.File;
import java.io.IOException; //import java.io.IOException;
import java.math.BigDecimal; //import java.math.BigDecimal;
import java.math.RoundingMode; //import java.math.RoundingMode;
//
@Slf4j //@Slf4j
public class RtspUtils { //public class RtspUtils {
//
private static String RTSP_TRANSPORT_TYPE = "tcp"; // private static String RTSP_TRANSPORT_TYPE = "tcp";
/** // /**
* 视频帧率 // * 视频帧率
*/ // */
private static int FRAME_RATE = 1; // private static int FRAME_RATE = 1;
/** // /**
* 视频宽度 // * 视频宽度
*/ // */
// private static int FRAME_WIDTH = 1920; //// private static int FRAME_WIDTH = 1920;
private static int FRAME_WIDTH = 426; // private static int FRAME_WIDTH = 426;
/** // /**
* 视频高度 // * 视频高度
*/ // */
// private static int FRAME_HEIGHT = 1080; //// private static int FRAME_HEIGHT = 1080;
private static int FRAME_HEIGHT = 240; // private static int FRAME_HEIGHT = 240;
/** // /**
* 遍历500次确保实时图片显示正常图片 // * 遍历500次确保实时图片显示正常图片
*/ // */
private static int COUNT = 100; // private static int COUNT = 100;
//
/** // /**
* 解析视频地址并截图 // * 解析视频地址并截图
* // *
* @param path rstp 流地址 // * @param path rstp 流地址
* @param picPath 图片存放地址 // * @param picPath 图片存放地址
* @throws Exception // * @throws Exception
*/ // */
public static void getVideoImagePathByRSTP(String path, String picPath) throws Exception { // public static void getVideoImagePathByRSTP(String path, String picPath) throws Exception {
//创建rstp流对象 // //创建rstp流对象
FFmpegFrameGrabber grabber = createGrabber(path); // FFmpegFrameGrabber grabber = createGrabber(path);
try { // try {
//开启流获取 // //开启流获取
grabber.start(); // grabber.start();
//由于视频第一帧的流可能为黑屏 为了确保实时能截取到准确图像 // //由于视频第一帧的流可能为黑屏 为了确保实时能截取到准确图像
// 故此做了个for循环用于覆盖生成图片 // // 故此做了个for循环用于覆盖生成图片
for (int i = 0; i < COUNT; i++) { // for (int i = 0; i < COUNT; i++) {
//获取流视频框内的图像 // //获取流视频框内的图像
Frame frame = grabber.grabFrame(); // Frame frame = grabber.grabFrame();
//转换图像 // //转换图像
Java2DFrameConverter converter = new Java2DFrameConverter(); // Java2DFrameConverter converter = new Java2DFrameConverter();
BufferedImage srcImage = converter.getBufferedImage(frame); // BufferedImage srcImage = converter.getBufferedImage(frame);
if (srcImage != null) { // if (srcImage != null) {
//自定义画图 // //自定义画图
int w = srcImage.getWidth(); // int w = srcImage.getWidth();
int h = srcImage.getHeight(); // int h = srcImage.getHeight();
int weight = 426; // int weight = 426;
int height = new BigDecimal(weight).divide(new BigDecimal(w), 2, RoundingMode.HALF_UP).multiply(new BigDecimal(h)).setScale(0, RoundingMode.HALF_UP).intValue(); // int height = new BigDecimal(weight).divide(new BigDecimal(w), 2, RoundingMode.HALF_UP).multiply(new BigDecimal(h)).setScale(0, RoundingMode.HALF_UP).intValue();
BufferedImage bufferedImage = new BufferedImage(weight, height, BufferedImage.TYPE_3BYTE_BGR); // BufferedImage bufferedImage = new BufferedImage(weight, height, BufferedImage.TYPE_3BYTE_BGR);
bufferedImage.getGraphics().drawImage(srcImage.getScaledInstance(weight, height, Image.SCALE_SMOOTH), 0, 0, null); // bufferedImage.getGraphics().drawImage(srcImage.getScaledInstance(weight, height, Image.SCALE_SMOOTH), 0, 0, null);
//创建文件 // //创建文件
File file = new File(picPath); // File file = new File(picPath);
//输出文件 // //输出文件
ImageIO.write(bufferedImage, "jpg", file); // ImageIO.write(bufferedImage, "jpg", file);
break; // break;
} // }
} // }
} finally { // } finally {
grabber.stop(); // grabber.stop();
grabber.close(); // grabber.close();
} // }
//
//
} // }
//
//
/** // /**
* 构造视频抓取器 // * 构造视频抓取器
* // *
* @param rtsp 拉流地址 // * @param rtsp 拉流地址
* @return // * @return
*/ // */
private static FFmpegFrameGrabber createGrabber(String rtsp) { // private static FFmpegFrameGrabber createGrabber(String rtsp) {
// 获取视频源 // // 获取视频源
try { // try {
FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(rtsp); // FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(rtsp);
//设置传输方式 TCP | UDP // //设置传输方式 TCP | UDP
grabber.setOption("rtsp_transport", RTSP_TRANSPORT_TYPE); // grabber.setOption("rtsp_transport", RTSP_TRANSPORT_TYPE);
//设置帧率 // //设置帧率
grabber.setFrameRate(FRAME_RATE); // grabber.setFrameRate(FRAME_RATE);
//设置获取的视频宽度 // //设置获取的视频宽度
grabber.setImageWidth(FRAME_WIDTH); // grabber.setImageWidth(FRAME_WIDTH);
//设置获取的视频高度 // //设置获取的视频高度
grabber.setImageHeight(FRAME_HEIGHT); // grabber.setImageHeight(FRAME_HEIGHT);
// 设置采集器构造超时时间(单位微秒1秒=1000000微秒) // // 设置采集器构造超时时间(单位微秒1秒=1000000微秒)
grabber.setOption("stimeout", "2000000000"); // grabber.setOption("stimeout", "2000000000");
//设置视频bit率 // //设置视频bit率
// grabber.setVideoBitrate(2000000); // // grabber.setVideoBitrate(2000000);
// 过滤坏掉的帧 // // 过滤坏掉的帧
grabber.setVideoOption("skip_frame", "nokey"); // grabber.setVideoOption("skip_frame", "nokey");
// grabber.setOption("Connection", "keep-alive"); //// grabber.setOption("Connection", "keep-alive");
// 设置缓冲区大小为1MB // // 设置缓冲区大小为1MB
grabber.setOption("buffer_size", "10240000"); // grabber.setOption("buffer_size", "10240000");
return grabber; // return grabber;
} catch (FrameGrabber.Exception e) { // } catch (FrameGrabber.Exception e) {
log.error("创建解析rtsp FFmpegFrameGrabber 失败"); // log.error("创建解析rtsp FFmpegFrameGrabber 失败");
log.error("create rtsp FFmpegFrameGrabber exception: ", e); // log.error("create rtsp FFmpegFrameGrabber exception: ", e);
return null; // return null;
} // }
} // }
//
//
public static void main(String[] args) { // public static void main(String[] args) {
try { // try {
//参数1 rtsp 地址自行获取 参数2 截取图片存放地址 // //参数1 rtsp 地址自行获取 参数2 截取图片存放地址
RtspUtils.getVideoImagePathByRSTP("rtsp://222.80.185.228:554/openUrl/uAYM6I0", "C:\\Users\\Administrator\\Desktop\\t\\new\\1000.jpg"); // RtspUtils.getVideoImagePathByRSTP("rtsp://222.80.185.228:554/openUrl/uAYM6I0", "C:\\Users\\Administrator\\Desktop\\t\\new\\1000.jpg");
} catch (IOException e) { // } catch (IOException e) {
e.printStackTrace(); // e.printStackTrace();
} catch (Exception e) { // } catch (Exception e) {
e.printStackTrace(); // e.printStackTrace();
} // }
} // }
//
} //}
//