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);
    }
}


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

相关文章
|
前端开发 JavaScript Java
Java中将图片转换为base64格式的技巧
这样,你就可以在Java中将图片转换为Base64格式了。这个方法的实现非常简单,只需要使用Java的内置库,无需任何额外的库。希望这个方法对你有所帮助。
916 22
|
编解码 监控 网络协议
如何使用FFmpeg实现RTSP推送H.264和H.265(HEVC)编码视频
本文详细介绍了如何使用FFmpeg实现RTSP推送H.264和H.265(HEVC)编码视频。内容涵盖环境搭建、编码配置、服务器端与客户端实现等方面,适合视频监控系统和直播平台等应用场景。通过具体命令和示例代码,帮助读者快速上手并实现目标。
4251 6
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
655 4
|
Java 图形学
Java改变图片的大小
前面在做项目的时候,有一个需求是需要上传图片的,然而该图片只是简单的展示一些信息,不需要很大,所以在上传图片的时候改变图片的大小就显得很有必要了!然后就写了下面这个方法来改变图片的大小!     /** * 改变图片的大小到宽为size,然后高随着宽等比例变化 * @p...
1064 0
|
9月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
428 1
|
9月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
394 1
|
10月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
435 0
|
10月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
614 16