Java如何添加批量添加水印

背景:如何批量给视频添加水印

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();
        }
  1. 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:输出文件的路径。
  2. pb.inheritIO();: 将子进程的输入、输出和错误流与当前 Java 进程的输入、输出和错误流关联,以便在控制台中查看 FFmpeg 的输出信息。

  3. Process process = pb.start();: 启动子进程执行 FFmpeg 命令。

  4. process.waitFor();: 等待子进程执行完毕。

相关推荐
王煜苏9 小时前
最新版idea2025 配置docker 打包spring-boot项目到生产服务器全流程,含期间遇到的坑
java·docker·容器
李玮豪Jimmy9 小时前
Day18:二叉树part8(669.修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树)
java·服务器·算法
后端小张9 小时前
【AI 学习】AI Agent 开发进阶:架构、规划、记忆与工具编排
java·人工智能·ai·架构·系统架构·agent·智能体
西岭千秋雪_9 小时前
Kafka客户端整合
java·spring boot·分布式·kafka·linq
leonardee10 小时前
Golang笔记——Interface类型
java·后端
算法如诗10 小时前
**MATLAB R2025a** 环境下,基于 **双向时间卷积网络(BITCN)+ 双向长短期记忆网络(BiLSTM)** 的多特征分类预测完整实现
开发语言·网络·matlab
k093310 小时前
在组件外(.js文件)中使用pinia的方法2--在http.js中使用pinia
开发语言·javascript·http
我是好小孩10 小时前
【Android】RecyclerView的高度问题、VH复用概念、多子项的实现;
android·java·网络
张彦峰ZYF10 小时前
高并发优惠权益聚合接口的优雅实现(含超时控制 + 来源标识 + Fallback 降级)
java·后端·面试
4Forsee10 小时前
【Android】模板化解决复杂场景的滑动冲突问题
android·java·rpc