Java下cmd调用FFmpeg转换视频输出提示

2018-08-14  本文已影响0人  PIGning

日期:2018/08/13

本文写的是纯java调用FFmepg.exe,推荐有c基础的dalao们可以去雷神的博客找解决方案

这段时间要做一个小东西(对我来说并不是)去实现多视频的一键转码上传,网上查来查去,最后还是选择FFmpeg,不过FFmpeg网上资料不太多,中间也是经常卡住(主要是自己水平问题)...闲话少说吧,写这篇文章是因为我自己百度找Java调用FFmpeg.exe,转一个视频输出一个提示的时候没有搜到比较有用的东西,所以实现之后我就自己写一篇给纯java的兄dei们一点参考吧

思路:

将FFmpeg命令的集合放到cmd里面运行

获取cmd中ffmpeg的输出信息,转完一个后返回提示

很简单吧(没错),但是我相信也会有和我一样的小白不会的,瓶颈是对cmd操作的不熟悉,还有百度找不到相关信息

代码:

ShowTime
CmdExcuter.java:最重要的类,创建进程生成器调用FFmpeg.exe并获取cmd的输出,这里的List<String> cmd就是输入的cmd命令,把调用FFmpeg的String数组赋值给cmd变量即可
这段代码并不是我个人原创,实习公司的dalao给了很多帮助,一些地方我也没法正确表述,因此我就不写太多注释了,看jdk文档吧

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.List;

public class CmdExecuter {
    private static Logger logger = LoggerFactory.getLogger(CmdExecuter.class);

    public static void exec(List<String> cmd, CmdOutputGetter getter) {

        if (logger.isInfoEnabled()) {
            logger.info("exec command: ");
            StringBuilder sb = new StringBuilder();//StringBuilder是字符串生成器,上面这部分和cmd操作没关系
            for (String c : cmd) {
                sb.append(c).append(" ");
            }
            logger.info(sb.toString());
        }

        //cmd操作部分
        try {
            ProcessBuilder builder = new ProcessBuilder();//创建新线程
            builder.command(cmd);//执行FFmpeg命令
            builder.redirectErrorStream(true);
            Process proc = builder.start();
            BufferedReader stdout = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            String line;
            while ((line = stdout.readLine()) != null) {
                if (getter != null)
                    getter.dealLine(line);
            }
            proc.waitFor();
            stdout.close();
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
    }
}

CmdOutputGetter.java:用于获取cmd输出的每行信息,要自己写deal方法决定怎么处理返回的每行信息

public interface CmdOutputGetter {

    public void dealLine(String str);

}

ConvertVideo.java(部分)我只把有关联的那几行放一下

commend是ffmpeg命令的集合(存放一条完整的ffmpeg命令)

            //调用cmd操作类
            CmdExecuter.exec(commend, new CmdOutputGetter() {
                @Override
                public void dealLine(String line) {
                    System.out.println(line);//把cmd输出的信息每行syso,这个是实时输出的,可以换其他的处理方式
                }
            });

           System.out.println("AMD,YES!");//可以换成其他提示转换完成的方法

之后我会做个小demo放评论里面,供需要的人下载,现在是凌晨1点,感觉再熬会秃头
这是我第一次写博客,对于这篇文章有什么不太明白的地方欢迎评论,我会尽力说明

krenz-cushart-castle2.jpg
上一篇下一篇

猜你喜欢

热点阅读