Java InputStream - 如果未使用读取数据,程序将停止

时间:2015-04-15 21:52:04

标签: java inputstream ram

我正在处理视频中的帧,但我想在实际处理字节之前丢弃前X帧。但是当我这样做时,我的程序在读取特定数量的数据后暂停(1 GB带4GB RAM,2 GB带8GB RAM)。

如您所见,我没有保存此数据,因此我的程序使用的数据不超过20 MB。另一个有趣的事情是,当我实际对每一帧进行处理时,我不会得到这个错误。

import java.io.InputStream;
import java.io.IOException;

class Test{

    public static void main(String args[]) throws IOException{

        String command = "ffmpeg -i test.mp4 -f rawvideo -pix_fmt rgb24 -vf scale=1600:900 -";
        Process process = Runtime.getRuntime().exec(command);
        InputStream stdout = process.getInputStream();

        byte packet[] = new byte[65536];
        long totalRead = 0;
        long byteStart = 1600*900*3*2000; //discard 2000 frames before start processing
        int nRead; //number of bytes read on each packet

        while((nRead = stdout.read(packet)) > -1){
            totalRead += (long)nRead;
            if(totalRead > byteStart){
                //write frames to memory
            }
            System.out.print(totalRead+"\r");
        }

    }
}

1 个答案:

答案 0 :(得分:0)

正如Kenster链接所说的那样(Runtime Exec stop unexpectedly),我没有从我在代码中调用的进程处理getErrorStream()。

使用此页面上的第一个示例解决了我的问题。(http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html?page=2

我刚刚将StreamGobbler类添加到我的代码中,并在初始化过程后使用它:

StreamGobbler errorGobbler = new 
    StreamGobbler(process.getErrorStream(), "ERROR");
errorGobbler.start();