CrazyOrr / FFmpegRecorder

An Android video recorder using JavaCV and FFmpeg.
201 stars 48 forks source link

About OOM #17

Open LoginGit opened 7 years ago

LoginGit commented 7 years ago

Hi,Thanks for your help, I encountered a new problem in your demo, I recorded the time to reach 20 seconds after the emergence of OOM,Look forward to your reply.

image

CrazyOrr commented 7 years ago

Similar to #15

LoginGit commented 7 years ago

恩,这个是不是属于javacv的问题,因为一直在push?

CrazyOrr commented 7 years ago

不是javacv的问题,是preview的帧不能及时地被record导致帧队列越来越长,最后OOM。 解决办法在这里

LoginGit commented 7 years ago

恩,谢谢你的回复,“but frames may get dropped when a queue is full”,以前的OOM换成了队列限制,然后可能掉帧解决这个问题,我的理解就是当情况符合之前版本的OOM情况的时候,录制的视频就掉帧了。对吗? 我有一个疑问,这部分代码: image push进去之后的作用就是反交错对吗?当我去掉这部分代码内存走向就很平稳,去掉之后视频不正常,音视频不同步,但是视频的数据都是有的,也就是说是这个类导致了OOM,那么我们的反交错是否还有别的类呢,当然我就是说说,谢谢你的分享代码,我在看看吧,新春快乐,提前给您拜年了。

LoginGit commented 7 years ago

我试了您新传的代码,拟录制3分钟视频尝试一下,报了以下错误: image 这个问题是因为啥呢?

LoginGit commented 7 years ago

进来后换摄像头录制报如下错误: image

LoginGit commented 7 years ago

我又出一个错,我完全没改您的代码: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x670065 in tid 6032 (Thread-362) 这个是后摄像头报的错

LoginGit commented 7 years ago

换后摄像头必奔溃,在三星S6上,小米4,三星S4上。

CrazyOrr commented 7 years ago

新春快乐 没错,掉帧是保证不OOM的代价,不过正常情况下record的速度会快于preview的速度,掉帧应该只是短时间里的情况。 frameFilter没有进行反交错的处理。FFmpegFrameFilter是对FFmpeg Filters的封装,Demo里用到了其中的transpose(翻转),crop(裁切),scale(缩放),用于将输出视频调整到videoWidth*videoHeight的尺寸。 你可以将下面这段代码

Frame filteredFrame = null;
try {
    frameFilter.push(recordedFrame.getFrame());
    filteredFrame = frameFilter.pull();
} catch (FrameFilter.Exception e) {
    e.printStackTrace();
}

注释掉,再把

mFrameRecorder.record(filteredFrame, avutil.AV_PIX_FMT_NV21);

修改为

mFrameRecorder.record(recordedFrame.getFrame());

就可以看到未经FFmpegFrameFilter处理过的视频了。

最后的几个新问题等我看一下再回复你。

LoginGit commented 7 years ago

您那边有这些问题吗?

CrazyOrr commented 7 years ago

我在Nexus 6, Note 2 上试了,暂时无法复现这些问题。 从log看,很可能是javacv的问题。建议你把crash后的tombstone文件取出来(设备需root),然后提交issue到javacv