2

我正在尝试从 java 执行 SOX 命令,但不幸的是它每次都返回错误。不过,其他所有 SOX 命令都可以正常工作!这是代码:

class Simple {
    public static void main(String args[]) throws IOException, Exception {
        Process p;
        BufferedReader br;
        String co = "sox speech_16.wav -p pad 0 2.5 | sox - -m speech_16.wav speech_output.wav";
        p = Runtime.getRuntime().exec(co);
        br = new BufferedReader(new InputStreamReader(p.getInputStream()));
            int returnCode = p.waitFor();
        System.out.println("reurn code : "+returnCode);         
    }
}

当我在终端中执行相同的 sox 命令时,它工作正常。实在看不懂是什么问题!!是不是因为'|' 象征??

4

2 回答 2

8

问题是 Runtime.exec() 不理解诸如“|”之类的 shell 概念。而是尝试:

Runtime.getRuntime().exec("/bin/sh", "-c", co);

问题是 exec 直接运行二进制文件而不调用 shell。“|” 字符只被 shell 识别,sox 不识别。“-c”告诉外壳程序运行单个命令,并将整个命令作为单个参数传递。

于 2012-09-11T07:10:30.137 回答
-1

这可能与执行命令的环境有关,可能是以下任何一种:

  • sox找不到可执行文件(将完整路径放在命令中)
  • 用户没有运行sox命令的权限(检查文件权限中的执行位)
  • sox当您从 Java 运行命令时,未初始化所需的某些环境变量(检查 sox 文档)
  • 如果speech_16.wav是输入文件,sox则无法找到该文件(将 .wav 文件的完整路径添加到命令)
  • 如果sox需要创建一个输出文件,那么它没有权限这样做,要么是由于目录权限,要么是因为存在无法覆盖该名称的现有文件,或者是由于文件系统上的空间不足。
于 2012-09-11T07:19:21.333 回答