package org.springeos.modules.quartz.m3u8.main;
import org.springeos.common.utils.FastDFSClient;
import ws.schild.jave.*;
import java.io.*;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentSkipListSet;
public class test {
//安装ffmpeg的存放路径
private static String ffmpeg = "F:\\ffmpeg\\ffmpeg-4.4-essentials_build\\ffmpeg-4.4-essentials_build\\bin\\ffmpeg.exe";
//提取的音频、合成的视频存放路径,不存在会自动创建
private static String saveMediaPath = "F:\\ts\\";
static {
//如果没有文件夹,则创建
File saveMediaFile = new File(saveMediaPath);
if (!saveMediaFile.exists() && !saveMediaFile.isDirectory()) {
saveMediaFile.mkdirs();
}
}
public static void main(String[] args) throws IOException {
//多视频拼接合并为一个mp4格式视频
File file=new File("F:\\ts\\1.ts");
File file1=new File("F:\\ts\\6.ts");
File file2=new File("F:\\ts\\5.ts");
File file3=new File("F:\\ts\\2.ts");
File file4=new File("F:\\ts\\3.ts");
File file5=new File("F:\\ts\\4.ts");
File file6=new File("F:\\ts\\7.ts");
File file7=new File("F:\\ts\\8.ts");
File file8=new File("F:\\ts\\9.ts");
//这儿用的集合是set,因为set集合可以去重,因为无序,所以用lamada表达式做了排序
Set<File> finishedFiles = new ConcurrentSkipListSet<>(Comparator.comparingInt(o -> Integer.parseInt(o.getName().replace(".ts", ""))));
finishedFiles.add(file);
finishedFiles.add(file1);
finishedFiles.add(file2);
finishedFiles.add(file3);
finishedFiles.add(file4);
finishedFiles.add(file5);
finishedFiles.add(file6);
finishedFiles.add(file7);
finishedFiles.add(file8);
mergeVideos(finishedFiles);
//下面这个是用List集合
List<String> video = new ArrayList<>();
video.add("F:\\ts\\1.ts");
video.add("F:\\ts\\2.ts");
video.add("F:\\ts\\3.ts");
video.add("F:\\ts\\4.ts");
video.add("F:\\ts\\5.ts");
video.add("F:\\ts\\6.ts");
video.add("F:\\ts\\7.ts");
video.add("F:\\ts\\8.ts");
video.add("F:\\ts\\9.ts");
mergelistVideos(video);
}
/**
* 多视频拼接合并
*
* @param videoList 视频文件路径的List
*/
public static void mergeVideos(Set<File> videoList) {
//时间作为合并后的视频名
String getdatatime = nowTime();
//所有要合并的视频转换为ts格式存到videoList里
List<String> command1 = new ArrayList<>();
command1.add(ffmpeg);
command1.add("-i");
StringBuffer buffer = new StringBuffer("\"concat:");
//迭代器循环
Iterator<File> it = videoList.iterator();
//迭代器循环,判断有没有当前元素
while (it.hasNext()) {
File str = it.next();
buffer.append(str);
System.out.println(str);
buffer.append("|");
}
buffer.append("\"");
command1.add(String.valueOf(buffer));
command1.add("-c");
command1.add("copy");
command1.add(saveMediaPath + "视频合并" + getdatatime + ".mp4");
commandStart(command1);
}
/**
* 多视频拼接合并
*
* @param videoList 视频文件路径的List
*/
public static void mergelistVideos(List<String> videoList) {
//时间作为合并后的视频名
String getdatatime = nowTime();
//所有要合并的视频转换为ts格式存到videoList里
List<String> command1 = new ArrayList<>();
command1.add(ffmpeg);
command1.add("-i");
StringBuffer buffer = new StringBuffer("\"concat:");
for (int i = 0; i < videoList.size(); i++) {
buffer.append(videoList.get(i));
if (i != videoList.size() - 1) {
buffer.append("|");
} else {
buffer.append("\"");
}
}
command1.add(String.valueOf(buffer));
command1.add("-c");
command1.add("copy");
command1.add(saveMediaPath + "视频合并" + getdatatime + ".mp4");
commandStart(command1);
}
/**
* 获取当前时间,用于作为文件名
*/
public static String nowTime() {
DateTimeFormatter f3 = DateTimeFormatter.ofPattern("yyyy-MM-dd-HH-mm-ss");
LocalDate nowdata = LocalDate.now();
LocalTime nowTime = LocalTime.now();
return nowdata.atTime(nowTime).format(f3);
}
/**
* 调用命令行执行
*
* @param command 命令行参数
*/
public static void commandStart(List<String> command) {
command.forEach(v -> System.out.print(v + " "));
System.out.println();
System.out.println();
ProcessBuilder builder = new ProcessBuilder();
//正常信息和错误信息合并输出
builder.redirectErrorStream(true);
builder.command(command);
//开始执行命令
Process process = null;
try {
process = builder.start();
//如果你想获取到执行完后的信息,那么下面的代码也是需要的
String line = "";
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
要执行上面的代码必须先下载安装ffmpeg工具,去下面的官网链接下载
官网地址:http://ffmpeg.org/download.html
下载Windows版本的时候点击如下图
点击进去之后如下图选择
然后将其解压,解压完成后会有三个文件
这三个文件,分别对应的是,一个工具执行命令,第二个是播放的执行命令。第三个是查看文件内容信息工具执行命令。
下载完成解压后接着配置环境变量在电脑中
配置如下图:
选择电脑的系统变量中的path,然后加上你的安装目录,一直到bin这层目录
我的加入的是 F:\ffmpeg\ffmpeg-4.4-essentials_build\ffmpeg-4.4-essentials_build\bin,记住加到bin这层目录才可以
配置完环境变量之后,在cmd命令窗口中输入命令:ffmpeg -version