Java ffmpeg 实现视频加文字/图片水印功能

简介: 【10月更文挑战第22天】在 Java 中使用 FFmpeg 实现视频加文字或图片水印功能,需先安装 FFmpeg 并添加依赖(如 JavaCV)。通过构建 FFmpeg 命令行参数,使用 `drawtext` 滤镜添加文字水印,或使用 `overlay` 滤镜添加图片水印。示例代码展示了如何使用 JavaCV 实现文字水印。

在 Java 中使用 FFmpeg 实现视频加文字 / 图片水印功能可以通过以下步骤实现:


一、准备工作


  1. 安装 FFmpeg:确保你的系统中安装了 FFmpeg。可以从 FFmpeg 官网下载并安装。
  2. 添加 FFmpeg 依赖:在 Java 项目中,你可能需要添加对 FFmpeg 的依赖。可以使用一些 Java 库来调用 FFmpeg 命令行工具,如 JavaCV。


二、添加文字水印


  1. 创建命令行参数
  • 确定输入视频文件路径、输出视频文件路径、文字内容、字体大小、字体颜色等参数。
  • 例如:
  • 输入视频:inputVideo.mp4
  • 输出视频:outputVideoWithText.mp4
  • 文字内容:“水印文字”
  • 字体大小:50
  • 字体颜色:白色。
  1. 构建 FFmpeg 命令
  • 使用以下命令格式添加文字水印:


ffmpeg -i inputVideo.mp4 -vf "drawtext=text='水印文字':fontsize=50:fontcolor=white:x=10:y=10" outputVideoWithText.mp4


  • 参数解释:
  • -i inputVideo.mp4:指定输入视频文件。
  • -vf "drawtext=text='水印文字':fontsize=50:fontcolor=white:x=10:y=10":使用视频滤镜,这里设置了文字水印的参数,包括文字内容、字体大小、颜色和位置。
  • outputVideoWithText.mp4:指定输出视频文件。


  1. 执行命令
  • 在 Java 中,可以使用 Runtime.getRuntime ().exec () 方法来执行命令行命令。但这种方法较为复杂,推荐使用 JavaCV 等库来简化操作。


三、添加图片水印


  1. 创建命令行参数
  • 确定输入视频文件路径、输出视频文件路径、图片水印文件路径、水印位置等参数。
  • 例如:
  • 输入视频:inputVideo.mp4
  • 输出视频:outputVideoWithImage.mp4
  • 图片水印:watermark.png
  • 水印位置:x=10,y=10。
  1. 构建 FFmpeg 命令
  • 使用以下命令格式添加图片水印:


ffmpeg -i inputVideo.mp4 -i watermark.png -filter_complex "overlay=x=10:y=10" outputVideoWithImage.mp4


  • 参数解释:
  • -i inputVideo.mp4:指定输入视频文件。
  • -i watermark.png:指定图片水印文件。
  • -filter_complex "overlay=x=10:y=10":使用复杂滤镜,将图片水印覆盖在视频上,设置水印位置为 x=10,y=10。
  • outputVideoWithImage.mp4:指定输出视频文件。


  1. 执行命令
  • 同样,可以使用 JavaCV 等库来执行这个命令。


以下是一个使用 JavaCV 实现添加文字水印的示例代码:


import org.bytedeco.ffmpeg.global.avutil;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
public class VideoWatermarkingExample {
    public static void addTextWatermark(String inputVideoPath, String outputVideoPath, String text, int fontSize, String fontColor, int xPosition, int yPosition) {
        try {
            FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputVideoPath);
            grabber.start();
            FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputVideoPath, grabber.getImageWidth(), grabber.getImageHeight());
            recorder.setVideoCodec(grabber.getVideoCodec());
            recorder.setFormat(grabber.getFormat());
            recorder.setFrameRate(grabber.getFrameRate());
            recorder.start();
            Frame frame;
            while ((frame = grabber.grabFrame())!= null) {
                // 添加文字水印
                recorder.record(frame, "drawtext=text='" + text + "':fontsize=" + fontSize + ":fontcolor=" + fontColor + ":x=" + xPosition + ":y=" + yPosition);
            }
            grabber.stop();
            recorder.stop();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        String inputVideoPath = "inputVideo.mp4";
        String outputVideoPath = "outputVideoWithText.mp4";
        String text = "水印文字";
        int fontSize = 50;
        String fontColor = "white";
        int xPosition = 10;
        int yPosition = 10;
        addTextWatermark(inputVideoPath, outputVideoPath, text, fontSize, fontColor, xPosition, yPosition);
    }
}


请注意,这个示例仅为添加文字水印的示例,添加图片水印的过程类似,但需要调整命令和代码以适应图片水印的情况。同时,确保在运行代码时正确处理异常情况,并根据实际需求调整参数。

相关文章
|
8月前
|
Oracle Java 关系型数据库
java 入门学习视频_2025 最新 java 入门零基础学习视频教程
《Java 21 入门实操指南(2025年版)》提供了Java最新特性的开发指导。首先介绍了JDK 21和IntelliJ IDEA 2025.1的环境配置,包括环境变量设置和预览功能启用。重点讲解了Java 21三大核心特性:虚拟线程简化高并发编程,Record模式优化数据解构,字符串模板提升字符串拼接可读性。最后通过图书管理系统案例,展示如何运用Record定义实体类、使用Stream API进行数据操作,以及结合字符串模板实现控制台交互。该指南完整呈现了从环境搭建到实际项目开发的Java 21全流程实
404 1
|
10月前
|
前端开发 JavaScript Java
Java中将图片转换为base64格式的技巧
这样,你就可以在Java中将图片转换为Base64格式了。这个方法的实现非常简单,只需要使用Java的内置库,无需任何额外的库。希望这个方法对你有所帮助。
669 22
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
528 4
|
Java
Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
【10月更文挑战第14天】Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
327 2
|
JavaScript 前端开发 Java
有什么好的Java自学教程视频,适合初学者
  动力节点Java培训最新上线Java实验班,等你来测试自己适不适合学习Java编程哦!   随着互联网的发展,视频教程充斥着网络,很多人为了能够在视频教程中捞取一桶金,纷纷投入视频售卖的大军之中,其中不乏有一些劣质的视频课件让学员受害,今天我们就来看看在Java编程专业中,有什么好的Java自学教程视频,适合初学者的:   互联网上有很多Java视频教程,这里面鱼龙混杂,有的好有的差,有的讲解全面,有的讲解却是很片面。
1685 0
|
4月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
255 1
|
4月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
269 1
|
5月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
225 0
|
5月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
416 16