如何修复Android手机中相机的帧率

时间:2018-02-16 06:58:28

标签: android android-camera video-capture frame-rate android-camera2

我想修复Android中相机预览的帧速率,即20fps或30 fps。但是,我们发现帧速率不稳定。

在android文档中,据说帧速率在最小帧速率和getSupportedPreviewFpsRange中定义的最大帧速率之间波动。 https://developer.android.com/reference/android/hardware/Camera.Parameters.html#getSupportedPreviewFpsRange%28%29

我的问题是: 1)哪些因素会影响帧速率?曝光时间,白平衡,帧分辨率,后台CPU负载等? 2)是否有任何方法可以通过上述自定义因素来修复帧速率? 3)在我的项目中,更高的帧速率更好。如果帧速率最终不稳定。我可以提高最低帧率吗?或者确定最低帧速率? 4)看起来视频拍摄与预览模型有些不同,我可以修复Android中视频拍摄的帧率或最低帧率吗?

最后,我们发现IOS可以使用videoMinFrameDuration来修复帧速率 videoMaxFrameDuration。

感谢。

2 个答案:

答案 0 :(得分:1)

首先,请注意您提出的相机API已超过3年前弃用。新的camera2 API可以更好地控制捕获的各个方面,包括帧速率。

特别是,如果您的目标是流畅的视频录制。实际上,MediaRecorder在较旧的设备上执行其工作,但我知道,如果由于某种原因您无法使用MediaRecorder,这些知识几乎没有实际价值。

通常,支持的FPS范围列表包括固定范围,例如30 fps,完全用于视频录制。请注意,您需要选择compliant (recommended)预览(视频)分辨率。

两个主要因素导致声明范围内的帧速率变化:曝光调整和焦点调整。要获得统一的速率,您应该禁用自动对焦。如果你的相机supports exposure control,你也应该锁定它。不要使用异国情调的场景"和"效果"。 SCENE_MODE_BARCODE和EFFECT_MONO似乎不会导致帧速率问题。 Whitebalance也行。

存在导致帧率波动的其他因素完全在您的控制之下。

  1. 确保您的相机回调不会干扰,并且不会被主(UI)线程延迟。为此,you must open the camera on a secondary HandlerThread。新的camera2 API使相机回调的线程管理更容易。

  2. 不要使用setPreviewCallback(),它会自动为每个帧分配像素缓冲区。这对垃圾收集器来说是一个很大的负担,垃圾收集器可能会暂时锁定所有线程以进行大规模清理。相反,使用setPreviewCallbackWithBuffer()并预先分配足够的像素缓冲区以使其始终处于忙碌状态。

  3. 不要在onPreviewFrame()回调的上下文中执行繁重的计算。将所有工作传递给另一个线程。尽可能早地释放像素缓冲区。

答案 1 :(得分:0)

即使对于旧的相机API,如果设备列出支持的FPS范围(30,30),那么您应该能够选择此范围并获得一致的固定视频录制。

不幸的是,一旦场景条件变得太暗,一些设备会忽略您的帧速率请求,并且会增加曝光时间超过1/30秒。对于许多应用来说,这是更好的选择,但是这样的应用应该只是选择更宽的帧速率范围,如(15,30)。