文章目录
经过调研,目前市面上主流的有以下几种:
JCodec
优势:
- 简单。不提供视频编辑或录制功能。
缺点:
- 只能通过File的方式获取视频信息,无法通过url方式获取
- 无法转为M3U8格式
使用:
<dependency>
<groupId>org.jcodec</groupId>
<artifactId>jcodec</artifactId>
<version>0.2.5</version>
</dependency>
官方文档:
https://jcodec.org/
其他说明:
已经试过获取视频总时长,宽高,MD5码的功能,有需要的可以自取
public static Long getVideoInfo(String localPath){
File file = new File(localPath);
try{
FrameGrab grab = FrameGrab.createFrameGrab(NIOUtils.readableChannel(file));
Picture picture= grab.getNativeFrame();
System.out.println("大小:"+file.length());
System.out.println("宽,高:"+picture.getWidth() + "x" + picture.getHeight());
System.out.println("文件MD5码:"+ DigestUtils.md5DigestAsHex(new FileInputStream(localPath)));
Long duration = (long) grab.getVideoTrack().getMeta().getTotalDuration();
System.out.println("视频时长(秒):"+ duration);
return duration;
}catch (IOException e){
e.printStackTrace();
}catch (JCodecException e){
e.printStackTrace();
}
return null;
}
Xuggle(已被弃用)
优势:
- 支持视频录制、编辑、转换(在需要将视频从一个格式转换为另一个格式的应用中使用)和播放等功能。
缺点: - 已经被弃用了,对应的github上的readme文档上第一句话就是弃用,并且推荐了另外一个github项目,但是实际发现,找不到什么实际使用的案例
使用:
<!-- https://mvnrepository.com/artifact/xuggle/xuggle-xuggler -->
<!-- 包下载不了,原因还不清楚 -->
<dependency>
<groupId>xuggle</groupId>
<artifactId>xuggle-xuggler</artifactId>
<version>5.4</version>
</dependency>
官方文档: https://www.xuggle.com/public/documentation/java/api/
FFmpeg
优势:
- 运行音频和视频多种格式的录影、转档、流功能。
- 也常被调用用来进行视频的转码,录播和直播
缺点:
- 需要安装FFmpeg工具
javacv
已经完成开发,如果有其他疑问,可以联系我
优势:
- 强大的图像处理。基于OpenCV和其他相关库提供了丰富的图像处理、物体检测、人脸识别等功能。
- 它支持多平台运行,提供了对摄像头和相机的支持,还可以与第三方库进行集成。
使用:
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv-platform</artifactId>
<version>1.5.3</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.22</version>
</dependency>
介绍:
- javacv通过javacpp调用了FFmpeg(C语言中著名的音视频库),并且对FFmpeg复杂的操作进行了封装,把视频分成了两类:帧抓取器(FrameGrabber)和帧录制器(又叫帧推流器,FrameRecoder)
以及用来存放音视频帧的Frame。
说明:最终决定了用这个来实现需求,代码如下(目前考虑的都是有用本地地址,url也尝试过,可以实现):
获取视频信息
public void getVideoInfo(String localPath) {
try {
File file = new File(localPath);
if (file.length() == 0) {
throw new RuntimeException("未发现文件");
}
FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(localPath);
grabber.start();
// 获取视频文件的大小
System.out.println("大小:"+file.lengt