java如何做视频抽帧,视频转图片操作Demo!现在市面上很多客户提成需求,希望可以把本地的视频,抽帧(一个一个静态的图片)。至于为什么要抽帧,大家自己去百度查询。我们本次仅仅讨论如何使用java技术,实现视频的抽帧操作。


1:我们需要用到市面上一个的maven插件包。名字叫做:【javacv-platform】

在项目的pom.xml文件中加入依赖项。maven从仓库下载到本地仓库来,我们就可以开始写测试代码了。

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);
    }

}

java如何做视频抽帧,视频转图片操作Demo-LMLPHP 

如图所示,代码开始疯狂的在存储帧图片到本地指定的目录下面。

java如何做视频抽帧,视频转图片操作Demo-LMLPHP 

java如何做视频抽帧,视频转图片操作Demo-LMLPHP 

java如何做视频抽帧,视频转图片操作Demo-LMLPHP 

12秒完成了这个操作任务。视频容积是 2.3MB.抽取帧后,存储的文件夹内占容积是28MB。

java如何做视频抽帧,视频转图片操作Demo-LMLPHP 如图,视频原始长度是14秒,图片帧存储了441张图片,由此,我们可以推算出来,视频是按照每秒30帧的帧速率制作的。

 里面的文字注解,写的很清晰了。不懂的话,可以留言咨询。很高兴和大家一起学习java知识。

02-21 20:55