赞
踩
java如何做视频抽帧,视频转图片操作Demo!现在市面上很多客户提成需求,希望可以把本地的视频,抽帧(一个一个静态的图片)。至于为什么要抽帧,大家自己去百度查询。我们本次仅仅讨论如何使用java技术,实现视频的抽帧操作。
1:我们需要用到市面上一个的maven插件包。名字叫做:【javacv-platform】
在项目的pom.xml文件中加入依赖项。maven从仓库下载到本地仓库来,我们就可以开始写测试代码了。
<dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv-platform</artifactId> <version>1.5.7</version> </dependency>
2:测试的demo代码如下所示:
这个代码仅仅是针对本地视频,某一个视频文件的抽帧操作。
- package com.yrl.managedemo.util;
- import org.bytedeco.javacv.FFmpegFrameGrabber;
- import org.bytedeco.javacv.Frame;
- import org.bytedeco.javacv.Java2DFrameConverter;
-
- import javax.imageio.ImageIO;
-
- import java.awt.image.BufferedImage;
- import java.io.File;
- import java.io.IOException;
- public class FrameExtractor {
- public static void main(String[] args) {
- // 本地存储的视频文件路径
- String videoFilePath = "H:\\base\\video\\3.mp4";//此处写自己的视频路径
- // 创建FFmpegFrameGrabber对象
- FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(videoFilePath);
- try {
- //记录开始的时间节点
- long startTime = System.currentTimeMillis();
- // 打开视频文件
- grabber.start();
- // 逐帧抓取视频
- Frame frame;
- int frameNumber = 1;
- //只要获取到帧对象不为null.就一直循环下去。
- while ((frame = grabber.grabImage()) != null) {
- BufferedImage bufferedImage = frameToBufferedImage(frame);
- // 生成保存帧图像的文件路径
- //字符串是帧图片的默认起始内容,不会变化的,唯一变化的是后面的数字,起始值是1
- String outputFilePath = String.format("%s/frame_%06d.jpg", "H:\\base\\frame-video\\3", frameNumber);//此处写自己的保存路径
-
- // 保存帧图像到文件
- try {
- ImageIO.write(bufferedImage, "jpg", new File(outputFilePath));
- System.out.println("保存帧图像:" + outputFilePath);
- } catch (IOException e) {
- e.printStackTrace();
- }
- //完成一次帧图的存储后,末尾数字自动加1
- frameNumber++;
- }
- // 关闭视频文件
- grabber.stop();
- long endTime = System.currentTimeMillis();
- System.out.println("NeedTime is:" + (endTime - startTime)/1000 + " 秒");
- } catch (org.bytedeco.javacv.FrameGrabber.Exception e) {
- e.printStackTrace();
- }
- }
-
- /**
- * 将Frame转换为BufferedImage
- */
- private static BufferedImage frameToBufferedImage(Frame frame) {
- Java2DFrameConverter converter = new Java2DFrameConverter();
- return converter.getBufferedImage(frame);
- }
-
- }
如图所示,代码开始疯狂的在存储帧图片到本地指定的目录下面。
12秒完成了这个操作任务。视频容积是 2.3MB.抽取帧后,存储的文件夹内占容积是28MB。
如图,视频原始长度是14秒,图片帧存储了441张图片,由此,我们可以推算出来,视频是按照每秒30帧的帧速率制作的。
里面的文字注解,写的很清晰了。不懂的话,可以留言咨询。很高兴和大家一起学习java知识。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。