From 6f477c3118f50f9f3bb92aea0341efa69d72d732 Mon Sep 17 00:00:00 2001
From: tangzy <tangzy123456>
Date: Fri, 23 Apr 2021 16:35:30 +0800
Subject: [PATCH] 1.录制视频

---
 blade-service/blade-jfpts/src/main/java/org/springblade/jfpt/rvideo/controller/RvideoController.java |  134 ++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 120 insertions(+), 14 deletions(-)

diff --git a/blade-service/blade-jfpts/src/main/java/org/springblade/jfpt/rvideo/controller/RvideoController.java b/blade-service/blade-jfpts/src/main/java/org/springblade/jfpt/rvideo/controller/RvideoController.java
index 4cb184d..083e671 100644
--- a/blade-service/blade-jfpts/src/main/java/org/springblade/jfpt/rvideo/controller/RvideoController.java
+++ b/blade-service/blade-jfpts/src/main/java/org/springblade/jfpt/rvideo/controller/RvideoController.java
@@ -67,7 +67,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;
 
 	/**
 	 * 详情
@@ -200,37 +200,143 @@
 //	}
 
 
-		/**
-	 * 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;
 
 	}
 
+
+
 }

--
Gitblit v1.9.3