南昌市物联网技防平台-后台
zengh
2021-06-01 cd2cfd37366002f790a2ed1435962d4eff7d5cec
blade-service/blade-jfpts/src/main/java/org/springblade/jfpt/rvideo/controller/RvideoController.java
@@ -16,23 +16,18 @@
 */
package org.springblade.jfpt.rvideo.controller;
import io.minio.MinioClient;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import jodd.util.StringPool;
import lombok.AllArgsConstructor;
import javax.validation.Valid;
import net.logstash.logback.encoder.org.apache.commons.lang3.StringEscapeUtils;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.StringUtil;
import org.springblade.jfpt.alarm.service.IAlarmService;
import org.springblade.jfpt.xlfeedback.service.IXlfeedbackService;
import org.springframework.web.bind.annotation.*;
@@ -46,6 +41,7 @@
import org.bytedeco.javacpp.avcodec;
import org.bytedeco.javacv.*;
import java.io.IOException;
import java.util.Date;
/**
@@ -68,6 +64,16 @@
   private static  Thread thread;
   private static  String UUIDs;
   private static  String uids;
   private static  int count=0;
   private static  String xcbj = "cs";
   //录制视频相关
   private static String streamURL;// 流地址(测试可以用obs推流)
   private static String filePath;// 文件路径
   private static Long timesSec = 100L;// 停止录制时长 0为不限制时长
   private static String fileFormat = "mp4";//录制的文件格式
   private static boolean isAudio = false;//是否录制声音
   private static boolean stop = false;
   /**
    * 详情
@@ -200,37 +206,172 @@
//   }
      /**
   /**
    * Javacv录制视频
    */
   @PostMapping("/rVoids")
   public void rVoids(String url,String uid) {
      String UUID = DateUtil.time();
      uids=uid;
   public void rVoids(String url,String uid,String jid) {
      /*String UUID = DateUtil.time();
      UUIDs=UUID;
      uids=uid;
      RecordVideoThread recordVideoThread = new RecordVideoThread();
      recordVideoThread.filePath = "D:\\software\\minio\\data\\jfpt\\void\\"+UUID + ".mp4";
      recordVideoThread.filePath = "D:\\video\\"+UUID + ".mp4";
      recordVideoThread.timesSec = 0L;
      String newJson = StringEscapeUtils.unescapeHtml4(url);
      recordVideoThread.streamURL =newJson;// 最好设置结束时长 如直接停止程序会造成输出文件的损坏无法正常播放
      recordVideoThread.isAudio = true;
      thread = new Thread(recordVideoThread);
      thread.start();
      thread.start();*/
      String UUID = DateUtil.time();
      UUIDs=UUID;
      uids=uid;
      //filePath = "D:\\video\\"+UUID + ".mp4";
      filePath = "D:\\software\\minio\\data\\jfpt\\void\\"+UUID + ".mp4";
      timesSec = 0L;
      String newJson = StringEscapeUtils.unescapeHtml4(url);
      streamURL =newJson;// 最好设置结束时长 如直接停止程序会造成输出文件的损坏无法正常播放
      isAudio = true;
      xcbj = "ce";
      Thread threads = new Thread(new Runnable() {
         @Override
         public void run() {
            //System.out.println("开始1111111");
            // 获取视频源
            FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(streamURL);
            FFmpegFrameRecorder recorder = null;
            try {
               grabber.start();
               Frame frame = grabber.grabFrame();
               createFile();
               //"rtmp://192.168.1.225:1935/live/home"
               // 流媒体输出地址,分辨率(长,高),是否录制音频(0:不录制/1:录制)
               recorder = new FFmpegFrameRecorder(filePath, 1280, 720, isAudio ? 1 : 0);
               recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);// 直播流格式
               recorder.setFormat(fileFormat);// 录制的视频格式
               recorder.setFrameRate(10);// 帧数
               //百度翻译的比特率,默认400000,但是我400000贼模糊,调成800000比较合适
               recorder.setVideoBitrate(800000);
               recorder.start();
               System.out.println("推流开始");
               //记录当前时间
               long dqdate = new Date().getTime();
               while (!jid.equals(xcbj)) {
                  //记录现在时间
                  long xzdate = new Date().getTime();
                  if (xzdate > (dqdate + 300000)){
                     break;
                  }
                  if (frame != null){
                     System.out.println("开始");
                     recorder.record(frame);//录制
                     frame = grabber.grabFrame();//获取下一帧
                     System.out.println("结束");
                  }
               }
               if (jid.equals(xcbj)){
                  recorder.record(frame);
               }
            } catch (Exception e) {
               e.printStackTrace();
            } finally {
               //停止录制
               if (null != grabber) {
                  try {
                     grabber.stop();
                  } catch (FrameGrabber.Exception e) {
                     e.printStackTrace();
                  }
               }
               if (recorder != null) {
                  try {
                     recorder.stop();
                  } catch (FrameRecorder.Exception e) {
                     e.printStackTrace();
                  }
               }
               System.out.println("录制完成,录制时长:" + timesSec + "秒");
               String vaddress = null;
               //返回路径
               vaddress = "https://web.byisf.com/" + PRF_MINIO_URL + UUID + ".mp4";
               //把路径通过警情id添加到警情信息
               alarmService.updateVaddress(vaddress, uids, jid);
            }
         }
      });
      threads.start();
   }
   private void createFile() {
      File outFile = new File(filePath);
      if (filePath.isEmpty() || !outFile.exists() || outFile.isFile()) {
         try {
            outFile.createNewFile();
         } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
         }
      }
   }
   @PostMapping("/stop")
   public String stop(String jid) throws FrameGrabber.Exception {
      //返回前端路径
      String vaddress = null;
        thread.stop();
      //返回路径
      vaddress = "https://web.byisf.com/" + PRF_MINIO_URL + UUIDs + ".mp4";
      //把路径通过警情id添加到警情信息
      alarmService.updateVaddress(vaddress,uids,jid);
      return vaddress;
//      String vaddress = null;
//      if (thread != null){
//         thread.stop();
//         //返回路径
//         vaddress = "https://web.byisf.com/" + PRF_MINIO_URL + UUIDs + ".mp4";
//         //把路径通过警情id添加到警情信息
//         alarmService.updateVaddress(vaddress,uids,jid);
//         return vaddress;
//      }
      xcbj = jid;
      return "";
   }
//   /**
//    * Javacv录制视频测试
//    */
//   @PostMapping("/cs")
//   public void rVoids(String url,String uid) {
//      String UUID = DateUtil.time();
//      UUIDs=UUID;
//      String newJson = StringEscapeUtils.unescapeHtml4(url);
//      RecordVideoThread recordVideoThread = new RecordVideoThread(newJson,"D:\\software\\minio\\data\\jfpt\\void\\"+UUID +".mp4");
//      thread = new Thread(recordVideoThread);
//      thread.start();
//   }
//
//   @PostMapping("/csc")
//   public String stopcs(String jid) throws FrameGrabber.Exception {
//      //返回前端路径
//      String vaddress = null;
//      //  发出中断标志  true
//      thread.interrupt();
//      //返回路径
//      vaddress = "https://web.byisf.com/" + PRF_MINIO_URL + UUIDs + ".mp4";
//      //把路径通过警情id添加到警情信息
//      String uids=Integer.toString(count);
//      alarmService.updateVaddress(vaddress,uids,jid);
//      return vaddress;
//
//   }
}