我正在使用 FFMPEG 来转换音频文件。我从Java调用命令行,然后调用 FFMPEG 。我使用Runtime和Process Runtime.exec()来完成此操作。对于这个过程,我有一个 InputStream和一个ErrorStream 。出于某种原因,即使FFMPEG命令工作正常,它也会从错误流中打印出来,给出它已经失败的印象。任何人都知道为什么会发生这种情况?显然它不是一个主要问题,因为它确实可以正常工作,但如果由于某种原因它确实出错了,或者项目的新人没有意识到这是它的工作方式,那可能会令人困惑。 有任何想法吗? 以下是相关代码:
Runtime rt = Runtime.getRuntime();
System.out.println("Execing " + cmd);
Process proc = rt.exec(cmd);
StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream(), "ERROR");
// any output?
StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream(), "OUTPUT");
// kick them off
errorGobbler.start();
outputGobbler.start();
// any error???
int exitVal = proc.waitFor();
System.out.println("ExitValue: " + exitVal);
StreamGobbler类:
class StreamGobbler extends Thread {
InputStream is;
String type;
StreamGobbler(InputStream is, String type) {
this.is = is;
this.type = type;
}
public void run() {
try {
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null)
System.out.println(type + ">" + line);
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
答案 0 :(得分:0)
您遇到的是所有* NIX工具的标准做法:他们将“业务价值”数据发送到stdout
,并将任何诊断输出分别发送到stderr
。这是用“小而美”的范例编写的工具的一个重要标志,它极大地将管道一个工具的输出概念重视为下一个输入,从而创建了一个特殊的信息处理链。如果工具将“处理... 50%完成”类型的输出发送到stdout
,则完整的方案将会中断。
可以在stderr
上忽略此类输出,但请确保使用,就像现在一样,以避免因输出缓冲过多而导致阻塞。