基于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;
    }
}
相关推荐
木井巳12 小时前
【动态规划: 线性dp】解码方法
java·算法·leetcode·动态规划·推荐算法
缓慢更新19 小时前
审批的加签与会签:多人意见怎么合
android·java·数据库·低代码·rxjava
AI视频工具指南20 小时前
怎么用 AI 做悬疑短剧?
人工智能·aigc·音视频
yuniko-n21 小时前
【JUC】volatile 非原子性深入解析
java
sun_weitao21 小时前
极简版 MCP 工具实现方案
java·linux·服务器
金銀銅鐵1 天前
[Java] 展示增删元素时 LinkedList 的内部变化
java·后端·ai编程
技灵AI1 天前
AI 口播视频提示词怎么写?让人物讲解和产品展示更自然
人工智能·音视频
企业数字化笔记1 天前
AI视频增强后画质怎么验收?插值基线、伪细节与帧间闪烁的检查方法
人工智能·算法·音视频
布吉岛的石头1 天前
Java 程序员第 50 阶段3:数据工程:预训练语料清洗与去重
java·开发语言·人工智能·深度学习·transformer
大文说跨境1 天前
防关联浏览器的指纹覆盖到什么程度:六类参数的实测与自检方法
java·指纹浏览器·tiktok运营