ffmpeg进程说这是错误的

时间:2013-07-01 11:01:21

标签: java process runtime

我正在使用 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();
    }
}

1 个答案:

答案 0 :(得分:0)

您遇到的是所有* NIX工具的标准做法:他们将“业务价值”数据发送到stdout,并将任何诊断输出分别发送到stderr。这是用“小而美”的范例编写的工具的一个重要标志,它极大地将管道一个工具的输出概念重视为下一个输入,从而创建了一个特殊的信息处理链。如果工具将“处理... 50%完成”类型的输出发送到stdout,则完整的方案将会中断。

可以在stderr上忽略此类输出,但请确保使用,就像现在一样,以避免因输出缓冲过多而导致阻塞。