使用一些使用相机的 apk(例如,zxing、opencv)会发生这种情况。它在预览中显示有故障的图像,但它仍然是相机所见的功能,因此它似乎是编码不匹配。本机相机预览工作正常,因此内部应用程序不会出现此问题。
6 回答
现在,请尝试在您获取之后Camera
但在设置和开始预览之前添加以下解决方法:
Camera.Parameters params = camera.getParameters();
params.setPreviewFpsRange(30000, 30000);
camera.setParameters(params);
setPreviewFpsRange
(或者,如果您还要设置其他参数,则只需将调用添加到现有参数。)
对于在 Glass 上使用 ZXing 的任何人,您都可以使用上述修复从源代码构建一个版本。
将以下方法添加到 CameraConfigurationManager.java
public void googleGlassXE10WorkAround(Camera mCamera) {
Camera.Parameters params = mCamera.getParameters();
params.setPreviewFpsRange(30000, 30000);
params.setPreviewSize(640,360);
mCamera.setParameters(params);
}
在 ZXing 代码中看到 Camera.setParameters() 后立即调用此方法。我只是把它放在 CameraConfigurationManager 的两个地方,它就起作用了。
我将预览尺寸设置为 640x360 以匹配 Glass 分辨率。
30 FPS 预览相当高。如果您想节省一些电池和 CPU,请考虑支持的最慢 FPS 就足够了:
List<int[]> supportedPreviewFpsRanges = parameters.getSupportedPreviewFpsRange();
int[] minimumPreviewFpsRange = supportedPreviewFpsRanges.get(0);
parameters.setPreviewFpsRange(minimumPreviewFpsRange[0], minimumPreviewFpsRange[1]);
该错误在 XE16 和 XE16.11 中仍然存在,但此代码克服了故障并显示了正常的相机预览,请注意三个参数设置行及其值。我还在 5000 (5FPS) 下测试过它,它可以工作,在 60000 (60FPS) 下它不工作:
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
if (mCamera == null) return;
Camera.Parameters camParameters = mCamera.getParameters();
camParameters.setPreviewFpsRange(30000, 30000);
camParameters.setPreviewSize(1920, 1080);
camParameters.setPictureSize(2592, 1944);
mCamera.setParameters(camParameters);
try {
mCamera.startPreview();
} catch (Exception e) {
mCamera.release();
mCamera = null;
}
}
从 XE22 开始,这仍然是一个问题(!)将每秒帧数降低到 30 或更低就可以了:
parameters.setPreviewFpsRange(30000, 30000);
确实,不要忘记设置参数:
camera.setParameters(parameters);
我没有找到关于为什么这会导致问题的明确解释,因为 60 fps 包含在支持的 fps 范围内。该视频可以录制 720p,但我从未见过任何源将 fps 添加到此。
您可以设置params.setPreviewSize(1200,800)
. 您可以在此范围内更改值,直到可以清除颜色噪点。