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

bigflake.com中的CameraToMpegTest. java或Grafika中的“Show capture camera”的示例使用camera.preview来获取帧数据.实验表明(Nexus 4,Android 4.4.2)的帧率为10 fps.这没有预期的那么高.

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

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

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

解决方法

摄像机API有两个不同的参数用于控制帧速率: setPreviewFrameRate,它采用单帧速率值并且不推荐使用,setPreviewFpsRange采用一系列FPS值,是当前推荐的控制.

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

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

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

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

>查询getSupportedPreviewFpsRange
>如果列出(30,30),请使用setPreviewFpsRange(30,30).这应该足以保证稳定的帧速率.
>如果没有,请查询getSupportedPreviewFrameRates(此处应始终列出30,但最好仔细检查)
>使用setPreviewFrameRate(30)和setRecordingHint(true).这最大化了看到30fps操作的可能性.但不幸的是,有些设备可能仍然无法满足您的需求.

展望未来,我们希望增加一个要求(30,30)始终列为支持范围,以简化此操作并保证稳态运行.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...