Android 设备在设置 FPS 时崩溃,而它在 getSupportedPreviewFpsRange 范围内

标签 android android-camera surfaceview

我有一个扩展 SurfaceView 的内部类 CameraView

surfaceChanged() 函数中,我使用以下代码设置相机参数:

Camera.Parameters camParams = mCamera.getParameters();
List<Camera.Size> sizes = camParams.getSupportedPreviewSizes();
// Sort the list in ascending order
Collections.sort(sizes, new Comparator<Camera.Size>() {

    public int compare(final Camera.Size a, final Camera.Size b) {
        return a.width * a.height - b.width * b.height;
    }
});

for (int i = 0; i < sizes.size(); i++) {
    if ((sizes.get(i).width >= imageWidth && sizes.get(i).height >= imageHeight) || i == sizes.size() - 1) {
        imageWidth = sizes.get(i).width;
        imageHeight = sizes.get(i).height;
        Log.e(LOG_TAG, "Resolution: " + imageWidth + " x " + imageHeight);
        break;
    }
}
camParams.setPreviewSize(imageWidth, imageHeight);

for(int[] arr : camParams.getSupportedPreviewFpsRange ()){
    Log.e(LOG_TAG, "Supported range: " + arr[0] + " - " + arr[1]);
}

camParams.setPreviewFrameRate(frameRate);
mCamera.setParameters(camParams);

这里的 for 循环打印出以下范围:Supported range: 4000 - 60000,这意味着我的设备应该支持 4 到 60 fps。

现在,当我设置 frameRate = 45(在范围内)时,我的应用程序崩溃并出现以下异常:

java.lang.RuntimeException: setParameters failed at android.hardware.Camera.native_setParameters(Native Method) at android.hardware.Camera.setParameters(Camera.java:1876)

如果 frameRate = 30,则不会发生这种情况。有人可以解释为什么我的应用程序崩溃了吗?难道getSupportedPreviewFpsRange()不可信吗?

编辑 1

我现在也尝试了 camParams.setPreviewFpsRange(frameRate*1000, frameRate*1000);,同样的崩溃结果。

最佳答案

恐怕您不能强制相机硬件的 fps 值(至少不能使用 4000 到 60000 之间的任何值。

查看 documentation ,该方法自 api 级别 9 起已弃用。

按照他们的建议,您需要使用 setPreviewFpsRange替换为 camParams.getSupportedPreviewFpsRange 返回的确切范围。

您可以使用 this问题也作为引用。

关于Android 设备在设置 FPS 时崩溃,而它在 getSupportedPreviewFpsRange 范围内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30445098/

相关文章:

java - 大长数字除以舍入

android - 将NV21字节数组转换为位图可读格式

android - 如何使用 CameraX 拍摄多张图像?

android - 打开 Galaxy Nexus 手电筒

Android:SurfaceView 正在阻止抽屉导航

android - 将 SurfaceView 表面从 Canvas 切换到 OpenGL 后的 EGL_BAD_ALLOC

android - 模拟器不加载

android - 允许两台设备使用 wifi 接口(interface)在 Android 上相互查看?

android - 如何制作圆形的表面 View

java - Android 轻量级 HTML 模板引擎