Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ffmpeg进程表示出错_Java_Process_Runtime - Fatal编程技术网

Java ffmpeg进程表示出错

Java ffmpeg进程表示出错,java,process,runtime,Java,Process,Runtime,我正在使用FFMPEG转换音频文件。我调用命令行,然后从Java调用FFMPEG。我使用Runtime和Process Runtime.exec()来实现这一点。对于这个过程,我有一个InputStream和一个ErrorStream。出于某种原因,即使FFMPEG命令工作正常,它也会从错误流中打印出来,给人以失败的印象。有人知道为什么会这样吗?显然,这不是一个主要问题,因为它确实工作正常,但如果由于某种原因它确实出错,或者项目新手没有意识到它是如何工作的,那么可能会让人困惑。 有什么想法吗?

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

您正在体验的是所有*NIX工具的标准实践:它们将“业务价值”数据发送到
stdout
,并将任何诊断输出分别发送到
stderr
。这是以“小即美”范式编写的工具的一个重要标志,该范式非常重视将一个工具的输出输送到下一个工具的输入的概念,从而创建一个特殊的信息处理链。如果工具向
stdout
发送“处理…完成50%”类输出,则整个方案将崩溃


请随意忽略
stderr
上的此类输出,但请确保您像现在这样使用它,以避免因输出缓冲区过满而阻塞。

您没有与我们共享
stderr
输出的具体原因是什么?只是来自FFMPEG的输出说它正在转换文件,以及文件的各种设置。我不认为这有什么关系。但是你认为不说发生了什么事你能得到什么帮助?当然有关系,谢谢。将来我也会发布输出!