我正在处理视频中的帧,但我想在实际处理字节之前丢弃前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");
}
}
}
答案 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();