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()が「|」などのシェルの概念を理解しないことです。代わりに試してください:

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

問題は、execがシェルを呼び出さずにバイナリを直接実行することです。「|」文字はシェルによってのみ認識され、soxによっては認識されません。「-c」は、シェルに単一のコマンドを実行するように指示し、コマンド全体を単一の引数として渡します。

于 2012-09-11T07:10:30.137 に答える
-1

これは、コマンドが実行される環境に関連している可能性が高く、次のいずれかである可能性があります。

  • 実行可能ファイルが見つかりません(soxコマンドにフルパスを入力してください)
  • ユーザーにはコマンドを実行する権限がありませんsox(ファイル権限の実行ビットを確認してください)
  • soxJava からコマンドを実行すると、必要な一部の環境変数が初期化されません (sox のドキュメントを確認してください)。
  • speech_16.wavが入力ファイルの場合sox、ファイルが見つかりません (.wav ファイルのフル パスをコマンドに追加します)
  • 出力ファイルを作成する必要がある場合sox、ディレクトリのアクセス許可が原因で、上書きできない名前の既存のファイルが存在するか、ファイル システムのスペースが不足しているため、出力ファイルを作成するアクセス許可がありません。
于 2012-09-11T07:19:21.333 に答える