当前位置: 首页 > news >正文

Java如何添加批量添加水印

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

FFmpeg 是一个强大的开源多媒体处理工具,被广泛应用于音视频的录制、转码、编辑等方面。它支持几乎所有主流的音视频格式,能够在各种操作系统平台上运行,包括 Windows、macOS 和 Linux。FFmpeg 提供了丰富的命令行工具,可以完成诸如剪辑、合并、分割、转换格式、添加水印等各种多媒体处理任务。

通过构建FFmpeg命令字符串数组,指定输入视频文件、输出文件格式、分段时长等参数,并利用Java的ProcessBuilder类创建子进程来执行FFmpeg命令。 

    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";
 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 processProcess 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();: 等待子进程执行完毕。

相关文章:

  • 【vue3】命令式组件封装,message封装示例;(函数式组件?)
  • 监听者的力量:探索观察者模式和spring使用
  • [NOIP2007 普及组] 纪念品分组--贪心算法
  • 论文里点击如图?-?如何跳转到图片的题注
  • 探秘SpringBoot启动流程:原理解析与自定义扩展
  • Mongodb基础(node.js版)
  • C2_W2_Assignment_吴恩达_中英_Pytorch
  • 【简略知识】项目开发中,VO,BO,PO,DO,DTO究竟是何方妖怪?
  • 腾讯云幻兽帕鲁服务器如何安全下载WorldOption.sav文件?
  • 抖音视频批量下载软件|视频评论采集工具
  • 开源视频转码器HandBrake
  • Godot自定义控件样式语法解析
  • Java数据类型(八种基本数据类型 + 四种引用类型)、数据类型转换
  • 机器学习:模型评估和模型保存
  • 【软考】设计模式之访问者模式
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • Angular 响应式表单之下拉框
  • C# 免费离线人脸识别 2.0 Demo
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • es6--symbol
  • javascript面向对象之创建对象
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Vue ES6 Jade Scss Webpack Gulp
  • windows下使用nginx调试简介
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 关于extract.autodesk.io的一些说明
  • 基于webpack 的 vue 多页架构
  • 简单实现一个textarea自适应高度
  • 老板让我十分钟上手nx-admin
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 算法---两个栈实现一个队列
  • Android开发者必备:推荐一款助力开发的开源APP
  • 如何正确理解,内页权重高于首页?
  • #QT(串口助手-界面)
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (Python第六天)文件处理
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二)pulsar安装在独立的docker中,python测试
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (转)【Hibernate总结系列】使用举例
  • **python多态
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET Framework 服务实现监控可观测性最佳实践
  • .Net Web窗口页属性
  • .Net Winform开发笔记(一)
  • .NET 设计模式初探
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • ?.的用法
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • @ConditionalOnProperty注解使用说明
  • @Transient注解
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [@Controller]4 详解@ModelAttribute