java - 重复调用终端命令的最佳方式

标签 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 脚本中可行吗?如果可能的话,我真的想使用 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();
           }
        }

最佳答案

我不太确定 mencoder 的多核功能,但我认为对于 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.File%29

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

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

关于java - 重复调用终端命令的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14915290/

相关文章:

java - onClick 监听器和 onClick on XML 将不起作用

java - 将 SInhala Unicode 字母打印到 Epson TMU220D 打印机

java - 在Azure项目中发送电子邮件java失败

ffmpeg - 从网络摄像头编码未压缩的 avi

html - 将 flv 转换为 mp4

ffmpeg - 将mp4转换为质量较低的mpt

Java - 创建一个传递数组作为参数的对象

linux - 如何快速截取视频剪辑 50 分钟后的屏幕截图?

linux - 使用 mencoder 或 ffmpeg 时特殊字符变得不明确

客户端的 java keystore