gpt4 book ai didi

java - SoX 使用 ProcessBuilder 运行缓慢

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:00:54 27 4
gpt4 key购买 nike

我在 Java 中使用 ProcessBuilder 运行 SoX,它将 WAV 文件修剪成 30 秒长的 WAV 文件。

SoX 正在运行,因为我可以成功修剪文件的前 30 秒并将其另存为新文件,但它会停在那里,但它仍在运行。

这是命令生成的代码:

command.add (soxCommand);
if (SoxWrapper.getMetadata (srcFile, MetadataField.SAMPLE_RATE) != 16000) {
command.add ("-V3");
command.add ("-G");
command.add (FilenameUtils.normalize (srcFile.getAbsolutePath ()));
command.add ("-b 16");
command.add (FilenameUtils.normalize (destFile.getAbsolutePath ()));
command.add ("channels");
command.add ("1");
command.add ("rate");
command.add ("16000");
command.add ("trim");
command.add (startTime.toString ());
command.add ('=' + endTime.toString ());
} else {
command.add ("-V3");
command.add (FilenameUtils.normalize (srcFile.getAbsolutePath ()));
command.add ("-b 16");
command.add (FilenameUtils.normalize (destFile.getAbsolutePath ()));
command.add ("trim");
command.add (startTime.toString ());
command.add ('=' + endTime.toString ());
}

这是创建进程的代码:

    private static Process createProcess (List<String> command) {

ProcessBuilder soxProcessBuilder = new ProcessBuilder (command);
soxProcessBuilder.redirectErrorStream (true);

Process soxProcess = null;
try {
soxProcess = soxProcessBuilder.start ();

int soxreturn = soxProcess.waitFor ();
soxLogger.info ("SoX returned: " + soxreturn);

} catch (IOException t) {
logger.error ("SoX Process failed", t);
} catch (InterruptedException e) {
logger.error ("Failed to wait for SoX to finish", e);
}

return soxProcess;
}

最佳答案

它被阻塞是因为它正在向 stdout 写入内容,缓冲区已满,因此进程正在等待缓冲区为它腾出空间,但您的程序没有读取它,因此缓冲区保持满状态。由于您将 stderr 重定向到 stdout,因此可能会出现某种错误并且您不知道它,因为您没有从流中读取。您需要从进程的 getInputStream 中读取,例如:

new Thread(new Runnable() {
@Override public void run() {
try {
org.apache.commons.io.IOUtils.copy(soxProcess.getInputStream(), System.out);
} catch (IOException e) {
e.printStackTrace(System.err);
}
}
}).start();

(在这里您需要将 soxProcess 设置为 final 以便内部类方法可以看到它。)

或者使用新的 JDK,您现在可以选择 having the processBuilder redirect the output to a file .

关于java - SoX 使用 ProcessBuilder 运行缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7025114/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com