【问题标题】:Java ProcessBuilder in ubuntu with bmdcaptureubuntu 中的 Java ProcessBuilder 和 bmdcapture
【发布时间】:2015-02-17 12:57:42
【问题描述】:

我正在使用 blackmagic 的 decklink 卡进行直播。所以为此我需要执行一个命令。

String[] command={"./bmdcapture", "-m", "10", "-C", "0", "-V", "3", "-A", "2", "-F", "nut", "-f", "pipe:1", "|", "./avconv", "-i", "-", "-strict", "experimental", "-c:v", "libx264", "test.mp4"};
File f = new File("/home/NetBeansProjects/tools/card");
ProcessBuilder pb = new ProcessBuilder(command);
pb.directory(f);
pb.directory(f);
Process process = pb.start();

它在终端中完美运行,但是当我使用 java 通过 process-builder 调用时不起作用。

【问题讨论】:

  • 它怎么不工作?你没有告诉任何关于这个问题的事情。 “不起作用”没有帮助。
  • 结果是 bmdcapture:无效选项 -- 'i'。管道符号不起作用
  • 啊,我没看到管道。难怪它不起作用......
  • Yoi 要么需要自己链接管道,要么将所有命令传递给 /bin/sh -c
  • 谢谢我改成这样 String[] commands={"/bin/sh", "-c","./bmdcapture -m 10 -C 0 -V 3 -A 2 -F nut -f 管道:1 | ./avconv -y -i - -strict 实验性 -c:v libx264 test.mp4"};它的作品

标签: java ubuntu avconv


【解决方案1】:

好的,这确实是经典,但我想这仍然需要不时敲击头部,并且最好使用大锤,这里的大锤将是一些粗体...

ProcessBuilder 不通过命令解释器运行其进程;因此,任何命令解释器元字符,例如*|,都将保持不变。

在您的示例中,您基本上尝试做的是使用ProcessBuilder 将一个命令传递到另一个命令。但是虽然这样:

cmd1 | cmd2

将在 Unix shell 中工作,这:

new ProcessBuilder("cmd1", "|", "cmd2")

不会。 ProcessBuilder 不知道管道符号是什么,只会将其作为参数传递给正在发出的命令(此处为 cmd1)。这与标准 C 库中的 execve() 等行为相同。

如果您真的想将一个命令的输出通过管道传输到另一个命令,您必须使用 两个 ProcessBuilders(每个命令一个)并将第一个命令的输出重定向到第二个输入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多