Android Camera提升帧率的方法

最近在做项目的时候,需要将Android camera的帧率尽可能提升到30帧/s,测试的过程发现一些特别的情况,camera api 1和camera api2,在不同手机平台上的表现还不相同。

Camera api 1

camera api1主要有以下两种提升帧率的方法:

通过Camera.Parameters进行设置,主要有以下方法

setPreviewFpsRange(或setPreviewFrameRate)

Camera.Parameters parameters = camera.getParameters();

···

List<int[]> fpsList = parameters.getSupportedPreviewFpsRange();

if(fpsList != null && fpsList.size() > 0) {

    int[] maxFps = fpsList.get(0);

    for (int[] fps: fpsList) {

        if(maxFps[0] * maxFps[1] < fps[0] * fps[1]) {

            maxFps = fps;

        }

    }

    //注意setPreviewFpsRange的输入参数是帧率*1000,如30帧/s则参数为30*1000

    parameters.setPreviewFpsRange(maxFps[0] , maxFps[1]);

    //setPreviewFrameRate的参数是实际的帧率

    //parameters.setPreviewFrameRate(MAX_FPS);

}

测试发现,不进行任何帧率相关设置的时候,960P以上的分辨率已经会导致输出帧率降低,最低的时候仅有10帧/s,480P的输出帧率还是接近30帧/s。这种情况下, 如果想要达到更大的帧率,例如960P的时候需要将帧率提高至30帧/s,采用setPreviewFpsRange(或setPreviewFrameRate)的方法已经不起作用了,这种方法只能起到限制帧率的效果,如果需要将帧率提到最大,需要采用以下方法

setRecordingHint

Camera.Parameters parameters = camera.getParameters();

···

parameters.setRecordingHint(true);

官方文档对该api的注释如下:

Sets recording mode hint. This tells the camera that the intent of the application is to record videos MediaRecorder.start(), not to take still pictures Camera.takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback). Using this hint can allow MediaRecorder.start() to start faster or with fewer glitches on output. This should be called before starting preview for the best result, but can be changed while the preview is active. The default value is false. The app can still call takePicture() when the hint is true or call MediaRecorder.start() when the hint is false. But the performance may be worse.

大致的意思就是让相机一直运行在视频采集的状态下,由于视频采集的时候一般需要高帧率才能保证数据的完整,所以该状态下的输出帧率会保持在能达到的最大帧率

Camera api 2

使用Camera api 2之前要注意,查看下设备对于Camera api的支持级别

characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);

//CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY = 2

//CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_3 = 3

//CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED = 0

//CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL = 1

//LEGACY < LIMITED < FULL < LEVEL_3

具体关于支持级别的内容可以查看官方文档。但是根据网上查找的资料以及现有设备的测试,发现市面上很多品牌的手机对于camera api 2的支持都是低级别的,也就是上述的LEGACY,这种情况下使用camera api 2的相机效果有可能还不如camera api 1的,所以使用的时候得考虑到这些情况。

设置帧率

Range<Integer>[] fpsRange = characteristics.get(

    CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);

    if(fpsRange != null && fpsRange.length > 0) {

    Range<Integer> maxFps = fpsRange[0];

    for (Range<Integer> aFpsRange : fpsRange) {

        if (maxFps.getLower() * maxFps.getUpper() < aFpsRange.getLower() * aFpsRange.getUpper()) {

            maxFps = aFpsRange;

        }

    }

    mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, maxFps);

}

