java获取视频封面图 时长

gradle依赖
   //ffmpeg
        implementation('org.bytedeco:javacv:1.5.8') {
            exclude module: 'javacpp'
            exclude module: 'flycapture'
            exclude module: 'libdc1394'
            exclude module: 'libfreenect'
            exclude module: 'libfreenect2'
            exclude module: 'librealsense'
            exclude module: 'librealsense2'
            exclude module: 'videoinput'
            exclude module: 'opencv'
            exclude module: 'tesseract'
            exclude module: 'artoolkitplus'
            exclude module: 'leptonica'
            exclude module: 'openblas'
            exclude module: 'flandmark'
        }

        implementation('org.bytedeco:javacv-platform:1.5.8') {
            exclude module: 'javacv'
            exclude module: 'flycapture-platform'
            exclude module: 'libdc1394-platform'
            exclude module: 'libfreenect-platform'
            exclude module: 'libfreenect2-platform'
            exclude module: 'librealsense-platform'
            exclude module: 'librealsense2-platform'
            exclude module: 'videoinput-platform'
            exclude module: 'opencv-platform'
            exclude module: 'tesseract-platform'
            exclude module: 'artoolkitplus-platform'
            exclude module: 'leptonica-platform'
            exclude module: 'openblas-platform'
            exclude module: 'flandmark-platform'
        }

视频信息类:

import lombok.Data;

import java.io.InputStream;

@Data
public class VideoBean {

    /**
     * 视频时长 毫秒
     */
    private Long duration;

    /**
     * 视频首帧
     */
    private InputStream firstFrameStream;
}

工具类:

import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.time.LocalDateTime;
import com.spacex.cid.app.model.VideoBean;

public class FfmpegUtil {

    /**
     * 获取 视频时长
     *
     * @param url 网络地址
     * @return
     */
    public static Long getDuration(String url) {
        Long duration = 0L;
        if (url == null || url.isEmpty()) {
            return duration;
        }
        try (InputStream inputStream = new URL(url).openStream()) {
            try (FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(inputStream)) {
                fFmpegFrameGrabber.start();
                duration = fFmpegFrameGrabber.getLengthInTime() / 1000;
            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            System.out.println(LocalDateTime.now() + " --- getDuration --- " + url);
            e.printStackTrace();
        }
        return duration;
    }

    /**
     * 获取 视频时长
     *
     * @param url      网络地址
     * @param retryNum 重试次数
     * @return
     */
    public static Long getDuration(String url, int retryNum) {
        for (int i = 0; i < retryNum; i++) {
            try {
                Long duration = getDuration(NetUtil.getUrl(url));
                if (duration > 0) {
                    return duration;
                }
            } catch (Exception e) {
                System.out.println("获取时长 - 重定向地址失败 :" + url);
            }
        }
        return 0L;
    }

    /**
     * 获取 视频时长
     *
     * @param inputStream 本地流
     * @return
     */
    public static Long getDuration(InputStream inputStream) {
        Long duration = 0L;
        try (FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(inputStream)) {
            fFmpegFrameGrabber.start();
            duration = fFmpegFrameGrabber.getLengthInTime() / 1000;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return duration;
    }

    /**
     * 获取 视频时长 + 首帧
     *
     * @param inputStream
     * @return
     */
    public static VideoBean getVideoBean(InputStream inputStream) {
        VideoBean videoBean = new VideoBean();
        try (FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(inputStream)) {
            fFmpegFrameGrabber.start();
            videoBean.setDuration(fFmpegFrameGrabber.getLengthInTime() / 1000);
            int lengthInFrames = fFmpegFrameGrabber.getLengthInFrames();
            Frame frame = null;
            /** 第一帧,会过滤纯黑 */
            for (int i = 0; i < lengthInFrames; i++) {
                frame = fFmpegFrameGrabber.grabFrame();
                if (frame.image != null) {
                    break;
                }
            }

            if (frame != null) {
                BufferedImage bufferedImage = new Java2DFrameConverter().getBufferedImage(frame);
                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                ImageIO.write(bufferedImage, "jpeg", byteArrayOutputStream);
                videoBean.setFirstFrameStream(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return videoBean;
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值