什么是ffmpeg?
ffmpeg下载安装教程及介绍-CSDN博客
安装后具体实现代码:
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;}
}