基于jave查询视频文件时常和大小

使用了两个枚举

1.关于文件大小的单位枚举

public enum FileSizeUnitEnum {

    KB(1, "KB"),
    MB(2, "MB"),
    GB(3, "GB")
    ;

    private int code;

    private String name;

    FileSizeUnitEnum(int code, String name) {
        this.code = code;
        this.name = name;
    }
}

2.关于时间的单位枚举

public enum TimeUnitEnum {

    MILLISECOND(1, "ms"),
    SECOND(2, "s"),
    MINUTE(3, "min"),
    ;

    private int code;

    private String name;

    TimeUnitEnum(int code, String name) {
        this.code = code;
        this.name = name;
    }
}

3.工具类

import cn.hutool.core.util.ObjectUtil;
import com.cdls.carp.common.enums.FileSizeUnitEnum;
import com.cdls.carp.common.enums.TimeUnitEnum;
import it.sauronsoftware.jave.Encoder;
import it.sauronsoftware.jave.EncoderException;
import it.sauronsoftware.jave.MultimediaInfo;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.nio.channels.FileChannel;

/**
 * 视频工具类
 *
 * @Description: 视频工具类
 * @Author yjw
 * @Date 2020/4/29
 **/
public class VideoUtil {

    /**
     * 毫秒除数
     */
    private static final BigDecimal MILLISECOND_NUMBER = new BigDecimal(1);

    /**
     * 秒除数
     */
    private static final BigDecimal SECOND_NUMBER = new BigDecimal(1000);

    /**
     * 分钟除数
     */
    private static final BigDecimal MINUTE_NUMBER = new BigDecimal(1000 * 60);

    /**
     * 获得视频时间,默认单位是 min 分钟
     *
     * @param filePath     文件路径
     * @param timeUnitEnum 时间单位
     * @param scale        小数点
     * @return 文件时长
     * @throws EncoderException EncoderException
     */
    public static String getVideoTime(String filePath, TimeUnitEnum timeUnitEnum, int scale) throws EncoderException {
        //  获取文件
        File source = new File(filePath);
        //  创建encoder
        Encoder encoder = new Encoder();
        //  使用encoder获取文件信息
        MultimediaInfo m = encoder.getInfo(source);
        //  创建BigDecimal
        BigDecimal ms = new BigDecimal(m.getDuration());
        //  时间单位
        return ms.divide(getTimeUnitConvertNumber(timeUnitEnum), scale, RoundingMode.HALF_UP) + timeUnitEnum.name();
    }

    /**
     * 根据时间单位返回除数值
     *
     * @param timeUnitEnum 时间单位枚举
     * @return 除数值
     */
    private static BigDecimal getTimeUnitConvertNumber(TimeUnitEnum timeUnitEnum) {
        //  根据时间大小返回除数因子
        switch (timeUnitEnum.name()) {
            case "ms":
                return MILLISECOND_NUMBER;
            case "s":
                return SECOND_NUMBER;
            default:
                return MINUTE_NUMBER;
        }
    }

    /**
     * 返回视频文件大小
     *
     * @param filePath         文件路径
     * @param fileSizeUnitEnum 大小单位
     * @param scale            小数点
     * @return 文件大小+单位
     * @throws IOException IOException
     */
    public static String getVideoSize(String filePath, FileSizeUnitEnum fileSizeUnitEnum, int scale) throws IOException {
        //  使用Spring工具类判断是否为空
        if (ObjectUtil.isEmpty(fileSizeUnitEnum)) {
            throw new NullPointerException("FileSizeUnitEnum设置为空");
        }

        //  根据
        BigDecimal unitConvertNumber = getSizeUnitConvertNumber(fileSizeUnitEnum);

        //  读文件
        File source = new File(filePath);
        //  创建通道
        FileChannel fc;
        //  文件大小
        String size;

        FileInputStream fis = new FileInputStream(source);
        //  获取通道信息
        fc = fis.getChannel();
        //  文件信息
        BigDecimal fileSize = new BigDecimal(fc.size());
        //  获取文件大小 数字+单位
        size = fileSize.divide(unitConvertNumber, scale, RoundingMode.HALF_UP) + fileSizeUnitEnum.name();
        //  返回
        return size;
    }

    /**
     * 大小转换工具类
     *
     * @param fileSizeUnitEnum 文件大小单位
     * @return 除数
     */
    private static BigDecimal getSizeUnitConvertNumber(FileSizeUnitEnum fileSizeUnitEnum) {
        //  判断文件大小,返回除数因子
        switch (fileSizeUnitEnum.name()) {
            case "KB":
                return new BigDecimal(1024);
            case "GB":
                return new BigDecimal(1024 * 1024 * 1024);
            default:
                return new BigDecimal(1024 * 1024);
        }
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值