java - 捕获时 ffmpeg 管道阻塞

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

最佳答案

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

关于java - 捕获时 ffmpeg 管道阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17271044/

相关文章:

Java - 将类作为参数传递以进行比较

java - 属性测试器在第二个编辑器页面上不起作用

php - 排队直播视频

video - 将帧插入 FFmpeg 缓冲区

c - 卡在等待输入上的并行流程场景实现

Java读取txt文件到hashmap,按 ":"分割

java - 应该为 Java Persistence API (JPA) 实现使用哪个提供程序

go - 在 Golang exec 中使用管道运行命令

java - 在 Java 和 Windows 上的 C++ 之间发送数据?

Python 一行打印当前目录中的每个文件