基于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;
    }
}
相关推荐
梵得儿SHI2 分钟前
SpringCloud 核心组件精讲:Sentinel 熔断限流全攻略-流量控制、熔断降级、热点参数限流(含 Dashboard 部署 + 项目集成实操)
java·spring cloud·sentinel·熔断降级·热点参数限流·微服务流量控制
麦兜*2 分钟前
Spring Boot 3.x 升级踩坑大全:Jakarta EE 9+、GraalVM Native 与配置迁移实战
java·spring boot·后端·spring·spring cloud
独断万古他化8 分钟前
【SpringBoot 配置文件】properties 与 yml 的基础用法、格式及优缺点
java·spring boot·后端
玄〤9 分钟前
Spring MVC 讲解:从初始化流程到请求参数与 JSON 处理全解析(黑马课程ssm笔记总结)(day5)
java·spring·json·mvc
廋到被风吹走12 分钟前
【Java】【JVM】垃圾回收深度解析:G1/ZGC/Shenandoah原理、日志分析与STW优化
java·开发语言·jvm
xrkhy13 分钟前
Java全栈面试题及答案汇总(3)
java·开发语言·面试
SunnyDays101116 分钟前
Java 高效实现 CSV 转 PDF
java·csv转pdf
隐形喷火龙18 分钟前
SpringBoot 异步任务持久化方案:崩溃重启不丢任务的完整实现
java·spring boot·后端
我是koten19 分钟前
K8s启动pod失败,日志报非法的Jar包排查思路(Invalid or corrupt jarfile /app/xxxx,jar)
java·docker·容器·kubernetes·bash·jar·shell
WX-bisheyuange23 分钟前
基于Spring Boot的库存管理系统的设计与实现
java·spring boot·后端