引入依赖
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.5.4</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>ffmpeg-platform</artifactId>
<version>4.3.1-1.5.4</version>
</dependency>
代码示例
文字水印实现
import org.bytedeco.javacv.*;
import org.bytedeco.javacv.Frame;
import java.awt.*;
import java.awt.image.BufferedImage;
public class VideoWatermark {
public static void main(String[] args) throws Exception {
String inputFile = "D:\\test\\video.mp4";
String outputFile = "D:\\test\\output.mp4";
try (FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFile)) {
grabber.start();
try (FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFile, grabber.getImageWidth(), grabber.getImageHeight(), grabber.getAudioChannels())) {
recorder.setFormat("mp4");
recorder.setSampleRate(grabber.getSampleRate());
recorder.setFrameRate(grabber.getFrameRate());
recorder.setTimestamp(grabber.getTimestamp());
recorder.setVideoBitrate(grabber.getVideoBitrate());
recorder.setVideoCodec(grabber.getVideoCodec());
recorder.start();
Frame frame;
Java2DFrameConverter converter = new Java2DFrameConverter();
while ((frame = grabber.grab()) != null) {
if (frame.image != null) {
BufferedImage bufferedImage = converter.getBufferedImage(frame);
Graphics2D g = bufferedImage.createGraphics();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g.setFont(new Font("Microsoft YaHei", Font.BOLD, 30));
g.setColor(Color.gray);
String watermarkText = "测试水印文字";
int x = 10;
int y = 30;
g.drawString(watermarkText, x, y);
g.dispose();
frame = converter.convert(bufferedImage);
}
recorder.record(frame);
}
recorder.stop();
recorder.release();
grabber.stop();
}
}
}
}
图片水印实现
import org.bytedeco.javacv.*;
import org.bytedeco.javacv.Frame;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;
public class VideoWatermark {
public static void main(String[] args) throws Exception {
String inputFile = "D:\\test\\video.mp4";
String outputFile = "D:\\test\\output.mp4";
String watermarkImageUrl = "D:\\test\\test.png";
try (FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFile)) {
grabber.start();
try (FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFile, grabber.getImageWidth(), grabber.getImageHeight(), grabber.getAudioChannels())) {
recorder.setFormat("mp4");
recorder.setSampleRate(grabber.getSampleRate());
recorder.setFrameRate(grabber.getFrameRate());
recorder.setTimestamp(grabber.getTimestamp());
recorder.setVideoBitrate(grabber.getVideoBitrate());
recorder.setVideoCodec(grabber.getVideoCodec());
recorder.start();
BufferedImage watermarkImage = loadWatermarkImage(watermarkImageUrl);
Frame frame;
while ((frame = grabber.grab()) != null) {
if (frame.image != null) {
Java2DFrameConverter converter = new Java2DFrameConverter();
BufferedImage bufferedImage = converter.getBufferedImage(frame);
Graphics2D g = bufferedImage.createGraphics();
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
int x = 10;
int y = 30;
g.drawImage(watermarkImage, x, y, null);
g.dispose();
frame = converter.convert(bufferedImage);
}
recorder.record(frame);
}
recorder.stop();
recorder.release();
grabber.stop();
}
}
}
private static BufferedImage loadWatermarkImage(String imagePath) throws IOException {
return ImageIO.read(new File(imagePath));
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!