南昌市物联网技防平台-后台
tangzy
2021-04-24 97a0bbd8b75c7ba8df78a1e8f67bbaad23edf298
blade-service/blade-jfpts/src/main/java/org/springblade/jfpt/rvideo/controller/RvideoController.java
@@ -62,6 +62,7 @@
   private static String PRF_MINIO_URL = "minio/jfpt/void/";
   private static  Thread thread;
   private static  String UUIDs;
   private static  String uids;
   private static  int count=0;
   /**
@@ -195,143 +196,66 @@
//   }
//      /**
//    * Javacv录制视频
//    */
//   @PostMapping("/rVoids")
//   public void rVoids(String url,String uid) {
//      String UUID = DateUtil.time();
//      uids=uid;
//      UUIDs=UUID;
//      RecordVideoThread recordVideoThread = new RecordVideoThread();
//      recordVideoThread.filePath = "D:\\software\\minio\\data\\jfpt\\void\\"+UUID + ".mp4";
//      recordVideoThread.timesSec = 0L;
//      String newJson = StringEscapeUtils.unescapeHtml4(url);
//      recordVideoThread.streamURL =newJson;// 最好设置结束时长 如直接停止程序会造成输出文件的损坏无法正常播放
//      recordVideoThread.isAudio = true;
//      thread = new Thread(recordVideoThread);
//      thread.start();
//   }
//   @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;
//
//   }
   public class RecordVideoThread implements Runnable {
      public String streamURL;// 流地址(测试可以用obs推流)
      public String filePath;// 文件路径
      public Long timesSec = 0L;// 停止录制时长 0为不限制时长
      public String fileFormat = "mp4";//录制的文件格式
      public boolean isAudio = true;//是否录制声音
      public RecordVideoThread(String streamURL, String filePath) {
         this.streamURL = streamURL;
         this.filePath = filePath;
      }
      @Override
      public void run() {
         System.out.println(streamURL);
         // 获取视频源
         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(25);// 帧数
            //百度翻译的比特率,默认400000,但是我400000贼模糊,调成800000比较合适
            recorder.setVideoBitrate(800000);
            recorder.start();
            System.out.println("推流开始");
            while (!Thread.currentThread().isInterrupted()){
               System.out.println("开始");
               recorder.record(frame);//录制
               frame = grabber.grabFrame();//获取下一帧
               System.out.println("结束");
            }
            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 + "秒");
         }
      }
      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();
            }
         }
      }
   }
   /**
    * Javacv录制视频测试
    * Javacv录制视频
    */
   @PostMapping("/rVoids")
   public void cs(String url,String uid) {
   public void rVoids(String url,String uid) {
      String UUID = DateUtil.time();
      UUIDs=UUID;
      if (uid!=null){
         count++;
      }
      uids=uid;
      RecordVideoThread recordVideoThread = new RecordVideoThread();
      recordVideoThread.filePath = "D:\\software\\minio\\data\\jfpt\\void\\"+UUID + ".mp4";
      recordVideoThread.timesSec = 0L;
      String newJson = StringEscapeUtils.unescapeHtml4(url);
      RecordVideoThread recordVideoThread = new RecordVideoThread(newJson,"D:\\software\\minio\\data\\jfpt\\void\\"+UUID +".mp4");
      recordVideoThread.streamURL =newJson;// 最好设置结束时长 如直接停止程序会造成输出文件的损坏无法正常播放
      recordVideoThread.isAudio = true;
      thread = new Thread(recordVideoThread);
      thread.start();
   }
   @PostMapping("/stop")
   public String stopcs(String jid) throws FrameGrabber.Exception {
   public String stop(String jid) throws FrameGrabber.Exception {
      //返回前端路径
      String vaddress = null;
      //  发出中断标志  true
      thread.interrupt();
        thread.stop();
      //返回路径
      vaddress = "https://web.byisf.com/" + PRF_MINIO_URL + UUIDs + ".mp4";
      //把路径通过警情id添加到警情信息
      String uids=Integer.toString(count);
      alarmService.updateVaddress(vaddress,uids,jid);
      return vaddress;
   }
//   /**
//    * 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;
//
//   }
}