0

私はこのコードを持っています:

public InputStream getInputStream() throws Exception {
    try {
        process = Runtime.getRuntime().exec("ffmpeg -f dshow -i video=\"" + query + "\":audio=\"" + microPhoneName + "\" -r 25 -vcodec mpeg4 -acodec mp3 -f avi -");
        } 
        catch (Exception e) {
        }
    return process.getInputStream();
}

このコマンドを使用するinputStream.read(b)と、ほんの少しの時間 (使用するフォーマットとコーデックに応じて 180 ~ 400 回) しか機能せず、その後inputStreamロックがオンにreadなり、アプリケーションが動作しなくなります。

どうしたの?メモリ飽和 (ffmpeg プロセス メモリは少なくとも 14 MB)? この状況のロックを解除する方法はありますか (メモリをクリーンアップし、ファイルをブリッジとして使用してロックを防止します)。

もちろん、「後処理」ではなく「リアルタイム」が少し必要です。ffmpeg の使用に制約はありません。必要に応じて変更できます。

4

1 に答える 1

3

この記事errorStreamを読んだ後、私は自分で解決策を見つけprocessましThreaderrorStream

public InputStream getInputStream() throws Exception {
    try {
        process = Runtime.getRuntime().exec("ffmpeg -f dshow -i video=\"" + query + "\":audio=\"" + microPhoneName + "\" -r 25 -vcodec mjpeg -acodec mp3 -f " + getContentExtension() + " -");
        new Thread("Webcam Process ErrorStream Consumer") {
            public void run() {
                InputStream i = process.getErrorStream();
                try {
                    while (!isInterrupted()) {
                        i.read(new byte[bufferLength]);
                    }
                } catch (IOException e) {
                }
            }
        }.start();
    } catch (Exception e) {
    }
    return process.getInputStream();
}
于 2013-06-26T09:22:08.363 に答える