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;
}
}
}
有什么问题,欢迎留言,一起探讨。