pom文件
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacpp</artifactId>
<version>1.5.6</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.5.6</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>ffmpeg</artifactId>
<version>4.4-1.5.6</version>
<classifier>linux-x86_64</classifier>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>ffmpeg</artifactId>
<version>4.4-1.5.6</version>
<classifier>linux-x86</classifier>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>ffmpeg</artifactId>
<version>4.4-1.5.6</version>
<classifier>linux-arm64</classifier>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>ffmpeg</artifactId>
<version>4.4-1.5.6</version>
<classifier>linux-armhf</classifier>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>ffmpeg</artifactId>
<version>4.4-1.5.6</version>
<classifier>linux-ppc64le</classifier>
</dependency>
抽帧代码
@SneakyThrows
@Override
public File cutVideoImage(String url) {
// FFmpegFrameGrabber grabber = new FFmpegFrameGrabber("https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8");
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(url);
grabber.setOption("rtsp_transport", "tcp");
grabber.start();
Frame frame;
Java2DFrameConverter converter = new Java2DFrameConverter();
int i = 0;
String outputFilename = "fileTemp/frame_" + System.currentTimeMillis() + ".jpg";
File f = new File(outputFilename);
// grabber.grabImage() 获取帧图片,不包含音频
// grabber.grab() 包含音频
while ((frame = grabber.grabImage()) != null && i<1) {
// 在这里处理抽取到的帧
// 例如,将帧保存为图像文件
converter.convert(frame).createGraphics().dispose();
if(!f.exists()) f.mkdirs();
ImageIO.write(converter.convert(frame), "jpg", f);
i++;
}
grabber.stop();
return f;
}
#加水印代码
@Override
public String addWatermark(String content,File srcImgFile){
OutputStream outImgStream = null;
File outImgFile = null;
String filePath = null;
try {
Image srcImg = ImageIO.read(srcImgFile);//文件转化为图片
int srcImgWidth = srcImg.getWidth(null);//获取图片的宽
int srcImgHeight = srcImg.getHeight(null);//获取图片的高
// 加水印
BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bufImg.createGraphics();//得到画笔
g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
g.setColor(Color.WHITE); //设置水印颜色
Font font = new Font("宋体", Font.BOLD, 64);
g.setFont(font); //设置字体
// g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.2f));//设置水印文字透明度
g.rotate(Math.toRadians(45));//设置水印旋转
JLabel label = new JLabel(content);
FontMetrics metrics = label.getFontMetrics(font);
int width = metrics.stringWidth(label.getText())+80;//文字水印的宽
int rowsNumber = srcImgHeight/width;// 图片的高 除以 文字水印的宽 ——> 打印的行数(以文字水印的宽为间隔)
int columnsNumber = srcImgWidth/width;//图片的宽 除以 文字水印的宽 ——> 每行打印的列数(以文字水印的宽为间隔)
for(int j=0;j<rowsNumber;j++){
for(int i=0;i<columnsNumber;i++){
g.drawString(content, i*width + j*width, -i*width + j*width+120);//画出水印,并设置水印位置
}
}
g.dispose();// 释放资源
// 输出图片
String outPath = "fileTemp/waterMarked_"+System.currentTimeMillis()+".jpg";
outImgStream = new FileOutputStream(outPath);
//获取到文件的后缀名
String fileName = srcImgFile.getName();
String formatName = fileName.substring(fileName.lastIndexOf(".") + 1);
//覆盖原图
ImageIO.write(bufImg, formatName, outImgStream);
outImgFile = new File(outPath);
String tempPath = minioUtil.upload(bucket, "waterMarked", new FileInputStream(outImgFile), fileName);
filePath = endpoint+"/"+bucket+"/"+tempPath;
} catch (Exception e) {
e.printStackTrace();
e.getMessage();
} finally{
try {
if(outImgStream != null){
outImgStream.flush();
outImgStream.close();
}
outImgFile.delete();
} catch (Exception e) {
e.printStackTrace();
e.getMessage();
}
}
return filePath;
}