Java ffmpeg 實(shí)現(xiàn)視頻加文字/圖片水印功能(示例代碼)
引入依賴
<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>
代碼示例
文字水印實(shí)現(xiàn)
import org.bytedeco.javacv.*;
import org.bytedeco.javacv.Frame;
import java.awt.*;
import java.awt.image.BufferedImage;
/**
* 視頻添加文字水印
*
* @author alin
*/
public class VideoWatermark {
public static void main(String[] args) throws Exception {
// 視頻文件
String inputFile = "D:\\test\\video.mp4";
// 輸出文件
String outputFile = "D:\\test\\output.mp4";
// 初始化FFmpegFrameGrabber以讀取輸入視頻文件
try (FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFile)) {
grabber.start();
// 初始化FFmpegFrameRecorder以寫入輸出視頻文件
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) {
// 將Frame轉(zhuǎn)換為BufferedImage
BufferedImage bufferedImage = converter.getBufferedImage(frame);
// 在BufferedImage上繪制文字水印
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 = "測試水印文字";
// 計(jì)算水印文字的位置 右下角
//FontMetrics fontMetrics = g.getFontMetrics();
//int textWidth = fontMetrics.stringWidth(watermarkText);
//int textHeight = fontMetrics.getHeight();
//int x = bufferedImage.getWidth() - textWidth - 10; // 右邊距10像素
//int y = bufferedImage.getHeight() - textHeight + fontMetrics.getAscent() - 10; // 下邊距10像素
// 計(jì)算水印文字的位置 左上角
int x = 10; // 左邊距10像素
int y = 30; // 上邊距30像素
g.drawString(watermarkText, x, y);
g.dispose();
// 將BufferedImage轉(zhuǎn)換回Frame
frame = converter.convert(bufferedImage);
}
// 記錄幀
recorder.record(frame);
}
// 關(guān)閉grabber和recorder
recorder.stop();
recorder.release();
grabber.stop();
}
}
}
}
圖片水印實(shí)現(xiàn)
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;
/**
* 視頻添加圖片水印
*
* @author alin
*/
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);
// 在BufferedImage上繪制圖片水印
Graphics2D g = bufferedImage.createGraphics();
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
int x = 10; // 左邊距10像素
int y = 30; // 上邊距30像素
g.drawImage(watermarkImage, x, y, null);
g.dispose();
frame = converter.convert(bufferedImage);
}
recorder.record(frame);
}
recorder.stop();
recorder.release();
grabber.stop();
}
}
}
/**
* 加載水印圖片
*
* @param imagePath 水印圖片路徑
* @return 水印圖片
* @throws IOException
*/
private static BufferedImage loadWatermarkImage(String imagePath) throws IOException {
//return ImageIO.read(new URL(imagePath));
return ImageIO.read(new File(imagePath));
}
}到此這篇關(guān)于Java ffmpeg 實(shí)現(xiàn)視頻加文字/圖片水印功能的文章就介紹到這了,更多相關(guān)Java ffmpeg 視頻加文字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
替換 MyBatis-Plus 默認(rèn)的 saveBatch的實(shí)現(xiàn)步驟
本文主要介紹了替換 MyBatis-Plus 默認(rèn)的 saveBatch的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2026-03-03
使用JDBC4.0操作XML類型的字段(保存獲取xml數(shù)據(jù))的方法
jdbc4.0最重要的特征是支持xml數(shù)據(jù)類型,接下來通過本文重點(diǎn)給大家介紹如何使用jdbc4.0操作xml類型的字段,對(duì)jdbc4.0 xml相關(guān)知識(shí)感興趣的朋友一起看下吧2016-08-08
IntelliJ IDEA 2020 安裝和常用配置(推薦)
這篇文章主要介紹了IntelliJ IDEA 2020 安裝和常用配置(推薦),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
詳解Java的Hibernate框架中的緩存與二級(jí)緩存
這篇文章主要介紹了Java的Hibernate框架中的緩存與二級(jí)緩存,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-12-12
SpringMVC 通過commons-fileupload實(shí)現(xiàn)文件上傳功能
這篇文章主要介紹了SpringMVC 通過commons-fileupload實(shí)現(xiàn)文件上傳,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
SpringCloud Zuul過濾器實(shí)現(xiàn)登陸鑒權(quán)代碼實(shí)例
這篇文章主要介紹了SpringCloud Zuul過濾器實(shí)現(xiàn)登陸鑒權(quán)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
java基于netty NIO的簡單聊天室的實(shí)現(xiàn)
這篇文章主要介紹了java基于netty NIO的簡單聊天室的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
Maven安裝本地的jar包和創(chuàng)建帶模板的自定義項(xiàng)目的操作過程
這篇文章主要介紹了Maven安裝本地的jar包和創(chuàng)建帶模板的自定義項(xiàng)目,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-03-03

