2011-08-03 2 views
0

ProcessBuilder를 사용하여 Java에서 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 테스트의 원인, 내가 성공적으로 다음 명령을 실행하는 관리 삭스를 실행할 수 있어야 확신
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 directory과 함께 IOException이 표시됩니다. 터미널에서 명령을 실행하려고 시도했지만 문제없이 작동했습니다. 중요하다면, 나는 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"); 

나는 그것이 자바 인수 보내거나하는 방법 삭스가 인수를 수신하는 방법을 함께 할 수있는 뭔가가있을 수 있습니다 생각합니다. 다음 명령을 사용하여 터미널에서 문제를 재현 할 수있었습니다.

sox/sox test/test.wav -b 16 test/newtest.wav "rate 16000" "channels 1" 
관련 문제