From 0dcba4fd1cb536ab426622e31213d8a0194449ff Mon Sep 17 00:00:00 2001 From: puzhibing <393733352@qq.com> Date: 星期五, 25 四月 2025 14:12:30 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/JavaCVStreamUtil.java | 50 +++++++++++++++++++++++++++----------------------- 1 files changed, 27 insertions(+), 23 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..0b80278 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 @@ -2,14 +2,11 @@ import cn.hutool.core.io.FileUtil; import com.ruoyi.common.core.utils.StringUtils; -import com.ruoyi.system.service.ICarService; import org.bytedeco.ffmpeg.global.avcodec; import org.bytedeco.ffmpeg.global.avutil; import org.bytedeco.javacv.*; -import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; -import javax.annotation.Resource; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -31,19 +28,21 @@ private static Map<Integer, Boolean> statusMap = new ConcurrentHashMap<>(); - @Resource - private RedisTemplate redisTemplate; - @Resource - private ICarService carService; + public static void main(String[] args) { + String url = "rtmp://127.0.0.1:1935/flv/test"; + JavaCVStreamUtil.push_flv("C:\\Users\\39373\\Desktop\\图片\\trailer.mp4", url, 0); + } + + /** * 视频拉流和推流 */ 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 { //关闭上一个没有正确关闭的流 @@ -54,7 +53,6 @@ OpenCVFrameGrabber openCVFrameGrabber = grabberMap1.get(deviceNumber); if (null != openCVFrameGrabber) { openCVFrameGrabber.close(); - ; } FFmpegFrameRecorder fFmpegFrameRecorder = frameRecorderMap.get(deviceNumber); if (null != fFmpegFrameRecorder) { @@ -66,26 +64,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 +108,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 +238,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