前言
这两天项目中有个需求是从视频流中定时截图保存至服务器,之前没操作过视频,大致花了半天查网上的资料,做了个可以从视频中截图的demo,仅供参考
一、JavaCv是什么?
JavaCv:是一个工具类,里面封装了对视频进行操作的方法。说JavaCv,就不得不说一下FFmpeg、OpenCV、JavaCPP,我们使用的JavaCv都是对这三个的封装
工具 | 特点 | java’是否可以直接使用 |
---|---|---|
FFmpeg | C语言版的本地库 | 否 |
OpenCV | C语言版的本地库 | 否 |
JavaCPP | 对FFmpeg、OpenCV这些常用库进行包装,成为API | 是 |
JavaCv | 对JavaCPP进行封装,成为工具类,比JavaCpp更简单易用 | 是 |
我们本次就使用JavaCv来操作视频流,因为JavaCv底层也是使用FFmpeg,内部原理都是一致的,所以可以先学习用JavaCPP操作FFmpeg获取视频流的方式,从中学习原理,便于更好的理解FFmpeg。大佬已经做了很完整的demo攻略,大家可以参考学习:Java版流媒体编解码和图像处理(JavaCPP+FFmpeg)
二、使用步骤
1.引入库
在pom文件中引入包ffmpeg、javacpp、javacv:
<!-- 视频截图 ffmpeg javacpp javacv -->
<dependency>
<groupId>org.bytedeco.javacpp-presets</groupId>
<artifactId>ffmpeg-platform</artifactId>
<version>4.0.2-1.4.3</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacpp</artifactId>
<version>1.4.3</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.4.3</version>
</dependency>
2.获取本地视频的截图并保存
- 在D盘创建一个两个文件夹D:\files\video、D:\files\img,在video下放一个MP4格式的视频文件,供截图使用;img下存储的为截图文件,文件名为当前截图时间;获取本地视频文件的第六桢截图保存至本地文件中
代码如下(示例):
package com.example.common.util.video;
import lombok.extern.slf4j.Slf4j;
import org.bytedeco.javacpp.opencv_core;
import org.bytedeco.javacv.*;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author sliu
* @date 2023/6/13 10:26
**/
@Slf4j
public class VideoUtil {
public static void main(String[] args) throws IOException {
getScreenshotByFile(
"D:\\files\\video\\blue.mp4",
"D:\\files\\img\\" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".jpg");