Pu Zhibing
2025-05-06 1ad5e3d97eb99662b08c0f5acff34875deca04c1
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,11 +28,13 @@
   
   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);
   }
   
   
   /**
@@ -54,7 +53,6 @@
         OpenCVFrameGrabber openCVFrameGrabber = grabberMap1.get(deviceNumber);
         if (null != openCVFrameGrabber) {
            openCVFrameGrabber.close();
            ;
         }
         FFmpegFrameRecorder fFmpegFrameRecorder = frameRecorderMap.get(deviceNumber);
         if (null != fFmpegFrameRecorder) {
@@ -67,9 +65,7 @@
         
         //视频抓帧
         grabber = new FFmpegFrameGrabber(inputUrl);
         grabber.setOption("rtsp_transport", "tcp");
         // 正确设置超时时间
         grabber.setOption("timeout", "120000");
         grabber.setVideoCodec(avcodec.AV_CODEC_ID_H264);
         grabber.start();
         grabberMap.put(deviceNumber, grabber);
@@ -88,14 +84,14 @@
         recorder.setGopSize((int) grabber.getVideoFrameRate());
         // CRF 是一种用于控制视频/音频质量的参数,它允许在保持目标质量的同时动态地调整比特率。较低的CRF值表示更高的质量,但也可能导致较大的文件大小
         recorder.setAudioOption("crf", "23");
         //设置音频编码为AAC
         if (grabber.getAudioChannels() > 0) {
            recorder.setAudioChannels(grabber.getAudioChannels());
            recorder.setAudioBitrate(grabber.getAudioBitrate());
            recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
            recorder.setAudioCodec(grabber.getAudioCodec());
         }
         recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
         recorder.setVideoCodec(avcodec.AV_CODEC_ID_FLV1);
         //将解码后的帧记录到输出文件中
         //recorder.start通常用于处理已经解码成图像的视频数据
         recorder.start();
@@ -110,12 +106,9 @@
            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);
      }
@@ -193,7 +186,7 @@
            recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
         }
         
         recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
         recorder.setVideoCodec(avcodec.AV_CODEC_ID_FLV1);
         //设置音频编码为AAC
         if (grabber.getAudioChannels() > 0) {
            recorder.setAudioChannels(grabber.getAudioChannels());