Java 对视频流抽帧

Java 对视频流抽帧,解决 java.lang.NoClassDefFoundError: Could not initialize class org.bytedeco.ffmpeg.global.avutil问题, 打的jar包过大的问题

1.依赖

此版依赖可以解决 java.lang.NoClassDefFoundError: Could not initialize class org.bytedeco.ffmpeg.global.avutil问题

也可以解决 打的jar包过大的问题

<!-- javacv+javacpp核心库-->
  <dependency>
      <groupId>org.bytedeco</groupId>
      <artifactId>javacv</artifactId>
      <version>1.5.6</version>
  </dependency>
  <dependency>
      <groupId>org.bytedeco</groupId>
      <artifactId>javacpp-platform</artifactId>
      <version>1.5.6</version>
  </dependency>
  <!-- ffmpeg最小依赖包,必须包含上面的javacv+javacpp核心库 -->
  <dependency>
      <groupId>org.bytedeco</groupId>
      <artifactId>ffmpeg-platform</artifactId>
      <version>4.4-1.5.6</version>
  </dependency>

2.抽帧相应代码

package com.gsww.ilaoxiang.yinong.utils;

import lombok.extern.slf4j.Slf4j;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;

import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;

/**
 * @date 2021/11/25 14:59
 * @author lizheng
 * @description 用于从视频中提取帧图片
 */
@Slf4j
public class FrameExtractor {
    public static String getFrame(String m3U8Url,String deviceId,String filePath,String fileName) throws IOException{
        log.info("开始抽帧,m3U8Url:{},deviceId:{},filePath:{}");
        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(m3U8Url);
        grabber.setOption("rtsp_transport", "tcp");
        grabber.start();

        Frame frame;
        Java2DFrameConverter converter = new Java2DFrameConverter();
        int i = 0;

        // grabber.grabImage() 获取帧图片,不包含音频
        // grabber.grab() 包含音频
        String outputFilename = "";
        while ((frame = grabber.grabImage()) != null) {
            i++;
          	//每300帧抽取一次
            if (i % 300 != 0) {
                continue;
            }
            // 在这里处理抽取到的帧
            // 例如,将帧保存为图像文件
            converter.convert(frame).createGraphics().dispose();

            outputFilename = filePath+fileName;
            File f = new File(outputFilename);
            if (!f.exists()) {
                f.mkdirs();
            }
            ImageIO.write(converter.convert(frame), "jpg", f);
            //将图片保存到数据库
          	//这里只抽一张图片,所以帧数到302就退出
            if (i>=302){
                break;
            }

        }
        grabber.stop();
        log.info("抽帧结束,filePath:{},outputFilename:{}",filePath,outputFilename);
        return outputFilename;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值