From 2b4f8907a65c347400432c8db1bccb97c6a26d30 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期五, 11 四月 2025 15:30:50 +0800
Subject: [PATCH] 修改视频播放bug

---
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/JavaCVStreamUtil.java |   36 +++++++++++++++++++++---------------
 1 files changed, 21 insertions(+), 15 deletions(-)

diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/JavaCVStreamUtil.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/JavaCVStreamUtil.java
index ea4a44c..bc7a407 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/JavaCVStreamUtil.java
+++ b/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) {

--
Gitblit v1.7.1