我正在使用mencoder
来分割文件,我想将其转换为面向对象的方法,如果可能的话,使用Java或类似方法。但我不确定最好的方式,所以我把它公之于众。这就是我需要的:
我有一个包含开始时间和结束时间的excel文件,我需要从视频文件中提取出适当的剪辑。在终端(我在Mac OS X上)我已成功使用,例如:
mencoder -ss 0 -endpos 10 MyVideo.avi -oac copy -ovc copy -o Output.avi
通过剪切视频MyVideo.avi的前10秒来创建视频Output.avi。
但是,就像我说的那样,我想让它成为一个程序从excel文件读入,并为每个开始时间和结束时间多次调用这个mencoder命令(超过100)。
我知道如何在Java中读取excel文件,但我不确定最好从Java调用此命令。另外,我希望能够看到mencoder
的输出(因为它打印出一个很好的百分比,所以你知道单个命令需要多长时间)。这种类型的东西在shell脚本中是可行的吗?如果可能的话,我会really
喜欢使用Java,因为我有多年的Java经验,没有shell脚本的经验。
更新
以下是我在Java中尝试过的内容,但它冻结在in.readLine()
File wd = new File("/bin");
System.out.println(wd);
Process proc = null;
try {
proc = Runtime.getRuntime().exec("/bin/bash", null, wd);
}
catch (IOException e) {
e.printStackTrace();
}
if (proc != null) {
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
out.println("cd ..");
out.println("pwd");
String video = "/Users/MyFolder/MyFile.avi";
String output = "/Users/MyFolder/output.avi";
int start = 0;
int end = 6;
String cmd = "mencoder -ss " + start +
" -endpos " + end +
" " + video + " -oac copy -ovc copy -o " + output;
out.println(cmd);
try {
String line;
System.out.println("top");
while ((line = in.readLine()) != null) {
System.out.println(line);
}
System.out.println("end");
proc.waitFor();
in.close();
out.close();
proc.destroy();
}
catch (Exception e) {
e.printStackTrace();
}
}
答案 0 :(得分:0)
我对mencoders多核功能不太确定,但我认为使用Java可以使用多线程来获得所有cpu核心的最大功率。
您不应该像使用Runtime一样使用Runtime。
使用Runtime时,不应该像在终端上输入命令时那样通过输入流运行bash并发送命令。
Runtime.getRuntime()。exec(" mencoder -ss" + start + " -endpos" +结束+ " " +视频+" -oac copy -ovc copy -o" +输出);
要获得输出,您可以使用inputStream
使用此命令,您还可以设置执行命令的Workingdirectory。
我也更喜欢带有String []的版本作为参数。它比串联的字符串更具可读性。