2

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 文件中读取,并为每个开始时间和结束时间多次(超过 100 次)调用这个 mencoder 命令。

我知道如何在 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();
           }
        }
4

1 回答 1

0

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

您不应该像使用它一样使用运行时。

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

Runtime.getRuntime().exec("mencoder -ss " + start + " -endpos " + end + " " + video + " -oac copy -ovc copy -o " + output);

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

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

使用此命令,您还可以设置执行命令的工作目录。

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

于 2013-02-16T21:35:26.847 回答