簡體   English   中英

使用Java的ProcessBuilder運行SoX

[英]Using Java's ProcessBuilder to run SoX

我正在使用ProcessBuilder從Java運行SoX來修剪wav文件。 我確定我應該能夠運行SoX,因為在其他JUnit測試中,我設法成功運行了以下命令:

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

但是當我嘗試修剪文件時,如下所示:

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

它會引發IOException ,錯誤為: error=2, No such file or directory 我嘗試在終端上運行命令,並且該命令沒有問題。 如果重要的話,我在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。

我自己找到了答案,並在bramp的評論中提供了很多幫助。 首先使用“字符串列表”,然后分隔需要空格的非破折號前綴參數(例如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/sox test/test.wav -b 16 test/newtest.wav "rate 16000" "channels 1"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM