基于ffmpeg使用java实现视频转图片

什么是ffmpeg?

ffmpeg下载安装教程及介绍-CSDN博客

安装后具体实现代码:

java 复制代码
package com.example.playing;

/**
 * @author : 冯子达
 * @version 1.0
 * @description :视频转换为图片 输入视频文件名和文件唯一标识 输出的是图片数量,在本方法里面完成文件夹的创建
 * @createDate : 2024/12/6 07:50
 */

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;

public class VideoToImages {


    /**
     * 每秒生成多少张图片
     */
    private static Integer fps = 24;
    /**
     * 存放视频和图片的文件夹资源根目录
     */
    private static String Path = "D:\\devopment_project\\java_project\\playing\\src\\main\\resources\\";

    /**
     * 将视频转换为图片
     * <p>
     * 视频存放在 video\\videoName.mp4
     * <p>
     * 分割后存储在 images\\videoId 文件夹中
     * 图片的生成名为:output%d.jpg
     *
     * @param videoId   视频的ID
     * @param videoName 视频文件的名 例如 videoName.mp4
     * @return 生成的图片数用于后面判断,如果是0,则代表失败
     */
    public static int videoToCreateImages(String videoId, String videoName) {

//        创建完成目录
        File completedir = new File( Path+"images\\" + videoId);

        // 检查是否创建目录
        boolean completeSuccess = completedir.mkdir();
        if (completeSuccess) {
            System.out.println("目录创建成功!");
        } else {
            System.out.println("目录创建失败");
            return 0;
        }
        String videoPath = Path+"video\\" + videoName;
        // 输出图片的路径前缀(每张图片将使用前缀+序号.jpg的格式)
        String outputPrefix = completedir +"\\output%d.jpg";

        // 构建FFmpeg命令
        ProcessBuilder builder = new ProcessBuilder(
                "ffmpeg",
                "-i", videoPath, // 输入文件
                "-vf", "fps="+fps, // 每秒fps帧
                outputPrefix // 输出文件(使用%d表示帧编号)
        );
        builder.redirectErrorStream(true); // 将错误输出合并到标准输出

        try {
            Process process = builder.start();
            // 读取命令的输出(可选,用于调试或捕获FFmpeg的输出)
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            // 等待进程结束
            int exitCode = process.waitFor();
            System.out.println("FFmpeg process exited with code " + exitCode);
            return countTopLevelFiles(completedir);
        } catch (InterruptedException | IOException e) {
            e.printStackTrace();
            return 0;
        }
    }

    /**
     * 统计指定目录下的一级文件数量
     *
     * @param dir 目录名
     * @return
     */
    public static int countTopLevelFiles(File dir) {
        int count = 0;
        // 检查目录是否存在
        if (dir.exists() && dir.isDirectory()) {
            // 获取目录下的所有文件和子目录
            File[] files = dir.listFiles();

            if (files != null) {
                for (File file : files) {
                    // 如果是文件,则增加计数器
                    if (file.isFile()) {
                        count++;
                    }
                }
            }
        }
        return count;
    }
}
相关推荐
委婉待续2 分钟前
java抽奖系统登录下(三)
java·开发语言·状态模式
先睡5 分钟前
动态sql
java·数据库·sql
喜欢AC~不爱WA19 分钟前
简单的Java小项目
java·开发语言
互联网动态分析23 分钟前
Apache Kafka:实时数据流处理的强大引擎
java·kafka
泰山小张只吃荷园27 分钟前
期末复习-计算机网络篇
java·网络·网络协议·计算机网络·面试
qq85722263130 分钟前
java+springboot+mysql科研成果管理系统
java·spring boot·mysql
m0_7482526043 分钟前
用Maven开发Spring Boot 项目
java·spring boot·maven
小五Z43 分钟前
高阶数据结构--B树&&B+树实现原理&&B树模拟实现--Java
java·数据结构·b树·算法
机智阳1 小时前
介绍一个InnoDB的数据页,和B+树的关系是什么?
java·数据结构·分布式·后端·b树
2401_857610031 小时前
剖析 SSM 校园一卡通密钥管理系统 PF 技术架构中安全机制的深度融合
java·数据库·安全