使用了两个枚举
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);
}
}
}