2011-08-03 8 views
0

私は、JavaからProcessBuilderを使ってSoXを実行して、wavファイルをトリミングしています。私は、次のようにファイルをトリミングしようとすると、JavaのProcessBuilderを使ってSoXを実行する

sox/sox --version 
sox/sox --i -r test/test.wav 
sox/sox --i -D test/test.wav 
sox/sox --i -b test/test.wav 
sox/sox --i -c test/test.wav 

しかし:私は、私は成功し、次のコマンドを実行するために管理し、他のJUnitテストで原因I SOX法を実行することができるはずと確信しています

sox/sox -V3 "/Users/username/workspace/Thesis Corpus Integrator/test/test.wav" -b 16  "/Users/username/workspace/Thesis Corpus Integrator/test/newWaveFile.wav" channels 1 trim 0:00:00.000 =0:00:30.000 

error=2, No such file or directoryIOExceptionがスローされます。ターミナルでコマンドを実行しようとしましたが、問題なく動作しました。それが重要なのであれば、私はMacBook上のeclipseからJUnitテストを実行しました。

ここで私はProcessBuilderをでそれを構築するために使用されるコードは次のとおりです。

StringBuilder command = new StringBuilder(soxCommand) // soxCommand resolves to sox/sox, and is used in all the other tests without any problems 
if (WavCutter.getMetadata(srcFile.getAbsolutePath(), 
       MetadataField.SAMPLE_RATE) != 16000) { 
    command.append(" -V3"); 
    command.append(" -G"); 
    command.append(" \"" + srcFile.getAbsolutePath() + '\"'); 
    command.append(" -b 16"); 
    command.append(" \"" + destFile.getAbsolutePath() + '\"'); 
    command.append(" channels 1"); 
    command.append(" gain -h"); 
    command.append(" rate 16000"); 
    command.append(" trim"); 
    command.append(" " + startTime.toString()); 
    command.append(" " + '=' + endTime.toString()); 

    Process soxProcess = new ProcessBuilder(command.toString()) 
       .start(); 

私も同じことをしようとしたが、ArrayListのを使用します。

+0

私はProcessBuilderコードを表示できますか?次のコマンドを使用して、問題を端末で再現できましたか?私はそれがあなたのファイル名のスペースを正しく処理していないと思う。 – bramp

+0

最初は、ファイルパスを引用符で囲みませんでしたが、失敗した後に引用符を追加しようとしました。 – cesar

+0

@brampありがとうございます。あなたはそれを修正する方法について私に大きなヒントを与えました。それはファイル名ではなく、むしろ効果でした。 – cesar

答えて

0

brampさんのコメントから多くの助けを得て、自分自身で答えを見つけました。この問題は、まずList of Stringsを使用してから、soxのeffectsのようにスペースを必要とする非ダッシュのプレフィックス引数を分離することで簡単に解決されます。

だから、のようなものから:あなたが得る

StringBuilder s = new StringBuilder("sox/sox"); // command itself is 'sox' 

// everything after this is an argument 
s.add(srcFile.getPath()); 
s.add("-b 16"); 
s.add(destFile.getPath()); 
s.add("rate 16000"); 
s.add("channels 1"); 

ArrayList<String> s = new ArrayList<String>(); 
s.add("sox/sox");    // command/process 

// everything after this is an argument 
s.add(srcFile.getPath()); 
s.add("-b 16"); 
s.add(destFile.getPath()); 
s.add("rate");     // notice how I had to split up the rate argument 
s.add("16000"); 
s.add("channels");    // same applies here 
s.add("1"); 

を私はそれがJavaの引数を送信し、またはソックスの引数を受け取る方法をどのように何かを持っているかもしれないと思います。

sox/sox test/test.wav -b 16 test/newtest.wav "rate 16000" "channels 1" 
関連する問題