javacv 视频添加自定义水印

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;

备注:代码仅供参考,这里我只是固定设置一个水印,如果需要设置时间水印请自行计算好帧数。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
要在视频添加水印,可以使用JavaCV库中的FFmpegFrameRecorder和FFmpegFrameFilter类。以下是一个简单的Java代码示例: ```java import org.bytedeco.javacpp.Loader; import org.bytedeco.javacv.*; import java.awt.*; import java.io.File; import java.io.IOException; public class VideoWatermarkAdder { public static void main(String[] args) throws FrameGrabber.Exception, FrameFilter.Exception, FrameRecorder.Exception, IOException { // JavaCV依赖库 Loader.load(org.bytedeco.ffmpeg.ffmpeg.class); // 输入视频文件路径 String inputFile = "input.mp4"; // 输出视频文件路径 String outputFile = "output.mp4"; // 水印图片路径 String watermarkFile = "watermark.png"; // 创建视频源 FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFile); grabber.start(); // 创建视频目标 FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFile, grabber.getImageWidth(), grabber.getImageHeight(), grabber.getAudioChannels()); recorder.setFrameRate(grabber.getFrameRate()); recorder.setVideoCodec(grabber.getVideoCodec()); recorder.setAudioCodec(grabber.getAudioCodec()); recorder.start(); // 创建水印过滤器 FFmpegFrameFilter filter = new FFmpegFrameFilter("movie=" + watermarkFile + ":overlay=10:10", grabber.getImageWidth(), grabber.getImageHeight()); filter.start(); // 逐帧读取视频添加水印后写入目标视频 Frame frame; while ((frame = grabber.grabFrame()) != null) { // 添加水印 filter.push(frame); Frame filteredFrame = filter.pull(); // 写入目标视频 recorder.record(filteredFrame); } // 关闭资源 filter.stop(); recorder.stop(); grabber.stop(); // 显示输出文件路径 System.out.println("Output file saved to: " + new File(outputFile).getAbsolutePath()); } } ``` 该代码将在视频的左上角添加一个水印,并将处理后的视频保存到指定的输出文件路径。你需要将输入视频路径、输出视频路径和水印图片路径替换为你自己的路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农汉子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值