使用ffmpeg测试命令
ffmpeg
-i "E:\Monitor\video_20240617_10.mp4"
-i "E:\Monitor\video1_20240617_10.mp4"
-filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[v][a]"
-map "[v]"
-map "[a]"
-c:v libx264 -c:a aac "E:\Monitor\video_20240617_10.mp4.mp4"
详解
这段FFmpeg命令是用来合并两个视频文件(包括它们的视频流和音频流)成一个新的视频文件。下面是对命令各部分的详细解释:
输入文件指定:
-i "E:\Monitor\video_20240617_10.mp4": 指定了第一个输入视频文件的路径。
-i "E:\Monitor\video1_20240617_10.mp4": 指定了第二个输入视频文件的路径。
Filter Complex: -filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[v][a]": 这是一个复杂的过滤器链,用于处理输入流。
[0:v] 和 [1:v] 分别表示第一个和第二个输入文件的视频流。
[0:a] 和 [1:a] 分别表示第一个和第二个输入文件的音频流。
concat=n=2:v=1:a=1 配置了concat过滤器,n=2表示有2个输入流被连接,v=1表示输出1个视频流,a=1表示输出1个音频流。
[v] 和 [a] 是输出流的标签,分别代表最终的视频流和音频流。
输出映射:
-map "[v]" 指定使用前面定义的视频输出流[v]。
-map "[a]" 指定使用前面定义的音频输出流[a]。
输出编码与格式:
-c:v libx264 指定视频编码器为libx264,这是一个广泛使用的H.264视频编码器。
-c:a aac 指定音频编码器为AAC,这是一种高质量的音频编码格式。
"E:\Monitor\video_20240617_10.mp4" 是输出文件的路径。
综上,此命令的作用是将两个MP4视频文件的视频和音频流合并成一个单一的MP4文件,使用H.264视频编码和AAC音频编码。
结果
合并成功自动关闭
Java测试代码
/**
* 合并视频
*
* @param mp4Output
* @param tempFilePath
*/
public void mergeVideo(String mp4Output, String tempFilePath) {
//原文件改名
String tempFilePath1 = RenameFileExample(mp4Output);
//修改视频1名称为临时文件名称1
String mergeCommand = String.format(
"ffmpeg -i \"%s\" -i \"%s\" -filter_complex \"[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[v][a]\" -map \"[v]\" -map \"[a]\" -c:v libx264 -c:a aac \"%s\"",
tempFilePath1, tempFilePath, mp4Output);
AtomicReference<Process> process = null;
executorService.submit(() -> {
try {
process.set(Runtime.getRuntime().exec(mergeCommand));
//删除两个临时文件
deleteFileExample(tempFilePath1);
deleteFileExample(tempFilePath);
} catch (IOException e) {
e.printStackTrace();
}
});
isTemp = false;
}