视频抽帧-支持麒麟系统

249 阅读1分钟

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;
    }