捕获时ffmpeg管道阻塞

时间:2013-06-24 08:28:46

标签: java ffmpeg pipe inputstream

我有这段代码:

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,如果需要我可以更改它。

1 个答案:

答案 0 :(得分:3)

在阅读this article之后,我自己找到了解决方案:问题是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();
}