使用FFmepg,ProcessBuilder 和 Runtime在Linux的工具类

ProcessBuilder 和 Runtime的工具类

简单介绍 ProcessBuilder 和 Runtime吧

*ProcessBuilder.start() 和 Runtime.exec() 方法都被用来创建一个操作系统进程(执行命令行操作),并返回 Process 子类的一个实例,该实例可用来控制进程状态并获得相关信息。
每个ProcessBuilder实例管理一个进程属性集。ProcessBuilder的start()方法利用这些属性创建一个新的Process实例。start()方法可以从同一实例重复调用,以利用相同或者相关的属性创建新的子进程。

通过查看JDK源码可知,Runtime.exec最终是通过调用ProcessBuilder来真正执行操作的。*

不同点:

*ProcessBuilder.start() 和 Runtime.exec()传递的参数有所不
分隔可执行命令程序和参数的;也可以接受字符串数组参数。而ProcessBuilder的构造函数是一个字符串列表或者数组。列表中第一个参数是可执行命令程序,其他的是命令行执行是需要的参数。*

上面的内容都是别人写的,我也是懒得再写

好了,不多说废话,上代码。

主要是为了在Linux中用FFmepg,对视频生成缩略图

*ProcessBuilder 和 Runtime其实都没什么区别,用哪个都差不多,两个工具类我都测试过,不过还是选择了Runtime吧
明天会对这个工具类进行多线程的处理,今天实在不想弄了。
public class VideoPictureUtil2 {
    /**
     * 用FFmpeg生成视频缩略图
     * @desc
     * @author hugh
     * @param ffpath 
     * @param path
     * @param outImagePath
     * @return
     */
    public static synchronized boolean getVideoImage(String time,String resolution,String path,String outImagePath) {

        File file = new File(path);
        if (!file.exists()) {
            return false;
        }

        StringBuffer commands = new StringBuffer();
        commands.append("ffmpeg");
        commands.append(" -i ");
        commands.append(path);
        commands.append(" -y");
        commands.append(" -f");
        commands.append(" image2");

        commands.append(" -ss "); 
        commands.append(time);
        commands.append(" -t");
        commands.append(" 0.001");
        commands.append(" -s");
        commands.append(" 320x240 ");
        commands.append(outImagePath);


        try {  
            // 执行命令  
            Process p = Runtime.getRuntime().exec(commands.toString());
            // 取得命令结果的输出流  
            InputStream fis = p.getInputStream();  
            // 用一个读输出流类去读  
            InputStreamReader isr = new InputStreamReader(fis);  
            // 用缓冲器读行  
            BufferedReader br = new BufferedReader(isr);  
            String line = null;  
            // 直到读完为止  
            while ((line = br.readLine()) != null) {  
                System.out.println(line);  
            }  
            return true;
        } catch (IOException e) {  
            return false;
        }  
    }
}
public class VideoPictureUtil{
    /**
     * 获得视频缩略图,获取成功返回true,获取失败返回false
     * @param ffmpegPath  是ffmpeg.exe存放的路径
     * @param path   是视频文件的存放路径
     * @param outImagePath 输出缩略图的保存路径
     * @return
     */
    public static boolean getVideoImage(String ffmpegPath,String path,String outImagePath) {
        File file = new File(path);
        if (!file.exists()) {//判断文件是否存在
            System.out.println("[" + path + "]视频文件不存在!");
            return false;
        }
        //设置参数
        List<String> commands = new java.util.ArrayList<String>();
        commands.add(ffmpegPath);//这里设置ffmpeg.exe存放的路径
        commands.add("-i");
        commands.add(path);//这里是设置要截取缩略图的视频的路径
        commands.add("-y");
        commands.add("-f");
        commands.add("image2");
        commands.add("-ss"); 
        commands.add("10");//这里设置的是要截取视频开始播放多少秒后的图,可以自己设置时间
        commands.add("-t");
        commands.add("0.001");
        commands.add("-s");
        commands.add("320x240");//这里设置输出图片的大小
        commands.add(outImagePath);//这里设置输出的截图的保存路径


        try {
            //截取缩略图并保存  
            ProcessBuilder builder = new ProcessBuilder();
            builder.command(commands);
            builder.start();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}
 有什么问题,欢迎留言,一起探讨。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值