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进程内存至少14mb)?有没有办法解锁这种情况(清理内存,使用文件作为桥梁以防止锁定)?

当然,我需要一点“实时”,而不是“后期处理”。我不受限于使用 ffmpeg,如有必要,我可以更改它。

4

1 回答 1

3

在阅读了这篇文章后,我自己找到了解决方案:问题是errorStream已满,必须阅读它才能让process继续工作,所以我插入了一个Thread消耗errorStream:

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 回答