Android 设置 FPS 时设备在 getSupportedPreviewFpsRange 范围内崩溃
Android device crashes when setting FPS, while it is in range of getSupportedPreviewFpsRange
我有一个扩展 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问题作为参考。
显然,如果您在第二个不同的调用中设置 fps(因此 getParameters,然后仅设置 fps 并将参数分配给相机)它会起作用。不知道为什么,但至少解决了这个问题...
我有一个扩展 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问题作为参考。
显然,如果您在第二个不同的调用中设置 fps(因此 getParameters,然后仅设置 fps 并将参数分配给相机)它会起作用。不知道为什么,但至少解决了这个问题...