package com.fzzy.api.utils;
|
|
import com.fzzy.data.ConfigData;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.lang.time.DateFormatUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import ws.schild.jave.Encoder;
|
import ws.schild.jave.EncoderException;
|
import ws.schild.jave.MultimediaObject;
|
import ws.schild.jave.encode.AudioAttributes;
|
import ws.schild.jave.encode.EncodingAttributes;
|
import ws.schild.jave.encode.VideoAttributes;
|
|
import java.io.ByteArrayOutputStream;
|
import java.io.File;
|
import java.io.FileInputStream;
|
import java.io.FileNotFoundException;
|
import java.io.IOException;
|
import java.util.Date;
|
|
/**
|
* 将文件转为二进制流工具类
|
*
|
* @author czt
|
*/
|
@Slf4j
|
@Service(FileUtils.BEAN_ID)
|
public class FileUtils {
|
public static final String BEAN_ID = "base.fileUtil";
|
|
@Autowired
|
private ConfigData configData;
|
|
|
/**
|
* 根据文件路径将文件转为二进制文件流字符串
|
*
|
* @param filePath:文件路径
|
* @return
|
*/
|
public static String fileToByteString(String filePath) {
|
byte[] bytes = file2byte(filePath);
|
return toHexString(bytes);
|
}
|
|
/**
|
* 根据文件路径将文件转为二进制数组
|
*
|
* @param filePath:文件路径
|
* @return
|
*/
|
public static byte[] file2byte(String filePath) {
|
byte[] buffer = null;
|
try {
|
File file = new File(filePath);
|
FileInputStream fis = new FileInputStream(file);
|
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
byte[] b = new byte[1024];
|
int n;
|
while ((n = fis.read(b)) != -1) {
|
bos.write(b, 0, n);
|
}
|
fis.close();
|
bos.close();
|
buffer = bos.toByteArray();
|
} catch (FileNotFoundException e) {
|
e.printStackTrace();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
return buffer;
|
}
|
|
/**
|
* 将二进制数组转为字符串
|
*
|
* @param byteArray
|
* @return
|
*/
|
private static String toHexString(byte[] byteArray) {
|
if (byteArray == null || byteArray.length < 1)
|
throw new IllegalArgumentException(
|
"this byteArray must not be null or empty");
|
|
final StringBuilder hexString = new StringBuilder();
|
for (int i = 0; i < byteArray.length; i++) {
|
if ((byteArray[i] & 0xff) < 0x10)// 0~F前面不零
|
hexString.append("0");
|
hexString.append(Integer.toHexString(0xFF & byteArray[i]));
|
}
|
return hexString.toString().toLowerCase();
|
}
|
|
public String getInoutFilePath(Date date) {
|
if (null == date) {
|
date = new Date();
|
}
|
|
String basePath = configData.getImgPath() + "INOUT/"
|
+ DateFormatUtils.format(date, "yyyyMM") + "/";
|
|
File file = new File(basePath);
|
if (!file.exists()) {
|
file.mkdirs();
|
}
|
|
return basePath;
|
}
|
|
public String getSnapFilePath(Date date) {
|
if (null == date) {
|
date = new Date();
|
}
|
|
String basePath = configData.getImgPath() + "SNAP/"
|
+ DateFormatUtils.format(date, "yyyyMM") + "/";
|
File file = new File(basePath);
|
if (!file.exists()) {
|
file.mkdirs();
|
}
|
return basePath;
|
}
|
|
public String getCommonFilePath(Date date) {
|
if (null == date)
|
date = new Date();
|
|
String basePath = configData.getImgPath() + "COMMON/"
|
+ DateFormatUtils.format(date, "yyyyMM") + "/";
|
|
File file = new File(basePath);
|
if (!file.exists()) {
|
file.mkdirs();
|
}
|
return basePath;
|
}
|
|
/**
|
* 视频压缩
|
*
|
* @param source 源文件
|
* @param target 目标文件
|
* @param rate 压缩比
|
*/
|
public static void compre(File source, File target, Integer rate) throws EncoderException {
|
try {
|
log.info("---------------开始压缩---------------");
|
long start = System.currentTimeMillis();
|
|
// 音频编码属性配置
|
AudioAttributes audio = new AudioAttributes();
|
audio.setCodec("libmp3lame");
|
// 设置音频比特率,单位:b (比特率越高,清晰度/音质越好,当然文件也就越大 56000 = 56kb)
|
// audio.setBitRate(new Integer(56_000));
|
audio.setBitRate(new Integer(10));
|
// 设置重新编码的音频流中使用的声道数(1 =单声道,2 = 双声道(立体声))
|
audio.setChannels(1);
|
// 采样率越高声音的还原度越好,文件越大
|
// audio.setSamplingRate(new Integer(44100));
|
audio.setSamplingRate(new Integer(22050));
|
// 视频编码属性配置
|
VideoAttributes video = new VideoAttributes();
|
// 设置编码
|
video.setCodec("h254");
|
//设置音频比特率,单位:b (比特率越高,清晰度/音质越好,当然文件也就越大 5600000 = 5600kb)
|
// video.setBitRate(new Integer(5_600_000 / rate));
|
video.setBitRate(10 / rate);
|
|
// 设置视频帧率(帧率越低,视频会出现断层,越高让人感觉越连续),这里 除1000是为了单位转换
|
video.setFrameRate(15);
|
|
|
// 编码设置
|
EncodingAttributes attr = new EncodingAttributes();
|
attr.setOutputFormat("mp4");
|
attr.setAudioAttributes(audio);
|
attr.setVideoAttributes(video);
|
|
// 设置值编码
|
Encoder ec = new Encoder();
|
ec.encode(new MultimediaObject(source), target, attr);
|
|
|
log.info("---------------结束压缩---------------");
|
long end = System.currentTimeMillis();
|
log.info("压缩前大小:" + source.length() + " 压缩后大小:" + target.length());
|
log.info("压缩耗时:" + (end - start));
|
|
} catch (EncoderException e) {
|
e.printStackTrace();
|
} catch (IllegalArgumentException e) {
|
e.printStackTrace();
|
}
|
|
}
|
}
|