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

  • MediaCodec getInputImage在某些设备上返回null
  • 如何从Android直播
  • 在android:4.3的MediaMuxer或ffmpeg中通过video添加水印位图
  • native_window_api_connect返回一个错误:无效参数(-22)
  • 不可能使用MediaMuxer混合audio文件和video文件?
  • 如何使用Android MediaCodec生成AAC ADTS基本流
  • 如何在没有MediaExtractor的情况下为H264使用MediaCodec
  • Adreno GPU上的编码器崩溃,同时从Surface进行编码
  • 不,Android相机不能保证稳定的帧率,特别是在30 FPS时。 例如,在低照明条件下可以select较长的曝光时间。

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

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

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

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