视频抽帧
1. maven依赖
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.5</version>
</dependency>
2. 实例
public class CommonUtils {
private final static Logger log = LoggerFactory.getLogger(CommonUtils.class);
public static List<String> videoFrameExtract(String videoPath, Integer second){
long start = System.currentTimeMillis();
ArrayList<String> fl = new ArrayList<>();
String saveFilePrefix = videoPath.substring(0, videoPath.lastIndexOf("."));
Frame frame;
FFmpegFrameGrabber ffg = null;
int fps = 0;
long videoTime = 0L;
int frameCount = 0;
try{
ffg = new FFmpegFrameGrabber(videoPath);
ffg.start();
fps = (int)ffg.getFrameRate();
videoTime = ffg.getLengthInTime() / (1000*1000);
while ((frame=ffg.grabImage()) != null){
if (frame.image != null){
if (frameCount>=1 && frameCount%(second*fps)==0){
String fileName = saveFilePrefix + "-" + frameCount + ".jpg";
boolean saveFlag = false;
try {
Java2DFrameConverter converter = new Java2DFrameConverter();
BufferedImage bufferedImage = converter.getBufferedImage(frame);
saveFlag = ImageIO.write(bufferedImage, "jpg", new File(fileName));
if (saveFlag){
fl.add(fileName);
}
}catch (Exception e){
log.error("帧图片保存异常({}):{}", fileName, String.valueOf(e));
}
}
}
frameCount ++;
}
}catch (Exception e){
e.printStackTrace();
log.error("视频抽帧异常({}):{}", videoPath, String.valueOf(e));
}finally {
try {
if (ffg != null){
ffg.stop();
}
}catch (Exception ignored){}
}
long cost = System.currentTimeMillis() - start;
log.info("视频抽帧({})-帧率:{}fps;时长:{}s;总帧数:{};抽帧耗时:{}ms;抽帧数据({}):{};", videoPath, fps, videoTime, frameCount, cost, fl.size(), fl);
return fl;
}
public static void main(String[] args) {
videoFrameExtract("F:\\test\\file\\test\\a.mp4", 1);
}
}


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】