java - 在某些设备上未调用相机 onPreviewFrame()(不存在预览显示)
问题描述
尽管我使用相同的代码,但在我的两台设备之一上onPreviewFrame
没有调用。
我正在尝试获取、处理(使用 OpenCV),然后使用已弃用的相机 API 显示相机帧。(因为我使用的是LEGACY
设备,而弃用的 API 为它提供了更好的性能。)
这意味着我不想直接显示预览帧,但我能够确定在此设备上,设置显示对于进行预览是必要的。这意味着我必须设置某种高性能虚拟显示器。我的选择是:setPreviewDisplay
->SurfaceHolder
和setPreviewTexture
-> SurfaceTexture
。
我学到的另一件事是,setPreviewCallbackWithBuffer
这在这个设备上也不起作用:我必须使用setPreviewCallback
.
理想情况下,我想检测是否需要这些额外的步骤才能进行预览:如果没有必要,我不想在不需要它们的设备上执行这些操作。
我无法找到SurfaceHolder
该setPreviewDisplay
方法的虚拟对象,因此无法使用该方法调用预览回调。另一方面,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)
解决方案
setPreviewCallbackWithBuffer
没有工作,因为缓冲区太小。直到我摆脱了“BufferQueue 已被放弃”错误,我才看到错误。缓冲区太小的原因是:
我没有查询预览大小,我只是使用了我设置预览大小的值
我打电话给
Camera.Parameters#setRecordingHint(true)
,它将我的分辨率(可能还有其他设置)锁定为硬编码值。这个分辨率和我选择的不一样,所以我的缓冲区确实太小了。
推荐阅读
- java - 如何从 Android Studio 中构建的 Android 应用程序连接到 Eclipse 中构建的 RESTlet Web 服务?
- regex - 如何捕获此正则表达式中的最后两个字符?
- python - 使用空格缩进实现类似标签的导航
- javascript - iPad Air 上的 Ionic Radio Button 响应时间长
- php - 重新索引树数组php的元素
- ios - 如何在 tableview 上加载 JSON?
- html - 我想将我的 UL 居中,但它不起作用
- c++ - 在 VC++ 2005 中将 crlf 添加到 WCHAR *
- c# - 只读依赖属性更新但在首次使用时不起作用
- c# - 无条件遍历 XML