Android Camera onPreviewFrame帧率不一致

xia*_*woo 8 android android-camera mediacodec

我正在尝试通过Camera的PreviewCall返回(onPreviewFrame)使用MediaCodec对每秒30帧的视频进行编码.我编码的视频总是播放得非常快(这是不可取的).所以,我试图通过设置一个int frameCount变量来检查进入我相机预览的帧数,以记住它的计数.我期待的是每秒30帧,因为我将相机的预览设置为30 fps预览(如下所示).我回来的结果是不一样的.我调用onPreviewFrame回调10秒钟,我得到的帧数量只有大约100帧.这很糟糕,因为我期待300帧.我的相机参数设置正确吗?这是Android的Camera预览回拨的限制吗?如果这是对Android相机预览回调的限制,那么还有其他相机回调能够以每秒30帧的速度返回相机的图像数据(nv21,yuv,yv12)吗?

感谢您阅读并花时间去帮忙.我将不胜感激任何评论和意见.

以下是使用Camera的onPreviewFrame编码视频的示例:

http://www.youtube.com/watch?v=I1Eg2bvrHLM&feature=youtu.be

                Camera.Parameters parameters = mCamera.getParameters();
                parameters.setPreviewFormat(ImageFormat.NV21);
                parameters.setPictureSize(previewWidth,previewHeight);
                parameters.setPreviewSize(previewWidth, previewHeight);
//              parameters.setPreviewFpsRange(30000,30000);

                parameters.setPreviewFrameRate(30);
                mCamera.setParameters(parameters);

                mCamera.setPreviewCallback(previewCallback);
                mCamera.setPreviewDisplay(holder);
Run Code Online (Sandbox Code Playgroud)

Ale*_*ohn 16

不,Android相机不能保证稳定的帧速率,特别是在30 FPS时.例如,它可以选择在低光照条件下更长时间曝光.

但是,我们应用程序开发人员可以通过某些方式使事情变得更糟.

首先,通过使用setPreviewCallback()而不是setPreviewCallbackWithBuffer().这可能会对垃圾收集器造成不必要的压力.

其次,如果onPreviewFrame()到达主(UI)线程,则会导致任何UI动作直接延迟相机帧到达.要保持onPreviewFrame()单独的线程,您应该open()将相机放在辅助Looper线程上.在这里,我详细解释了如何实现这一点:最好使用HandlerThread而不是其他类似的类.

第三,检查处理时间是否小于20ms.