Pu Zhibing
2025-04-11 2b4f8907a65c347400432c8db1bccb97c6a26d30
修改视频播放bug
3个文件已修改
40 ■■■■■ 已修改文件
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CarController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/OrderController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/JavaCVStreamUtil.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/CarController.java
@@ -331,6 +331,6 @@
                JavaCVStreamUtil.push_flv(input, url, id);
            }
        });
//        carService.taskPlayDetection(id);
        carService.taskPlayDetection(id);
    }
}
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/OrderController.java
@@ -237,7 +237,7 @@
    }
    
    public void live_flv(String input, Integer id){
        String url = "rtsp://" + flvIp + ":" + flvRtmpPort + "/flv/" + id;
        String url = "rtmp://" + flvIp + ":" + flvRtmpPort + "/flv/" + id;
        //执行拉流和推流
        ExecutorService executorService = new ThreadPoolExecutor(1, 1,
                0L, TimeUnit.MILLISECONDS,
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/JavaCVStreamUtil.java
@@ -42,8 +42,8 @@
     * 视频拉流和推流
     */
    public static void push_flv(String inputUrl, String outputUrl, Integer deviceNumber) {
        OpenCVFrameGrabber grabber = null;
//        FFmpegFrameGrabber grabber = null;
//        OpenCVFrameGrabber grabber = null;
        FFmpegFrameGrabber grabber = null;
        FFmpegFrameRecorder recorder = null;
        try {
            //关闭上一个没有正确关闭的流
@@ -66,26 +66,26 @@
            FFmpegLogCallback.set();
            
            //视频抓帧
//            grabber = new FFmpegFrameGrabber(inputUrl);
//            grabber.setOption("rtsp_transport", "tcp");
//            // 正确设置超时时间
//            grabber.setOption("timeout", "120000");
//            grabber.start();
//            grabberMap.put(deviceNumber, grabber);
            grabber = new OpenCVFrameGrabber(0);
            grabber = new FFmpegFrameGrabber(inputUrl);
            grabber.setOption("rtsp_transport", "tcp");
            // 正确设置超时时间
            grabber.setOption("timeout", "120000");
            grabber.start();
            grabberMap1.put(deviceNumber, grabber);
            grabberMap.put(deviceNumber, grabber);
//            grabber = new OpenCVFrameGrabber(0);
//            grabber.start();
//            grabberMap1.put(deviceNumber, grabber);
            
            //录制视频,推送到流媒体服务器(nginx)
            recorder = new FFmpegFrameRecorder(outputUrl, grabber.getImageWidth(), grabber.getImageHeight());
            recorder.setFormat("flv");
            // 设置视频比特率
            recorder.setVideoBitrate(grabber.getVideoBitrate());
//            // 设置帧率
//            recorder.setFrameRate(grabber.getVideoFrameRate());
//            // 设置关键帧间隔
//            recorder.setGopSize((int) grabber.getVideoFrameRate());
            // 设置帧率
            recorder.setFrameRate(grabber.getVideoFrameRate());
            // 设置关键帧间隔
            recorder.setGopSize((int) grabber.getVideoFrameRate());
            // CRF 是一种用于控制视频/音频质量的参数,它允许在保持目标质量的同时动态地调整比特率。较低的CRF值表示更高的质量,但也可能导致较大的文件大小
            recorder.setAudioOption("crf", "23");
            
@@ -110,9 +110,12 @@
                if (!statusMap.get(deviceNumber)) {
                    break;
                }
                Thread.sleep(500);
            }
        } catch (FrameGrabber.Exception | FrameRecorder.Exception e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        } finally {
            close(deviceNumber, null);
        }
@@ -237,14 +240,17 @@
        try {
            fFmpegFrameGrabber = grabberMap.get(deviceNumber);
            if (null != fFmpegFrameGrabber) {
                fFmpegFrameGrabber.flush();
                fFmpegFrameGrabber.close();
            }
            openCVFrameGrabber = grabberMap1.get(deviceNumber);
            if (null != openCVFrameGrabber) {
                openCVFrameGrabber.flush();
                openCVFrameGrabber.close();
            }
            fFmpegFrameRecorder = frameRecorderMap.get(deviceNumber);
            if (null != fFmpegFrameRecorder) {
                fFmpegFrameRecorder.flush();
                fFmpegFrameRecorder.close();
            }
        } catch (Exception e) {