什么是ffmpeg?
安装后具体实现代码:
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;
}
}