【问题标题】:Best way to call terminal command repeatedly重复调用终端命令的最佳方法
【发布时间】:2013-02-16 21:26:02
【问题描述】:

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

【问题讨论】:

  • 哦,但是 Process 还不足以完成这项任务吗?
  • 我在 Java 中没有成功。
  • 嘿@Co​​deGuy 你为什么使用输入流而不是输出流?我的意思是你想看到输出,输入流将等待输入,所以我认为这就是为什么你的循环永远不会结束
  • 那你猜我怎么做?

标签: java mencoder


【解决方案1】:

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

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

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

Runtime.getRuntime().exec("mencoder -ss " + start + “ -endpos” + 结束 + " " + 视频 + " -oac 复制 -ovc 复制 -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

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

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

【讨论】:

    猜你喜欢
    • 2013-12-19
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2014-01-01
    • 2013-04-30
    • 2014-03-17
    相关资源
    最近更新 更多