xiangpei
2024-09-30 a4d54f771794a8ea36319c679d489180b595edfd
工单取图片优化
2个文件已修改
79 ■■■■■ 已修改文件
ycl-server/src/main/java/com/ycl/platform/service/WorkOrderService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/WorkOrderService.java
@@ -189,7 +189,7 @@
     * @param workOrderNo 工单号
     * @return 数据
     */
    String getFrameImgByDevice(String deviceId, String channelId, String workOrderNo);
    String getFrameImgByDevice(String deviceId, String channelId, String workOrderNo) throws Exception;
    /**
     * 工单设备点播获取一帧图片,并保存到数据库
ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java
@@ -56,7 +56,10 @@
import org.springframework.util.CollectionUtils;
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;
import java.net.HttpURLConnection;
import java.net.URL;
@@ -760,7 +763,7 @@
    @Override
    public synchronized String getFrameImgByDevice(String deviceId, String channelId, String workOrderNo) {
    public synchronized String getFrameImgByDevice(String deviceId, String channelId, String workOrderNo) throws Exception {
        String url = String.format(this.rtspServer + "/api/play/start/%s/%s", deviceId, channelId);
        String result = HttpUtils.sendGet(url);
        log.error("拿到取流响应结果:" + result);
@@ -771,51 +774,37 @@
            JSONObject data = (JSONObject) wvpResult.getData();
            String rtspUrl = data.getString("rtsp"); // 取地址
            log.error("目标地址:" + rtspUrl);
            FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(rtspUrl);
            if (StringUtils.hasText(rtspUrl)) {
                try {
                    FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(rtspUrl);
//                    grabber.setOption("rtsp_transport", "tcp"); // 使用tcp的方式,不然会丢包很严重
                    grabber.setImageWidth(960);
                    grabber.setImageHeight(540);
                    grabber.setOption("rtsp_transport", "tcp"); // 使用tcp的方式,不然会丢包很严重
                    grabber.setImageWidth(1920);
                    grabber.setImageHeight(1080);
                    grabber.setFrameRate(25);
                    grabber.start();
                    CanvasFrame canvasFrame = new CanvasFrame("正茂");// 创建窗口
                    canvasFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置窗口关闭程序是否也跟随关闭
                    canvasFrame.setAlwaysOnTop(true);
                    OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();
                    int ex = 0;
                    while (true) {
                        if (ex > 1) {
                            break;
                    Frame frame = grabber.grabFrame();
                    if (frame != null) {
                        //转换图像
                        Java2DFrameConverter converter = new Java2DFrameConverter();
                        BufferedImage srcImage = converter.getBufferedImage(frame);
                        if (srcImage != null) {
                            imgUrl = workOrderNo + "_" + IdUtils.fastSimpleUUID() + ".png";
                            // 生成图片路径
                            String imgPath = PlatformConfig.getProfile() + "/" + imgUrl;
                            System.out.println("图片保存地址:" + imgPath);
                            imgUrl = Constants.RESOURCE_PREFIX + "/" + imgUrl;
                            //创建文件
                            File file = new File(imgPath);
                            //输出文件
                            ImageIO.write(srcImage, "png", file);
                        }
                        Frame frame = grabber.grabImage();
                        canvasFrame.showImage(frame);
                        //程序到这里其实已经实现了预览的功能了,下面的方法就是将流保存成图片
                        //opencv_core.Mat
                        Mat mat = converter.convertToMat(frame);
                        imgUrl = workOrderNo + "_" + IdUtils.fastSimpleUUID() + ".png";
                        // 生成图片路径
                        String imgPath = PlatformConfig.getProfile() + "/" + imgUrl;
                        System.out.println("图片保存地址:" + imgPath);
                        imgUrl = Constants.RESOURCE_PREFIX + "/" + imgUrl;
                        opencv_imgcodecs.imwrite(imgPath, mat);
                        ex++;
                        try {
                            Thread.sleep(1000);
                        }
                        catch (InterruptedException e)
                        {
                            e.printStackTrace();
                        } // 1000毫秒刷新一次圖像
                    }
                    grabber.stop(); // 停止捕获
                    grabber.release(); // 释放资源
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    grabber.stop(); // 停止捕获
                    grabber.close(); // 释放资源
                }
            }
        }
@@ -823,7 +812,7 @@
    }
    @Override
    public void saveFrameImgByDevice(String deviceId, String channelId, String workOrderNo) {
    public void saveFrameImgByDevice (String deviceId, String channelId, String workOrderNo){
        String url = String.format(this.rtspServer + "/api/play/start/%s/%s", deviceId, channelId);
        String result = HttpUtils.sendGet(url);
        WVPResult wvpResult = JSON.parseObject(result, WVPResult.class);
@@ -884,13 +873,13 @@
    }
    @Override
    public List<DeviceInfoVO> hasErrorWorkOrderList(Date start, Date end) {
    public List<DeviceInfoVO> hasErrorWorkOrderList (Date start, Date end){
        List<DeviceInfoVO> list = baseMapper.hasErrorWorkOrderList(start, end);
        return list;
    }
    @Override
    public void updateImgById(Integer workOrderId, String imgPath) {
    public void updateImgById (Integer workOrderId, String imgPath){
        new LambdaUpdateChainWrapper<>(baseMapper)
                .eq(WorkOrder::getId, workOrderId)
                .set(WorkOrder::getYwCheckResult, imgPath)
@@ -898,7 +887,7 @@
    }
    @Override
    public Result processImg(String workOrderNo) {
    public Result processImg (String workOrderNo){
        WorkOrder workOrder = new LambdaQueryChainWrapper<>(baseMapper)
                .eq(WorkOrder::getWorkOrderNo, workOrderNo)
                .one();
@@ -939,7 +928,7 @@
    }
    @Override
    public Result detailByNo(String workOrderNo) {
    public Result detailByNo (String workOrderNo){
        WorkOrderDetailVO workOrder = baseMapper.detailByNo(workOrderNo);
        // 是否报备
        boolean hasReport = new LambdaQueryChainWrapper<>(reportMapper)
@@ -961,7 +950,7 @@
    }
    @Override
    public List<WorkOrderVO> export(WorkOrderExportQuery query) {
    public List<WorkOrderVO> export (WorkOrderExportQuery query){
        query.setUnitId(SecurityUtils.getUnitId());
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        if (query.getStart() == null) {