Android相机上的预览帧率不一致

我试图通过相机的PreviewCall(onPreviewFrame)使用MediaCodec对每秒30帧的video进行编码。 我编码的video总是播放速度非常快(这是不希望的)。 所以,我试图通过设置一个int frameCountvariables来记住我的相机的预览帧数,以记住它的计数。 我期望的是每秒30帧,因为我设置我的相机的预览有30帧预览(如下所示)。 我得到的结果是不一样的。 我调用了onPreviewFramecallback10秒,我得到的frameCount的数量只有大约100帧。 这是不好的,因为我期待300帧。 我的相机参数设置是否正确? 这是Android的Camera预览callback的限制吗? 如果这是Android Camera预览callback的限制,那么是否还有其他相机callback,可以每秒30帧的速度返回相机的图像数据(nv21,yuv,yv12)?

感谢您的阅读,并花时间来帮忙。 我将不胜感激任何意见和意见。

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

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); 

Solutions Collecting From Web of "Android相机上的预览帧率不一致"

不,Android相机不能保证稳定的帧率,特别是在30 FPS时。 例如,在低照明条件下可以select较长的曝光时间。

但是,我们应用程序开发人员可能会使事情变得更糟。

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

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

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