使用ffmpeg对视频转码成mp4

在上一篇文章中,已经完成ffmpeg及x264库的安装,接下来编写代码对视频文件进行转换。

    /**
     * 
     * @param Directory 文件目录
     * @param filename  文件名字
     * @return
     */
    public String ffmpeg2MP4(String Directory, String filename) {
        List<String> params = new ArrayList<>();
        params.add("-f");
        params.add("mp4");
        params.add("-loglevel");
        params.add("quiet");
        params.add("-vcodec");
        params.add("libx264");
        return ffmpegConvert("mp4", params, Directory, filename);
    }
    /**
     * ffmpeg 转码
     * @param format 转码格式 如mp4 能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
     * @param params 转码参数,参考ffmpeg 命令
     * @param Directory 原文件目录
     * @param filename 原文件名称
     * @return
     */
    public String ffmpegConvert(String format, List<String> params, String Directory, String filename) {
        String newDir = Directory + "news";
        String newFileName = filename.substring(0, filename.lastIndexOf(".")) + "." + format;
        String newFilePath = newDir + "/" + GlobalUuid.getUuid() + newFileName;

        String before = Directory + filename;
        new File(newDir).mkdirs();//创建对应的文件夹

        List<String> commend = new ArrayList<>();
        commend.add(fdsConfig.getFfmpegPath() + "ffmpeg");
        commend.add("-i");
        commend.add(before);
        commend.addAll(params);
        commend.add(newFilePath);

        try {
            //调用线程命令进行转码
            log.info("ffmpeg convert begin");
            ProcessBuilder builder = new ProcessBuilder(commend);
            builder.command(commend);
            Process process = builder.start();
            int value = -1;
            try {
                value = process.waitFor();
            } catch (InterruptedException e) {
                log.warn("ffmpeg convert video error", e);
            }
            log.info("ffmpeg convert over");
            log.info("ffmpeg转码成功!!文件位于: {} ", newDir);
            return value == 0 ? newFilePath : null;
        } catch (IOException e) {
            log.warn("ffmpeg转码错误" + e);
            return null;
        }
    }

      -loglevel quiet比较关键,这个参数的意思是使用ffmpeg进行转码时不进行log输出。如果不写的话,程序会出现莫名其妙的卡死无任何响应,因为错误或正常输出会使缓冲区满,程序无法继续打印输出,也就卡死了。

发布了35 篇原创文章 · 获赞 81 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/chanllenge/article/details/89309529