Android MediaCodec和摄像头:如何实现更高的帧速率从相机获取帧原始数据?

时间:2014-03-25 15:36:22

标签: android android-camera mediacodec

bigflake.com中CameraToMpegTest.java的示例,或者"显示+捕捉相机"在Grafika中,使用camera.preview获取帧数据。实验表明(Nexus 4,Android 4.4.2)的帧率为10 fps。这没有预期的那么高。

如果我们使用相同的设备(Nexus 4,Android 4.4.2)使用相机录制视频,则帧速率为30fps。

所以我假设使用camera.preview的较低帧率位于方法(预览方法)中。我曾经读过一篇帖子,说相机预览方法的帧速率较低。

所以似乎解决方法是直接使用来自相机硬件的原始帧数据。 怎么做? 我有一个印象iOS有视频处理API来做到这一点,直接从相机获取帧原始数据。 (但我不知道他们的帧率是多少)。

1 个答案:

答案 0 :(得分:12)

摄像头API有两个不同的参数用于控制帧速率:setPreviewFrameRate,它取单个帧速率值并且不推荐使用; setPreviewFpsRange,它取一系列FPS值,并且目前推荐的控制。

单FPS设置控制不充分的原因是,有时您希望相机在黑暗条件下降低其帧速率以使取景器保持明亮(静态相机取景器就是这种情况),有时您想要相机保持稳定的30fps,无论如何(视频录制时)。单个值无法捕获您喜欢的值。

因此,理想的解决方案是调用getSupportedPreviewFpsRange以获取相机支持的有效FPS范围列表,并选择最适合您用例的列表。如果你正在寻找稳定的30fps操作,你需要(30,30)作为范围。

不幸的是,支持的FPS范围的集合没有经过良好测试,并且不能保证(30,30)在列表中。在这种情况下,另一种方法是尝试使用参数为30的已弃用的单FPS控件,并打开recording hint parameter。此参数告诉摄像机设备您正在进行类似记录的操作,可能将其切换为在30处执行稳定的帧速率。不幸的是,这不是保证,因为它只是一个提示。

简而言之,要获得稳定的30fps操作:

  1. 查询getSupportedPreviewFpsRange
  2. 如果列出(30,30),请使用setPreviewFpsRange(30,30)。这应该足以保证稳定的帧速率。
  3. 如果没有,请查询getSupportedPreviewFrameRates(此处应始终列出30,但最好仔细检查)
  4. 使用setPreviewFrameRate(30)和setRecordingHint(true)。这最大化了看到30fps操作的可能性。但不幸的是,有些设备可能仍然无法满足您的需求。
  5. 展望未来,我们希望增加一项要求(30,30)始终列为支持范围,以简化此操作并保证稳态运行。