| | |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.commons.lang3.ObjectUtils; |
| | | import org.bytedeco.javacv.FFmpegFrameGrabber; |
| | | import org.bytedeco.javacv.Frame; |
| | | import org.bytedeco.javacv.Java2DFrameConverter; |
| | | import org.bytedeco.javacv.*; |
| | | import org.bytedeco.opencv.global.opencv_imgcodecs; |
| | | import org.bytedeco.opencv.opencv_core.Mat; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | |
| | | import org.springframework.util.StringUtils; |
| | | |
| | | import javax.imageio.ImageIO; |
| | | import javax.swing.*; |
| | | import java.awt.image.BufferedImage; |
| | | import java.io.File; |
| | | import java.io.IOException; |
| | |
| | | log.error("目标地址:" + rtspUrl); |
| | | if (StringUtils.hasText(rtspUrl)) { |
| | | try { |
| | | // 创建FFmpegFrameGrabber对象 |
| | | FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(rtspUrl); |
| | | grabber.start(); // 开始捕获 |
| | | FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(rtspUrl); |
| | | grabber.setOption("rtsp_transport", "tcp"); // 使用tcp的方式,不然会丢包很严重 |
| | | grabber.setImageWidth(960); |
| | | grabber.setImageHeight(540); |
| | | grabber.start(); |
| | | CanvasFrame canvasFrame = new CanvasFrame("正茂");// 创建窗口 |
| | | canvasFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置窗口关闭程序是否也跟随关闭 |
| | | canvasFrame.setAlwaysOnTop(true); |
| | | |
| | | Frame frame; |
| | | String imgPath; |
| | | OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat(); |
| | | int ex = 0; |
| | | String imgPath = null; |
| | | while (true) { |
| | | frame = grabber.grabFrame(); |
| | | if (Objects.nonNull(frame)) { |
| | | // 将帧转换为图片 |
| | | Java2DFrameConverter converter = new Java2DFrameConverter(); |
| | | BufferedImage image = converter.convert(frame); |
| | | File outputfile = new File(serverConfig.getUrl() + PlatformConfig.getUploadPath() + deviceId + IdUtils.fastSimpleUUID() + ".png"); |
| | | ImageIO.write(image, "png", outputfile); |
| | | imgPath = outputfile.getAbsolutePath(); |
| | | log.error("图片地址: " + imgPath); |
| | | if (ex > 1) { |
| | | break; |
| | | } |
| | | Frame frame = grabber.grabImage(); |
| | | canvasFrame.showImage(frame); |
| | | //程序到这里其实已经实现了预览的功能了,下面的方法就是将流保存成图片 |
| | | |
| | | //opencv_core.Mat |
| | | Mat mat = converter.convertToMat(frame); |
| | | imgPath = serverConfig.getUrl() + PlatformConfig.getUploadPath() + deviceId + IdUtils.fastSimpleUUID() + ".png"; |
| | | opencv_imgcodecs.imwrite(imgPath, mat); |
| | | |
| | | ex++; |
| | | try { |
| | | Thread.sleep(1000); |
| | | } |
| | | catch (InterruptedException e) |
| | | { |
| | | e.printStackTrace(); |
| | | } // 1000毫秒刷新一次圖像 |
| | | } |
| | | grabber.stop(); // 停止捕获 |
| | | grabber.release(); // 释放资源 |