依赖
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-core</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-nativebin-linux64</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-nativebin-win64</artifactId>
<version>2.7.3</version>
</dependency>
多个视频拼接
import cn.hutool.core.io.FileUtil;
import ws.schild.jave.DefaultFFMPEGLocator;
import ws.schild.jave.FFMPEGExecutor;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
import java.util.stream.Collectors;
public class Test {
public static final String SEPARATOR = System.getProperty("file.separator");
public static final String USERDIR = System.getProperty("user.dir");
/**
* 视频拼接
* ffmpeg -i concat a.mp4|b.mp4 -c copy out.mp4
* 只会适用于ts和flv等一些格式。mp4格式整体有一层容器,而不像ts这类格式可以直接拼接,需要先解开容器再对提取的视频流进行拼接
* 因此使用 ffmpeg -f concat -safe 0 -i mylist.txt -c copy output
*/
public static boolean concatVideo(List<String> files, String outputFile) throws IOException {
//地址放在txt文件
String txtFile = USERDIR+SEPARATOR+"temp.txt";
String txtPath = createConcatTxtFile(files, txtFile);
FFMPEGExecutor executor = new DefaultFFMPEGLocator().createExecutor();
executor.addArgument("-f");
executor.addArgument("concat");
executor.addArgument("-safe");
executor.addArgument("0");
executor.addArgument("-i");
executor.addArgument(txtPath);
executor.addArgument("-c");
executor.addArgument("copy");
executor.addArgument(outputFile);
executor.execute();
BufferedReader reader = new BufferedReader(new InputStreamReader(executor.getErrorStream()));
String msg = reader.lines().collect(Collectors.joining("\n"));
System.out.println(msg);
File newFile = new File(outputFile);
if (newFile.exists()) {
//删除txt
FileUtil.del(txtFile);
return true;
}
FileUtil.del(txtFile);
return false;
}
/**
* 文件txt
* @param files
* @param txtFile
* @return
*/
private static String createConcatTxtFile(List<String> files, String txtFile) {
StringBuilder content = new StringBuilder();
for (String file : files) {
content.append("file '").append(file).append("'\r\n");
}
FileUtil.writeUtf8String(content.toString(), txtFile);
return txtFile;
}
/**
* 测试
* @param args
*/
public static void main(String[] args) {
//视频拼接
String videoLocalPath = "D:\\video\\move.mp4";
String outputFile = USERDIR+SEPARATOR+"output.mp4";
try {
concatVideo(Arrays.asList(videoLocalPath,videoLocalPath), outputFile);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}