0

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();
    }
}
4

1 に答える 1

0

あなたが経験しているのは、すべての *NIX ツールの標準的な方法です。「ビジネス価値」データを にstdout送信し、診断出力を に個別に送信しますstderr。これは、「小さいことは美しい」パラダイムで記述されたツールの重要な特徴であり、あるツールの出力を次のツールの入力にパイプするという概念を非常に重視し、それによって情報処理のアドホック チェーンを作成します。ツールが "Processing... 50% done" のような出力を に送信した場合、完全なスキームは崩壊しますstdout

でそのような出力を無視してもかまいませんが、出力バッファがいっぱいになることによるブロックを避けるために、現在行っているstderrように必ず消費してください。

于 2013-07-01T12:12:08.760 に答える