android - 如何修复Android手机相机的帧速率

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

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

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

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

最后,我们发现IOS可以使用videoMinFrameDuration和 视频最大帧持续时间。

谢谢。

最佳答案

首先,请注意,您询问的相机 API 已于 3 年多前被弃用。新的camera2 API提供了对捕捉的各个方面的更多控制,包括帧速率。

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

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

两个主要因素导致帧速率在声明的范围内变化:曝光调整和焦点调整。为了实现统一的速率,您应该禁用自动对焦。如果你的相机supports exposure control ,你也应该锁定它。避免使用异国情调的“场景”和“效果”。 SCENE_MODE_BARCODE 和 EFFECT_MONO 似乎不会导致帧速率问题。白平衡也不错。

还有其他因素会导致帧速率波动,这些因素完全在您的控制之下。

  1. 确保您的相机回调不会干扰主 (UI) 线程,也不会被主 (UI) 线程延迟。为了实现这一目标,you must open the camera on a secondary HandlerThread 。新的camera2 API使相机回调的线程管理变得更加容易。

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

  3. 不要在 onPreviewFrame() 回调的上下文中执行繁重的计算。将所有工作传递给不同的线程。尽最大努力尽早释放像素缓冲区。

关于android - 如何修复Android手机相机的帧速率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48821566/

相关文章:

android - 找到方向android的两个地理点之间的距离

android - Gradle 构建花费的时间太长

3d - Kinect的输出流格式

c++ - 如何同时使用两个CameraCaptureUI(UWP/C++)

android - 如何防止服务在完成工作之前被销毁

android - 如何在 Android 对话框中显示版权符号?

android - Camera.getParameters() 在 Galaxy Tab 上返回 null

android - Camera Intent 的结果代码 0

android相机surfaceview方向

UWP:如何录制屏幕并保存为mp4文件?