背景:如何批量给视频添加水印
FFmpeg 是一个强大的开源多媒体处理工具,被广泛应用于音视频的录制、转码、编辑等方面。它支持几乎所有主流的音视频格式,能够在各种操作系统平台上运行,包括 Windows、macOS 和 Linux。FFmpeg 提供了丰富的命令行工具,可以完成诸如剪辑、合并、分割、转换格式、添加水印等各种多媒体处理任务。
通过构建FFmpeg命令字符串数组,指定输入视频文件、输出文件格式、分段时长等参数,并利用Java的ProcessBuilder类创建子进程来执行FFmpeg命令。
java
static String ffmpegPath = "D:\\software\\ffmpeg\\bin\\ffmpeg.exe"; // FFmpeg可执行文件的路径
static String inputVideo = "D:\\mk\\3.mp4";
static String outputVideo = "D:\\mk\\output3.mp4";
static String newBackgroundMusic = "F:\\制作\\背景音乐1\\背景音乐1.MP3";
java
try {
ProcessBuilder pb = new ProcessBuilder(
ffmpegPath,
"-i", inputVideo,
"-i", watermarkImage,
// "-filter_complex", "[1:v]scale=100:50 [watermark]; [0:v][watermark] overlay=10:main_h-overlay_h-10",
// 添加透明度
"-filter_complex", "[1:v]format=argb,colorchannelmixer=aa=0.5,scale=100:50 [watermark]; [0:v][watermark] overlay=10:main_h-overlay_h-10",
"-c:a", "copy", // 复制音频流,保持音频不变
"-y", // 覆盖输出文件(如果存在)
outputVideo
);
pb.inheritIO(); // Redirects standard output and error streams to the current Java process
Process process = pb.start();
process.waitFor();
System.out.println("Watermark added successfully!");
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
-
ProcessBuilder pb = new ProcessBuilder( ... )
: 创建了一个ProcessBuilder
对象pb
,用于构建 FFmpeg 命令并执行。命令包括以下参数:ffmpegPath
:FFmpeg 可执行文件的路径。-i
,inputVideo
:输入视频文件的路径。-i
,watermarkImage
:水印图片文件的路径。-filter_complex
,[1:v]format=argb,colorchannelmixer=aa=0.5,scale=100:50 [watermark]; [0:v][watermark] overlay=10:main_h-overlay_h-10
:复杂滤镜选项,用于将水印图片与原视频进行合成。该滤镜选项包括对水印图片进行格式转换、设置透明度、缩放等操作,并将处理后的水印图片与原视频进行叠加。注释掉的那行是添加水印但不设置透明度的命令。-c:a
,copy
:指定音频流的编码器为复制,即保持音频流不变。-y
:覆盖输出文件(如果存在)而不提示用户确认。outputVideo
:输出文件的路径。
-
pb.inheritIO();
: 将子进程的输入、输出和错误流与当前 Java 进程的输入、输出和错误流关联,以便在控制台中查看 FFmpeg 的输出信息。 -
Process process = pb.start();
: 启动子进程执行 FFmpeg 命令。 -
process.waitFor();
: 等待子进程执行完毕。