JavaCV-如何处理FFmpegFrameFilter.pull()返回null

时间:2018-06-20 10:13:42

标签: ffmpeg javacv

目前,我的基本工作流程是使用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);
...

编辑:

好的,我上面提出的解决方案不起作用-它进入了无限循环。虽然我真的不想跳过那些帧。

0 个答案:

没有答案