Java获取MP4视频文件的每一帧图片并保存

Java获取MP4视频文件的每一帧图片并保存

    • 需要的pom依赖
    • 图片抓取函数
    • 可以默认图片存储位置为视频的同级目录
    • 整个工具类文件如下

需要的pom依赖

<dependency>
     <groupId>org.bytedecogroupId>
     <artifactId>javacvartifactId>
     <version>1.4.3version>
 dependency>
 <dependency>
     <groupId>org.bytedeco.javacpp-presetsgroupId>
     <artifactId>ffmpeg-platformartifactId>
     <version>4.0.2-1.4.3version>
 dependency>

图片抓取函数

/**
* 根据读取到的视频文件,获取视频中的每一帧图片
*
* @param video   视频文件 E:/video/video.mp4
* @param picPath 图片的保存路径 E:/pic/
*/
public static void getVideoPic(File video, String picPath) {
   // 1.根据一个视频文件,创建一个按照视频中每一帧进行抓取图片的抓取对象
   FFmpegFrameGrabber ff = new FFmpegFrameGrabber(video);
   // 2.创建一个帧-->图片的转换器
   Java2DFrameConverter converter = new Java2DFrameConverter();

   try {
       ff.start();
       // 3.先知道这个视频一共有多少帧
       int length = ff.getLengthInFrames();
       System.out.println("高度:" + ff.getImageHeight());
       System.out.println("宽度:" + ff.getImageWidth());
       System.out.println("帧率:" + ff.getFrameRate());
       System.out.println("总帧数:" + length);
       System.out.println("==========================================");
       System.out.println("图片抓取中...");

       // 4.读取视频中每一帧图片
       int cnt = 1;
       Frame frame;
       while (true) {
           frame = ff.grabFrame();

           if (frame == null) {
               break;
           }

           if (frame.image == null) {
               continue;
           }

           // 5.将获取的帧,存储为图片
           BufferedImage image = converter.getBufferedImage(frame);
           File picFile = new File(picPath, cnt + ".png");

           // 6.将图片保存到目标文件中
           ImageIO.write(image, "png", picFile);
           if (cnt % 100 == 0) {
               System.out.println("前" + cnt + "张图片抓取完成;");
           }
           cnt++;

       }

       System.out.println("图片抓取完成。");
       ff.stop();
   } catch (IOException e) {
       e.printStackTrace();
   }
}

可以默认图片存储位置为视频的同级目录

public static void getVideoPic(File video) {
    String picFolder = video.getName().split("\\.")[0] + "-png";
    String picPath = video.getParent() + "\\" + picFolder;
    File picPathFile = new File(picPath);
    if (!picPathFile.isDirectory()) {
        if (!picPathFile.mkdirs()) {
            throw new RuntimeException("创建图片存储目录失败(" + picPathFile.getAbsolutePath() + ")");
        }
    }
    getVideoPic(video, picPath);
}

整个工具类文件如下

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;

/**
 * @author ingzheng
 */
public class FileUtils {

    /**
     * 根据读取到的视频文件,获取视频中的每一帧图片
     *
     * @param video   视频文件 E:/video/video.mp4
     * @param picPath 图片的保存路径 E:/pic/
     */
    public static void getVideoPic(File video, String picPath) {
        // 1.根据一个视频文件,创建一个按照视频中每一帧进行抓取图片的抓取对象
        FFmpegFrameGrabber ff = new FFmpegFrameGrabber(video);
        // 2.创建一个帧-->图片的转换器
        Java2DFrameConverter converter = new Java2DFrameConverter();

        try {
            ff.start();
            // 3.先知道这个视频一共有多少帧
            int length = ff.getLengthInFrames();
            System.out.println("高度:" + ff.getImageHeight());
            System.out.println("宽度:" + ff.getImageWidth());
            System.out.println("帧率:" + ff.getFrameRate());
            System.out.println("总帧数:" + length);
            System.out.println("==========================================");
            System.out.println("图片抓取中...");

            // 4.读取视频中每一帧图片
            int cnt = 1;
            Frame frame;
            while (true) {
                frame = ff.grabFrame();

                if (frame == null) {
                    break;
                }

                if (frame.image == null) {
                    continue;
                }

                // 5.将获取的帧,存储为图片
                BufferedImage image = converter.getBufferedImage(frame);
                File picFile = new File(picPath, cnt + ".png");

                // 6.将图片保存到目标文件中
                ImageIO.write(image, "png", picFile);
                if (cnt % 100 == 0) {
                    System.out.println("前" + cnt + "张图片抓取完成;");
                }
                cnt++;

            }

            System.out.println("图片抓取完成。");
            ff.stop();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void getVideoPic(File video) {
        String picFolder = video.getName().split("\\.")[0] + "-png";
        String picPath = video.getParent() + "\\" + picFolder;
        File picPathFile = new File(picPath);
        if (!picPathFile.isDirectory()) {
            if (!picPathFile.mkdirs()) {
                throw new RuntimeException("创建图片存储目录失败(" + picPathFile.getAbsolutePath() + ")");
            }
        }
        getVideoPic(video, picPath);
    }

    public static void main(String[] args) throws IOException {
        File file = new File("E:\\workspace\\test.mp4");
        FileUtils.getVideoPic(file);
    }
}

你可能感兴趣的:(java,视频处理)