| | |
| | | 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; |
| | | |
| | | /** |
| | | * 详情 |
| | |
| | | // } |
| | | |
| | | |
| | | /** |
| | | /** |
| | | * Javacv录制视频 |
| | | */ |
| | | @PostMapping("/rVoids") |
| | | public void rVoids(String url,String uid) { |
| | | String UUID = DateUtil.time(); |
| | | 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; |
| | | // recordVideoThread.filePath = "D:\\software\\minio\\data\\jfpt\\void\\"+UUID + ".mp4"; |
| | | filePath = "D:\\video\\"+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("推流开始"); |
| | | |
| | | while (!jid.equals(xcbj)) { |
| | | 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 + "秒"); |
| | | } |
| | | |
| | | } |
| | | }); |
| | | 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 ""; |
| | | } |
| | | |
| | | |