javacv 视频增加水印
前言:最近项目需要在视频中增加时间水印,网上查询几篇博客发现可以增加水印但是音频丢失,无奈自己还是查看源码渡劫吧。
1、工程pom文件添加依赖
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.5</version>
</dependency>
工程只需要添加这一个依赖就好,不要像其他博客那样增加多余的依赖,免得增加不必要的依赖冲突甚至在使用中使用错误。
2、演示demo是将本地视频进行水印设置,直接上代码供参考。
public static void main(String[] args) {
String filePath="/Users/dongxr/Desktop/test.mp4";
File file=new File(filePath);
//抓取视频资源
FFmpegFrameGrabber frameGrabber = new FFmpegFrameGrabber(file);
//
Frame frame = null;
FFmpegFrameRecorder recorder = null;
String fileName = null;
try{
frameGrabber.start();
Random random=new Random();
fileName = file.getAbsolutePath() + random.nextInt(100)+".mp4";
System.out.println("文件名-->>"+fileName);
recorder = new FFmpegFrameRecorder(fileName, frameGrabber.getImageWidth(), frameGrabber.getImageHeight(), frameGrabber.getAudioChannels());
// recorder.setFormat("mp4");
recorder.setSampleRate(frameGrabber.getSampleRate());
recorder.setFrameRate(frameGrabber.getFrameRate());
recorder.setTimestamp(frameGrabber.getTimestamp());
recorder.setVideoBitrate(frameGrabber.getVideoBitrate());
recorder.setVideoCodec(frameGrabber.getVideoCodec());
recorder.start();
int index=0;
while (true){
frame=frameGrabber.grabFrame();
if(frame==null){
System.out.println("视频处理完成");
break;
}
//判断音频
System.out.println("音频=="+(frame.samples ==null)+"视频=="+ (frame.image==null));
//判断图片帧
if(frame.image !=null){
IplImage iplImage = Java2DFrameUtils.toIplImage(frame);
BufferedImage buffImg=Java2DFrameUtils.toBufferedImage(iplImage);
Graphics2D graphics = buffImg.createGraphics();
graphics.setColor(Color.BLUE);
graphics.setFont(new Font("微软雅黑", Font.BOLD, 20));
graphics.drawString("==最帅呢==",(iplImage.width()/2)-100,iplImage.height()/2);
graphics.dispose();
Frame newFrame = Java2DFrameUtils.toFrame(buffImg);
recorder.record(newFrame);
}
//设置音频
if(frame.samples !=null){
recorder.recordSamples(frame.sampleRate,frame.audioChannels,frame.samples);
}
System.out.println("帧值="+index);
index ++;
}
recorder.stop();
recorder.release();
frameGrabber.stop();
}catch (Exception e){
e.printStackTrace();
}
}
3、这里我把引入也贴出来,供参考。
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameUtils;
import org.bytedeco.opencv.opencv_core.IplImage;
import java.awt.*;
import java.awt.image.BufferedImage;
备注:代码仅供参考,这里我只是固定设置一个水印,如果需要设置时间水印请自行计算好帧数。