1、需求产生:
生产环境需要回溯视频回放,未兼容这块代码,本人本意本来是觉得浪费空间,但是后来买了挺大的服务器磁盘阵列存储,故让我兼容这块代码,做一份代码,保存Rtsp视频中拉取到的所有视频到本地
2、代码实现
2.1、依赖引入
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.5.9</version>
</dependency>
<!-- Additional dependencies required to use CUDA and cuDNN -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>opencv-platform-gpu</artifactId>
<version>4.7.0-1.5.9</version>
</dependency>
<!-- Optional GPL builds with (almost) everything enabled -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>ffmpeg-platform-gpl</artifactId>
<version>6.0-1.5.9</version>
</dependency>
2.2、main方法直接实现
public static void main(String[] args) throws FFmpegFrameGrabber.Exception, FFmpegFrameRecorder.Exception {
String rtspUrl = "xxx";
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(rtspUrl);
grabber.setOption("rtsp_transport", "tcp");
grabber.setImageWidth(960);
grabber.setImageHeight(540);
grabber.start();
String basePath = "D:/xc-video/";
// 10MB
long fileSizeThreshold = 10 * 1024 * 1024;
int fileCounter = 0;
String fileName = null;
FFmpegFrameRecorder recorder = null;
// 五个视频(调配)
while (fileCounter <= 5) {
Frame frame = grabber.grabImage();
if (frame == null) {
break;
}
// 如果记录器为空,或者当前文件大小超过阈值,关闭之前的记录器并创建新的文件
if (recorder == null || new File(fileName).length() > fileSizeThreshold) {
if (recorder != null) {
// 关闭之前的记录器
try {
recorder.stop();
recorder.release();
System.out.println("File saved: " + fileName);
log.info("fileCounter -> now -> {} -> recorder ==> {}", fileCounter, recorder);
} catch (FrameRecorder.Exception e) {
e.printStackTrace();
}
}
// 创建新的文件名
fileName = basePath + System.currentTimeMillis() + "_" + fileCounter + ".mp4";
fileCounter++;
// 创建新的记录器
recorder = new FFmpegFrameRecorder(fileName, grabber.getImageWidth(), grabber.getImageHeight(), 0);
recorder.setFormat("mp4");
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
// 设置视频比特率为10MB
recorder.setVideoBitrate(10 * 1024 * 1024);
recorder.start();
}
recorder.record(frame);
}
// 关闭最后一个记录器
if (recorder != null) {
try {
recorder.stop();
recorder.release();
System.out.println("File saved: " + fileName);
log.info("fileCounter -> {} -> final - recorder ==> {}", fileCounter, recorder);
} catch (FrameRecorder.Exception e) {
e.printStackTrace();
}
}
// 清理资源
grabber.stop();
grabber.release();
}