目前,我的基本工作流程是使用FFmpegFrameGrabber
从一个视频中提取帧,使用FFmpegFrameFilter
对其进行过滤,然后将其记录在FFmpegFrameRecorder
中,如下所示:
framesLen = vCap.getLengthInFrames();
try {
Frame f;
for(int i = 0; i < framesLen; i++) {
f = vCap.grab();
if(f != null) {
vFilter.push(f);
Frame filtered;// = vFilter.pull();
vRec.setFrameNumber(i);
while((filtered = vFilter.pull()) != null) {
Log.i("ffmpeg_recorder", "processing frame "+i +" "+f+" "+filtered);
vRec.record(filtered);
}
i++;
}
}
} catch (FFmpegFrameGrabber.Exception e) {
exception = e;
} catch (FFmpegFrameRecorder.Exception e) {
exception = e;
} catch (FFmpegFrameFilter.Exception e) {
exception = e;
}
try {
vCap.flush();
vCap.release();
vRec.stop();
vRec.release();
} catch (FFmpegFrameGrabber.Exception e) {
exception = e;
} catch (FFmpegFrameRecorder.Exception e) {
exception = e;
}
if (exception != null) {
Log.e("ffmpeg_exception", exception.getMessage()+"");
return null;
} else {
return outFile+"";
}
我当前的问题是,有时FFmpegFrameFilter.pull()
会在该循环中返回null,最后以vRec
记录一个空帧,导致最终视频在同一帧中停留几秒钟。 / p>
当FFmpegFrameFilter
返回null时,pull()
中发生了什么?当我尝试pull()
尚未完成当前帧的处理时会发生这种情况吗?如果是这样,我是否应该像这样放置一个空的while
循环?
...
while((filtered = vFilter.pull()) == null) {/*block until it's NOT null*/}
vRec.record(filtered);
...
编辑:
好的,我上面提出的解决方案不起作用-它进入了无限循环。虽然我真的不想跳过那些帧。