From 153b905185b40182978758d409accbb76f678cb1 Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期四, 10 四月 2025 20:42:13 +0800 Subject: [PATCH] 修改视频直播方式为http-flv --- ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/util/JavaCVStreamUtil.java | 61 ++++++++++++++++++------------ 1 files changed, 37 insertions(+), 24 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 58728c7..ea4a44c 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,19 +2,25 @@ 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; /** * 音视频推流拉流工具类 * 参考资料:https://juejin.cn/post/7311230172237561866 + * * @author zhibing.pu * @Date 2025/4/8 16:03 */ +@Component public class JavaCVStreamUtil { private static Map<Integer, FFmpegFrameGrabber> grabberMap = new ConcurrentHashMap<>(); @@ -25,27 +31,33 @@ private static Map<Integer, Boolean> statusMap = new ConcurrentHashMap<>(); + @Resource + private RedisTemplate redisTemplate; + + @Resource + private ICarService carService; /** * 视频拉流和推流 */ - public static void push_flv(String inputUrl, String outputUrl, Integer deviceNumber){ + public static void push_flv(String inputUrl, String outputUrl, Integer deviceNumber) { OpenCVFrameGrabber grabber = null; // FFmpegFrameGrabber grabber = null; FFmpegFrameRecorder recorder = null; try { //关闭上一个没有正确关闭的流 FFmpegFrameGrabber fFmpegFrameGrabber = grabberMap.get(deviceNumber); - if(null != fFmpegFrameGrabber){ + if (null != fFmpegFrameGrabber) { fFmpegFrameGrabber.close(); } OpenCVFrameGrabber openCVFrameGrabber = grabberMap1.get(deviceNumber); - if(null != openCVFrameGrabber){ - openCVFrameGrabber.close();; + if (null != openCVFrameGrabber) { + openCVFrameGrabber.close(); + ; } FFmpegFrameRecorder fFmpegFrameRecorder = frameRecorderMap.get(deviceNumber); - if(null != fFmpegFrameRecorder){ + if (null != fFmpegFrameRecorder) { fFmpegFrameRecorder.close(); } @@ -95,13 +107,13 @@ while ((frame = grabber.grab()) != null) { recorder.record(frame); //判断状态为停止,则结束此线程任务 - if(!statusMap.get(deviceNumber)){ + if (!statusMap.get(deviceNumber)) { break; } } } catch (FrameGrabber.Exception | FrameRecorder.Exception e) { e.printStackTrace(); - }finally { + } finally { close(deviceNumber, null); } } @@ -110,7 +122,7 @@ /** * 视频拉流和推流 */ - public static void push_hls(String inputUrl, String outputUrl, Integer deviceNumber, String folderPath){ + public static void push_hls(String inputUrl, String outputUrl, Integer deviceNumber, String folderPath) { OpenCVFrameGrabber grabber = null; // FFmpegFrameGrabber grabber = null; FFmpegFrameRecorder recorder = null; @@ -118,15 +130,16 @@ try { //关闭上一个没有正确关闭的流 FFmpegFrameGrabber fFmpegFrameGrabber = grabberMap.get(deviceNumber); - if(null != fFmpegFrameGrabber){ + if (null != fFmpegFrameGrabber) { fFmpegFrameGrabber.close(); } OpenCVFrameGrabber openCVFrameGrabber = grabberMap1.get(deviceNumber); - if(null != openCVFrameGrabber){ - openCVFrameGrabber.close();; + if (null != openCVFrameGrabber) { + openCVFrameGrabber.close(); + ; } FFmpegFrameRecorder fFmpegFrameRecorder = frameRecorderMap.get(deviceNumber); - if(null != fFmpegFrameRecorder){ + if (null != fFmpegFrameRecorder) { fFmpegFrameRecorder.close(); } @@ -194,13 +207,13 @@ while ((frame = grabber.grab()) != null) { recorder.record(frame); //判断状态为停止,则结束此线程任务 - if(!statusMap.get(deviceNumber)){ + if (!statusMap.get(deviceNumber)) { break; } } } catch (FrameGrabber.Exception | FrameRecorder.Exception e) { e.printStackTrace(); - }finally { + } finally { close(deviceNumber, folderPath); } } @@ -208,12 +221,13 @@ /** * 关闭推流和拉流进程 + * * @param deviceNumber */ - public static void close(Integer deviceNumber, String folderPath){ + public static void close(Integer deviceNumber, String folderPath) { //设置状态为停止 Boolean status = statusMap.get(deviceNumber); - if(null == status || !status){ + if (null == status || !status) { return; } statusMap.put(deviceNumber, false); @@ -222,26 +236,25 @@ FFmpegFrameRecorder fFmpegFrameRecorder = null; try { fFmpegFrameGrabber = grabberMap.get(deviceNumber); - if(null != fFmpegFrameGrabber){ - fFmpegFrameGrabber.flush(); + if (null != fFmpegFrameGrabber) { fFmpegFrameGrabber.close(); } openCVFrameGrabber = grabberMap1.get(deviceNumber); - if(null != openCVFrameGrabber){ - openCVFrameGrabber.flush(); + if (null != openCVFrameGrabber) { openCVFrameGrabber.close(); } fFmpegFrameRecorder = frameRecorderMap.get(deviceNumber); - if(null != fFmpegFrameRecorder){ - fFmpegFrameRecorder.flush(); + if (null != fFmpegFrameRecorder) { fFmpegFrameRecorder.close(); } - }catch (Exception e){ + } catch (Exception e) { e.printStackTrace(); } //开始清除视频文件 - if(StringUtils.isNotEmpty(folderPath)){ + if (StringUtils.isNotEmpty(folderPath)) { FileUtil.del(folderPath); } } + + } -- Gitblit v1.7.1