实现想法
使用ffmpeg命令中的filter_complex(滤镜)参数来进行展示
引入javacv版本
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.5.6</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>ffmpeg-platform</artifactId>
<version>4.4-1.5.6</version>
</dependency>
命令
ffmpeg -i /file/test.mp4 -i /file/test.mp4 -filter_complex "[0:v]pad=iw*2:ih*1[a];[a][1:v]overlay=w" out.mp4
核心方法
/**
* 操作系统命令
*
* @return
*/
public static void execute(List<String> command) {
try {
String join = String.join(" ", command);
System.out.println(join);
ProcessBuilder process = new ProcessBuilder(command);
process.inheritIO().start().waitFor();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*
*
* @param videoPath 源视频路径
* @param filterPath 带透明通道的视频路径
* @param outputPath 目标视频路径
*/
public static void addSpecialEffects(String videoPath, String filterPath,int width,int height, String outputPath) throws Exception {
List<String> command = Lists.newArrayList();
//获取JavaCV中的ffmpeg本地库的调用路径
String ffmpeg = Loader.load(org.bytedeco.ffmpeg.ffmpeg.class);
command.add(ffmpeg);
command.add("-i");
command.add(videoPath);
command.add("-i");
command.add(filterPath);
command.add("-filter_complex");
//2分屏 加2声音
command.add("[0:v]pad=iw*2:ih*1[a];[a][1:v]overlay=w");
command.add("-filter_complex");
command.add("amix=inputs=2:duration=first:dropout_transition=2,volume=1");
command.add("-s");
command.add(width+"*"+height);
command.add(outputPath);
long start = System.currentTimeMillis();
execute(command);
调用
public static void main(String[] args) throws Exception {
addSpecialEffects("./filelist/视频002.mp4",
"./filelist/视频001.mp4",1920,1080,"./filelist/test.mp4");
}
成功截图
注意听,音视频都是有的
指定分辨率截图
命令说明
filter_complex滤镜的参数结构说明
[0:v] 这个里头两个参数,1表示的是操作对象的编号。在本例中0就是原始视频文件test.mp4,另一个参数v表示操作对象里的视频信息。
pad=iw*3 pad是将合成的视频宽高,这里iw代表第一个视频的宽,iw*3代表合成后的视频宽度加倍
ih ih为第一个视频的高
overlay 覆盖
指定分辨率
-s 1280*720
文档参考
学习java群
java交流群(限订阅了的加):868794080