首页 > 解决方案 > 在某些设备上未调用相机 onPreviewFrame()(不存在预览显示)

问题描述

尽管我使用相同的代码,但在我的两台设备之一上onPreviewFrame没有调用。

我正在尝试获取、处理(使用 OpenCV),然后使用已弃用的相机 API 显示相机帧。(因为我使用的是LEGACY设备,而弃用的 API 为它提供了更好的性能。)

这意味着我不想直接显示预览帧,但我能够确定在此设备上,设置显示对于进行预览是必要的。这意味着我必须设置某种高性能虚拟显示器。我的选择是:setPreviewDisplay->SurfaceHoldersetPreviewTexture-> SurfaceTexture

我学到的另一件事是,setPreviewCallbackWithBuffer这在这个设备上也不起作用:我必须使用setPreviewCallback.

理想情况下,我想检测是否需要这些额外的步骤才能进行预览:如果没有必要,我不想在不需要它们的设备上执行这些操作。

我无法找到SurfaceHoldersetPreviewDisplay方法的虚拟对象,因此无法使用该方法调用预览回调。另一方面,setPreviewTexture使用 newSurfaceTexture确实onPreviewFrame会调用 get,但我不断收到“BufferQueue has been mapped”错误,并且预览数据似乎也不正确:当我设置图像格式时,从所述数据创建的图像不正确. 查看不同的颜色会导致图像显示不同的颜色。同样,相同的代码在另一台设备上工作,我设置了图像格式,因此输出应该是有效的。

我当前的代码在哪里onPreviewFrame被调用,但数据无效:

camera = Camera.open();
camera.setPreviewTexture(new SurfaceTexture(1));
camera.setPreviewCallback(this);
camera.setParameters(configurator.getParameters()); //sets the resolution (same on both devices), the fps range and the format to ImageFormat.YV12 (or NV21, makes no difference)
camera.startPreview();

不需要预览显示的手机:Doogee X5 MAX
有问题的手机:三星 Galaxy J3 (2016)

标签: javaandroidandroid-camera

解决方案


setPreviewCallbackWithBuffer没有工作,因为缓冲区太小。直到我摆脱了“BufferQueue 已被放弃”错误,我才看到错误。缓冲区太小的原因是:

  • 我没有查询预览大小,我只是使用了我设置预览大小的值

  • 我打电话给Camera.Parameters#setRecordingHint(true),它将我的分辨率(可能还有其他设置)锁定为硬编码值。这个分辨率和我选择的不一样,所以我的缓冲区确实太小了。


推荐阅读