重复呼叫终端命令的最佳方式

时间:2013-02-16 21:26:02

标签: java mencoder

我正在使用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();
           }
        }

1 个答案:

答案 0 :(得分:0)

我对mencoders多核功能不太确定,但我认为使用Java可以使用多线程来获得所有cpu核心的最大功率。

您不应该像使用Runtime一样使用Runtime。

使用Runtime时,不应该像在终端上输入命令时那样通过输入流运行bash并发送命令。

  

Runtime.getRuntime()。exec(" mencoder -ss" + start +                             " -endpos" +结束+                             " " +视频+" -oac copy -ovc copy -o" +输出);

要获得输出,您可以使用inputStream

http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Runtime.html#exec%28java.lang.String,%20java.lang.String[],%20java.io.File%29

使用此命令,您还可以设置执行命令的Workingdirectory。

我也更喜欢带有String []的版本作为参数。它比串联的字符串更具可读性。