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

时间:2015-05-25 19:47:37

标签: android android-camera surfaceview

我有一个扩展CameraView的内部SurfaceView

surfaceChanged()函数内部,我使用以下代码设置Camera参数:

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失败               在android.hardware.Camera.native_setParameters(Native方法)               在android.hardware.Camera.setParameters(Camera.java:1876)

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

编辑1

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

2 个答案:

答案 0 :(得分:1)

我担心你不能强制摄像机硬件的fps值(至少不能在4000到60000之间的任何值。

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

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

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

答案 1 :(得分:1)

显然,如果你将fps设置为第二个不同的调用(所以getParameters然后只设置fps并将params分配给摄像机)它可以工作。不知道为什么,但至少解决了这个问题......