【问题标题】:Runtime.getRuntime().exec() output differ from executing a command line program directlyRuntime.getRuntime().exec() 输出不同于直接执行命令行程序
【发布时间】:2013-05-20 22:54:16
【问题描述】:

跑步

/usr/bin/mediainfo --Inform='Video;%Duration%' /home/daniel/upload/videos/4/f/6/e/f/4f6ef2e0d67c4.flv

从终端给我这个输出

903520

并在 java 中运行它

        Process p1;
    try {
        p1 = Runtime.getRuntime().exec("/usr/bin/mediainfo --Inform='Video;%Duration%' /home/daniel/upload/videos/4/f/6/e/f/4f6ef2e0d67c4.flv");

        BufferedReader input1 = new BufferedReader(new InputStreamReader(p1.getInputStream()));
        String line1;
        while ((line1 = input1.readLine()) != null) {
            System.out.println("-"+line1);
        }
        input1.close();         

        p1.waitFor();               


    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

结果

-General
-Complete name : /home/daniel/upload/videos/4/f/6/e/f/4f6ef2e0d67c4.flv
-Format                                   : Flash Video
-File size                                : 62.0 MiB
-Duration                                 : 15mn 3s
-Overall bit rate                         : 576 Kbps
-Tagging application       : Yet Another Metadata Injector for FLV - Version 1.4
-
-Video
-Format                                   : AVC
-Format/Info                              : Advanced Video Codec
-Format profile                           : High@L2.0
-Format settings, CABAC                   : Yes
-Format settings, ReFrames                : 4 frames
-Codec ID                                 : 7
-Duration                                 : 15mn 3s
-Bit rate                                 : 512 Kbps  
(much more here) ... 

如何从 Runtime.getRuntime().exec(cmd) 获得我想要的输出 (903520)?

编辑:固定格式

【问题讨论】:

  • 提示 - 在发布之前在预览窗口中检查您的问题。这种格式对我来说看起来不太健康......
  • 在不了解/usr/bin/mediainfo 的作用的情况下,您是否清楚必须如何解释参数以导致第二组输出?如果它通常只输出一个六位数的数字,这似乎特别奇怪。
  • 如果一个命令的输出与另一个命令的输出不同,那么要么 (a) 命令行不同,要么 (b) 环境(当前工作目录、环境变量等)不同不同的。 (或者显然是(a)和(b)两者。)你能把echo放在Runtime.getRuntime().exec()命令行前面并分享捕获的结果吗?通过这种方式,我们可以确定这两个命令行是否真的像您想象的那样相同。如果它们相同,我们接下来将检查环境。我怀疑问题在于%Duration% 没有像在“n
  • 回声?我该怎么做?
  • 带有那组参数的 mediainfo 的输出应该以纳秒为单位返回电影的长度。所以一个六位数的数字是我对剪辑的期望~15mins

标签: java command-line


【解决方案1】:

命令行 shell 为您提供了一些魔法,而 Runtime.exec() 为您提供了

我猜在这种情况下,shell 会解释(并忽略)命令行中的 ' 标记。

所以请尝试这个版本,其中' 已被删除,命令行已手动拆分为多个部分(另一个常见问题):

String[] args = new String[]{
    "/usr/bin/mediainfo",
    "--Inform=Video;%Duration%",
    "/home/daniel/upload/videos/4/f/6/e/f/4f6ef2e0d67c4.flv"
};
Runtime.getRuntime().exec(args);

【讨论】:

  • arrghh 浪费了一个小时。非常感谢!
【解决方案2】:

注意有一个Runtime.exec(String)一个Runtime.exec(String[])
您是否尝试过第二种方法,只是为了确保字符串命令按照应有的方式进行解释?

来自文档:

public Process exec(String command)
             throws IOException

在单独的进程中执行指定的字符串命令。 (...)


public Process exec(String[] cmdarray)
             throws IOException

在单独的进程中执行指定的命令和参数。 (...)


你可以试试:

String[] myArgs = new String[]{
    "/usr/bin/mediainfo",
    "--Inform='Video;%Duration%'",
    "/home/daniel/upload/videos/4/f/6/e/f/4f6ef2e0d67c4.flv"
};

Process p1;
try {
    p1 = Runtime.getRuntime().exec(myArgs);
        ...
}

【讨论】:

    猜你喜欢
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    相关资源
    最近更新 更多