YYC
2024-12-30 5d2ddd92e970f02f42a4014cc65eb74e33feb776
src/main/java/com/fzzy/api/utils/FileUtils.java
@@ -1,9 +1,16 @@
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;
@@ -14,86 +21,177 @@
/**
 * 将文件转为二进制流工具类
 * @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
    */
   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");
    /**
     * 根据文件路径将文件转为二进制数组
     *
     * @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();
        }
    }
}