1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- package api.common.util;
- import lombok.SneakyThrows;
- import org.apache.commons.io.FileUtils;
- import java.io.File;
- import java.io.IOException;
- import java.util.Arrays;
- public class FfmpegUtil {
- /**
- * @param sourcePath 原始图片路径
- * @param videoPath 视频生成路径
- * @param filename 视频文件名称
- * @param ffmpeg 视频软件路径
- */
- @SneakyThrows
- public static void imgToMp4(String sourcePath, String videoPath, String filename, double inputFrameRate, String ffmpeg) {
- int nameLength = copyImgToTemp(sourcePath);
- String execute = LinuxUtil.execute(ffmpeg
- + " -r " + inputFrameRate
- + " -i " + FileUtil.addSeparator(sourcePath) + "tmp/image%0" + nameLength + "d.tga"
- + " -y "
- + videoPath + "/" + filename + ".mp4"
- );
- }
- /**
- * 计算帧率
- *
- * @param imageNumber 图片数量
- * @param second 视频长度
- * @param decimalPlaces 帧率保留几位小数
- * @return 帧率
- */
- public static double computeFramerate(int imageNumber, int second, int decimalPlaces) {
- return Math.round(imageNumber * Math.pow(10.0, decimalPlaces) / second) / Math.pow(10.0, decimalPlaces);
- }
- private static int copyImgToTemp(String sourcePath) throws IOException {
- File file = new File(sourcePath);
- File[] files = file.listFiles();
- assert files != null;
- Arrays.sort(files);
- String[] names = file.list();
- assert names != null;
- Arrays.sort(names);
- int nameLength = getLen(names.length);//获取图片总张数的位数大小,用于补齐图片名称,例如image000.jpg,image001.jpg ....image999.jpg
- int makeUpMaxNum = getMakeUpMaxNum(nameLength);//图片名字需要补齐的最大数
- if (names.length > 0) {
- String tmpPath = sourcePath + "/tmp";
- new File(tmpPath).mkdir();
- for (int i = 0; i < names.length; i++) {
- String name = names[i];
- if (name.lastIndexOf(".") > 0) {
- int lo = name.lastIndexOf(".");
- String lastName = name.substring(lo);
- String forNeName = String.valueOf(i);
- if (i <= makeUpMaxNum) {
- StringBuilder zeString = new StringBuilder();
- for (int j = 0; j < nameLength - forNeName.length(); j++) {
- zeString.append("0");
- }
- forNeName = "image" + zeString + forNeName + lastName;
- } else {
- forNeName = "image" + forNeName + lastName;
- }
- FileUtils.copyFile(files[i], new File(tmpPath + "/" + forNeName));
- }
- }
- }
- return nameLength;
- }
- public static int getLen(int x) {
- if (x < 10) return 1;
- return getLen(x / 10) + 1;
- }
- public static int getMakeUpMaxNum(int len) {
- int num = 1;
- for (int i = 1; i < len; i++) {
- num = num * 10;
- }
- return num - 1;
- }
- }
|