java处理视频

发布于:2024-05-16 ⋅ 阅读:(72) ⋅ 点赞:(0)


经过调研,目前市面上主流的有以下几种:

JCodec

优势:

  1. 简单。不提供视频编辑或录制功能。

缺点:

  1. 只能通过File的方式获取视频信息,无法通过url方式获取
  2. 无法转为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(已被弃用)

优势:

  1. 支持视频录制、编辑、转换(在需要将视频从一个格式转换为另一个格式的应用中使用)和播放等功能。
    缺点:
  2. 已经被弃用了,对应的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

优势:

  1. 运行音频和视频多种格式的录影、转档、流功能。
  2. 也常被调用用来进行视频的转码,录播和直播

缺点:

  1. 需要安装FFmpeg工具

javacv

已经完成开发,如果有其他疑问,可以联系我
优势:

  1. 强大的图像处理。基于OpenCV和其他相关库提供了丰富的图像处理、物体检测、人脸识别等功能。
  2. 它支持多平台运行,提供了对摄像头和相机的支持,还可以与第三方库进行集成。

使用:

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

介绍:

  1. 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</