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