在使用上述帧率设置之后,发现在不同的手机平台上的表现效果还不一致。手头上一台高通自研的测试手机能达到近乎30帧/s,自己的红米Note 5只有十几帧,另一台测试用的华为手机则有二十几帧,后两台手机的支持级别都为LEGACY。并不清楚具体的原因。

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果你要在使用 Camera API 的 Android 应用中固定摄像头的帧率,可以使用 Camera.Parameters.setPreviewFpsRange() 方法来设置帧率范围。具体来说,你可以先获取 Camera 对象,然后通过 Camera.getParameters() 方法获取 Camera.Parameters 对象,最后使用 Camera.Parameters.setPreviewFpsRange() 方法来设置帧率范围。设置完成后,你可以使用 Camera.setParameters() 方法将参数应用到摄像头上。 下面是一个简单的示例代码,演示如何使用 Camera API 来设置摄像头的帧率范围: ``` // 获取 Camera 对象,选择一个摄像头进行操作 Camera camera = Camera.open(); // 获取 Camera.Parameters 对象,设置摄像头参数 Camera.Parameters parameters = camera.getParameters(); parameters.setPreviewFpsRange(30000, 30000); // 设置帧率范围为 30 fps // 应用摄像头参数 camera.setParameters(parameters); // 开始摄像头预览 camera.setPreviewDisplay(surfaceHolder); camera.startPreview(); ``` 这个示例代码中,我们首先获取 Camera 对象,然后获取 Camera.Parameters 对象并设置帧率范围为 30 fps。接着,我们使用 Camera.setParameters() 方法将参数应用到摄像头上,并使用 Camera.setPreviewDisplay() 方法设置预览的 Surface。最后,我们使用 Camera.startPreview() 方法开始摄像头预览。 需要注意的是,Camera API 已经被废弃了,推荐使用 Camera2 API 来控制摄像头参数。 ### 回答2: 在照相机应用编程接口(Camera API)中,固定帧率是指在相机预览或采集过程中,设置相机以固定的帧率来捕捉图像或实时显示视频。相机的帧率是指相机每秒钟产生的图像帧数。 固定帧率对于相机应用程序非常重要,因为它可以提供稳定的帧率和流畅的图像流。相机传感器通常以固定的帧率捕捉图像,而将相机API配置为相同的帧率可以确保与传感器捕获的图像一致。 固定帧率可以提供一种优化和节省资源的方法。在某些情况下,较高的帧率可能会消耗更多的处理器和内存资源,而较低的帧率则可能导致图像延迟或卡顿。因此,根据应用程序的需求和设备的性能,选择适当的固定帧率是很重要的。 在Camera API中,可以使用setPreviewFpsRange()来设置相机的帧率范围。该方法允许我们指定希望的最小和最大帧率。然后,相机将会尽力在这个范围内提供最接近的帧率。这样,我们就可以固定帧率以适应我们的应用程序需求。 总之,固定相机API的帧率在相机应用程序中非常重要。它可以提供稳定、流畅的图像流,并根据应用程序需求和设备性能进行优化。通过使用setPreviewFpsRange()方法,我们可以轻松设置相机的帧率范围,从而实现固定帧率。 ### 回答3: Camera API 固定帧率是指在使用相机接口进行图像采集时,可以设置相机的帧率,使其在一定时间内采集固定数量的图像帧。相机的帧率是指相机每秒采集图像的次数,也被称为帧速率。 通过固定帧率,可以确保相机在一定时间内以常速采集图像,从而满足特定应用场景的需求。例如,在实时视频分析中,如果帧率过低,可能会导致丢失重要的动作或细节,而如果帧率过高,则可能消耗过多的系统资源,无法处理或传输所有的图像。 相机接口通常会提供设置帧率方法或参数,例如AndroidCamera API中可以使用`setPreviewFrameRate(int fps)`方法来设置预览帧率。在调用该方法时,可以指定所需的帧率参数,相机会根据设定的帧率进行图像采集。需要注意的是,实际帧率可能受到硬件限制或其他因素的影响,可能无法完全达到所设置的固定帧率。 固定帧率对于某些应用场景非常重要,例如实时视频监控、虚拟现实、增强现实等。在这些场景中,需要保证相机采集的图像流畅且准确,以提供良好的用户体验。因此,通过设置固定帧率,可以使相机在一定时间内以稳定的帧率进行图像采集,满足应用需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值