java实现视频格式转换为mp4

时间:2024-03-05 13:49:21

1.基于上一篇继续,根据需求将其他视频格式转换为mp4格式后前端能预览资源视频

2.首先需要准备的工作是要准备外部文件转换器,下载文件后直接解压如下,按照这个路径下指定,linux下需要安装才能进行

链接:https://pan.baidu.com/s/1N_MURcIJdIVl9sKgod1rGA
提取码:h3q9

 

 

3.最后的代码工具类如下:

 

package file;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class ConvertVideo {

    private static String ffmpegPath  = "C:/server/ffmpeg/bin/win64/ffmpeg.exe";

    private static String mplayerPath = "C:/server/mencoder/mencoder.exe";


    /**
     * 视频格式转换入口
     *
     * @param inputPath  源文件 路径
     * @param outputPath 目标文件 路径
     * @param outputPath1 中间文件地址 路径
     * @return
     */
    public synchronized static boolean process(String inputPath, String outputPath ,String outputPath1) {
        int type = checkContentType(inputPath);
        boolean status = false;
        Long old = System.currentTimeMillis();
        System.out.println("old--------" + old);
        if (type == 0) {
            System.out.println("直接转成MP4格式");
            status = processMP4(inputPath, outputPath);// 直接转成flv格式
        } else if (type == 1) {
            String avifilepath = processAVI(inputPath, outputPath1);
            System.out.println(avifilepath);
            if (avifilepath == null)
                return false;// 没有得到avi格式
            status = processMP4(avifilepath, outputPath);// 将avi转成flv格式
        }
        Long yong = System.currentTimeMillis();
        System.out.println("消耗时间----------" + (yong-old));
        return status;
    }

    /**
     * 判断文件类型.执行不同的转换流程
     *
     * @param inputPath 源文件路径
     * @return
     */
    private static int checkContentType(String inputPath) {
        String type = inputPath.substring(inputPath.lastIndexOf(".") + 1, inputPath.length())
                .toLowerCase();
        // ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
        if (type.equals("avi")) {
            return 0;
        } else if (type.equals("mpg")) {
            return 0;
        } else if (type.equals("wmv")) {
            return 0;
        } else if (type.equals("3gp")) {
            return 0;
        } else if (type.equals("mov")) {
            return 0;
        } else if (type.equals("mp4")) {
            return 0;
        } else if (type.equals("asf")) {
            return 0;
        } else if (type.equals("asx")) {
            return 0;
        } else if (type.equals("flv")) {
            return 0;
        }
        // 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),
        // 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
        else if (type.equals("wmv9")) {
            return 1;
        } else if (type.equals("rm")) {
            return 1;
        } else if (type.equals("rmvb")) {
            return 1;
        }
        return 9;
    }

    /**
     * 判断源文件是否存在
     *
     * @param path 文件路径
     * @return
     */
    private static boolean checkfile(String path) {
        File file = new File(path);
        if (!file.isFile()) {
            return false;
        }
        return true;
    }

    // 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等), 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
    private static String processAVI(String inputPath, String outputPath1) {
        List<String> commend = new ArrayList<>();
        commend.add(mplayerPath);
        commend.add(inputPath);
        commend.add("-oac");
        commend.add("mp3lame");
        commend.add("-lameopts");
        commend.add("preset=64");
        commend.add("-ovc");
        commend.add("xvid");
        commend.add("-xvidencopts");
        commend.add("bitrate=600");
        commend.add("-of");
        commend.add("avi");
        commend.add("-o");
        commend.add(outputPath1);
        try {
            ProcessBuilder builder = new ProcessBuilder();
            Process process = builder.command(commend).redirectErrorStream(true).start();
            new PrintStream(process.getInputStream()).start();
            new PrintStream(process.getErrorStream()).start();
            process.waitFor();
            process.destroy();
            return outputPath1;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    // ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等) 转换为MP4
    private static boolean processMP4(String inputPath, String outputPath) {

        if (!checkfile(inputPath)) {
            System.out.println(inputPath + " is not file");
            return false;
        }

        List<String> command = new ArrayList<>();
        command.add(ffmpegPath);
        command.add("-i");
        command.add(inputPath);
        command.add("-c:v");
        command.add("libx264");
        command.add("-mbd");
        command.add("0");
        command.add("-c:a");
        command.add("aac");
        command.add("-strict");
        command.add("-2");
        command.add("-pix_fmt");
        command.add("yuv420p");
        command.add("-movflags");
        command.add("faststart");
        command.add(outputPath);
        try {
            Process videoProcess = new ProcessBuilder(command).redirectErrorStream(true).start();

            new PrintStream(videoProcess.getErrorStream()).start();

            new PrintStream(videoProcess.getInputStream()).start();

            videoProcess.waitFor();
            videoProcess.destroy();
            System.out.println(outputPath);
            return true;
        } catch (Exception e) {

            return false;
        }
    }
    public static void main(String[] args) {
        //本地文件地址
        String inputPath = "E:/test/11.flv";
        //目标文件地址
        String outputPath ="E:/video/11.mp4";
        //中间文件随机数
        String uuidname = UUID.randomUUID().toString();
        //中间文件地址,需要两次转换的情况下会用到该中间文件.直接转换为MP4的文件不会生成中间文件.
        String path = "E:/video/";
        String outputPath1 = path  + uuidname + ".avi";
        //执行转换
        ConvertVideo.process(inputPath,outputPath,outputPath1);//执行完毕后可以删除没用的文件

    }
}

/**
 * 资源释放流.避免内存溢出导致进程阻塞
 */
class PrintStream extends Thread {

    java.io.InputStream __is = null;

    public PrintStream(java.io.InputStream is) {
        __is = is;
    }

    public void run() {
        try {
            while (this != null) {
                int _ch = __is.read();
                if (_ch != -1)
                    System.out.print((char) _ch);
                else break;
            }
            __is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }



}

 

按照上述操作即可将视频转换为mp4,目前支持能支持大部分常见视频格式转换为mp4文件,有其他不能转换的格式可以提出来一起讨论下;

最后的最后将源码贴出来,有需要的小伙伴可以试试;

链接:https://pan.baidu.com/s/1pX-7A-4E_fNBGnSH8mZFWw
提取码:mrx8