首先建议先把 ffmpeg加入 到环境变量path。
另外执行此段 代码后,我的cpu 2600x 6核12线程 直接拉满到100%,16g的内存也占到了70-80%,大概运行快一个多小时,才把20G左右的视频转换完成
因为单个用cmd 的for循环时 是串行的,发现cpu还有多余的,然后用java 改成并行执行,这样应该能提高速度,虽然我没有对比,也不会C
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class FFmpegTest {
public static void main(String[] args) {
//MP4所在目录
String oldPath = "F:\\cloud\\";
//MP4输出目录
String newPath = "F:\\cloud\\ok\\";
File file = new File(oldPath);
File[] files = file.listFiles();
List<String> mp4Name = new ArrayList<>();
for (File fileName : files) {
mp4Name.add(fileName.getName());
}
mp4Name.stream().parallel().filter(name -> name.endsWith("mp4")).forEach(item -> {
String videoOldName = oldPath + item;
String videoNewName = newPath + item;
System.out.println(videoOldName);
System.out.println(videoNewName);
ffmpegUtil(videoOldName,videoNewName);
});
}
private static void ffmpegUtil(String videoFile, String outFile) {
if (videoFile == null || outFile == null) {
return;
} else {
ProcessBuilder processBuilder = new ProcessBuilder();
List<String> command = new ArrayList<>();
command.add("ffmpeg");
command.add("-i");
command.add(videoFile);
command.add("-af");
command.add("volume=4");
command.add("-y");
command.add(outFile);
processBuilder.command(command);
processBuilder.redirectErrorStream(true);
// InputStream inputStream = null;
Process process = null;
try {
//启动进程
process = processBuilder.start();
// inputStream = process.getInputStream();
//转成字符流
// List list = IOUtils.readLines(inputStream, "utf-8");
// list.stream().forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
// } finally {
// IOUtils.closeQuietly(inputStream);
}
}
}
}