| | |
| | | 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; |
| | |
| | | |
| | | /** |
| | | * 将文件转为二进制流工具类 |
| | | * @author czt |
| | | * |
| | | * @author czt |
| | | */ |
| | | @Slf4j |
| | | @Service(FileUtils.BEAN_ID) |
| | | public class FileUtils { |
| | | public static final String BEAN_ID = "base.fileUtil"; |
| | | public static final String BEAN_ID = "base.fileUtil"; |
| | | |
| | | @Autowired |
| | | private ConfigData configData; |
| | | @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 String fileToByteString(String filePath) { |
| | | byte[] bytes = file2byte(filePath); |
| | | return toHexString(bytes); |
| | | } |
| | | |
| | | /** |
| | | * 根据文件路径将文件转为二进制数组 |
| | | * @param filePath:文件路径 |
| | | * @return |
| | | */ |
| | | private 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"); |
| | | /** |
| | | * 根据文件路径将文件转为二进制数组 |
| | | * |
| | | * @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; |
| | | } |
| | | |
| | | 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(); |
| | | } |
| | | /** |
| | | * 将二进制数组转为字符串 |
| | | * |
| | | * @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"); |
| | | |
| | | public String getInoutFilePath(Date date) { |
| | | if (null == date) { |
| | | date = new Date(); |
| | | } |
| | | 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(); |
| | | } |
| | | |
| | | String basePath = configData.getImgPath() + "INOUT/" |
| | | + DateFormatUtils.format(date, "yyyyMM") + "/"; |
| | | public String getInoutFilePath(Date date) { |
| | | if (null == date) { |
| | | date = new Date(); |
| | | } |
| | | |
| | | File file = new File(basePath); |
| | | if (!file.exists()) { |
| | | file.mkdirs(); |
| | | } |
| | | String basePath = configData.getImgPath() + "INOUT/" |
| | | + DateFormatUtils.format(date, "yyyyMM") + "/"; |
| | | |
| | | return basePath; |
| | | } |
| | | 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(); |
| | | } |
| | | |
| | | } |
| | | } |