美文网首页
Java下cmd调用FFmpeg转换视频输出提示

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

作者: PIGning | 来源:发表于2018-08-14 01:06 被阅读0次

    日期: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

    相关文章

      网友评论

          本文标题:Java下cmd调用FFmpeg转换视频输出提示

          本文链接:https://www.haomeiwen.com/subject/gawpbftx.html