如何保持 Android Camera 的帧速率恒定

Posted

技术标签:

【中文标题】如何保持 Android Camera 的帧速率恒定【英文标题】:How can I keep the frame rate of Android Camera constant 【发布时间】:2021-12-23 00:38:07 【问题描述】:

我一直在做一个项目,通过一个光发射器(LED 屏幕)传输数据,该光发射器显示带有编码信息的视频和一个光电探测器阵列作为接收器,在这种情况下,一个 android 相机由一个很多光电二极管。

要成功执行数据传输,帧视频的显示速率和相机的捕获速率(即帧速率)之间的同步必须接近完美。

所以,我开发了一个代码,它可以更改和修复 Android 相机帧速率,还可以做其他事情。实现Camera参数修改的部分如下:

private boolean prepareVideoRecorder()
    mCamera = getCameraInstance();
    mediaRecorder = new MediaRecorder();

    Camera.Parameters parameters = mCamera.getParameters();
    parameters.setPreviewFpsRange(15000,15000);
    parameters.setVideoStabilization(true);
    parameters.setAutoExposureLock(true);
    parameters.setAutoWhiteBalanceLock(true);
    parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_FIXED);
    mCamera.setParameters(parameters);


    mCamera.unlock();
    mediaRecorder.setCamera(mCamera);

    
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);        
    mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);

    mediaRecorder.setVideoSize(1280,720);
    mediaRecorder.setVideoFrameRate(15);
    mediaRecorder.setMaxDuration(25000);

    mediaRecorder.setOutputFile(getOutputMediaFile().toString());

    mediaRecorder.setPreviewDisplay(cameraPreview.getHolder().getSurface());

  

但即使这样做,同步似乎也不是很好,特别是因为 Android 相机帧速率不是恒定的。我使用了已弃用的 Camera1 API。那么,有谁知道我怎样才能保持 Android Camera 帧速率恒定?

也许使用 Camera2 是一种选择,但我不知道我应该如何开始。

从现在开始,感谢您的帮助!

【问题讨论】:

【参考方案1】:

您是否确认您使用的设备支持该相机帧速率范围?不保证只支持任何帧速率对,https://developer.android.com/reference/android/hardware/Camera.Parameters#getSupportedPreviewFpsRange() 有一个列表,告诉您任何特定相机设备支持什么。

通常,您可以依赖[30,30] 可用,但其他固定帧速率可能不可用。

有一些 Android 相机实现将预览 FPS 范围视为提示而不是要求,尽管这违反了 API 规范。但是,如果您通过 setPreviewFpsRange 要求固定费率,最新的设备会按照提示执行操作。

在这里使用 Camera2 没有帮助,因为同一组受支持的帧速率也适用于来自 camera2 的相同相机设备。

【讨论】:

嘿!感谢您的回答。我使用的设备是联想的 Moto G7 play。根据我的检查,这款智能手机支持 15 和 30 的帧速率值。我想我会尝试使用 30 fps,因为它是它的原生 fps。我意识到的另一个问题是我的相机的快门速度、ISO 和曝光设置会影响我尝试实现的系统。我会尝试改进这些参数,以尽可能获得最佳和稳定的 fps。 当你说 15 时,你的意思是 getSupportedPreviewFpsRange 返回 [15,15] 吗?如果是这样,那么它应该可以按您的预期工作。也就是说,旧的相机 API 并没有对快门速度或 ISO 进行任何控制,因此如果您想自己控制这些,可能需要移至 camera2。 我猜是的。基本上,对于我的项目作品,相机必须以恒定的帧速率进行记录,并且有一些(或在理想世界中没有)丢帧。这就是 getSupportedPreviewFPsRange 返回 [15,15] 的意思吗?关于其他参数,相信不用改,默认就行了。我唯一要更改的是分辨率。

以上是关于如何保持 Android Camera 的帧速率恒定的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Android CameraX ImageAnalysis 提高帧速率?

如何优化Camera1 SurfaceView FrameRate

openGL 中的帧速率和绘制流程

浏览器如何计算 HTML5 <video> 的帧速率 (fps) 以实现准确的帧搜索?

基于从两个不同线程获取的时间戳匹配图像

OpenCV 不报告准确的帧速率/计数