| | |
| | | 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; |
| | | |
| | | /** |
| | | * 详情 |
| | |
| | | // } |
| | | |
| | | |
| | | /** |
| | | * Javacv录制视频 |
| | | // /** |
| | | // * 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录制视频测试 |
| | | */ |
| | | @PostMapping("/rVoids") |
| | | public void rVoids(String url,String uid) { |
| | | public void cs(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; |
| | | if (uid!=null){ |
| | | count++; |
| | | } |
| | | String newJson = StringEscapeUtils.unescapeHtml4(url); |
| | | recordVideoThread.streamURL =newJson;// 最好设置结束时长 如直接停止程序会造成输出文件的损坏无法正常播放 |
| | | recordVideoThread.isAudio = true; |
| | | RecordVideoThread recordVideoThread = new RecordVideoThread(newJson,"D:\\void\\"+UUID + ".mp4"); |
| | | thread = new Thread(recordVideoThread); |
| | | thread.start(); |
| | | } |
| | | |
| | | |
| | | |
| | | @PostMapping("/stop") |
| | | public String stop(String jid) throws FrameGrabber.Exception { |
| | | public String stopcs(String jid) throws FrameGrabber.Exception { |
| | | //返回前端路径 |
| | | String vaddress = null; |
| | | thread.stop(); |
| | | // 发出中断标志 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; |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | } |