gpt4 book ai didi

java - Camera onPreviewFrame() 未在某些设备上调用(不存在预览显示)

转载 作者:搜寻专家 更新时间:2023-11-01 09:21:49 25 4
gpt4 key购买 nike

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

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

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

我了解到的另一件事是 setPreviewCallbackWithBuffer 在此设备上也不起作用:我必须使用 setPreviewCallback

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

我无法为 setPreviewDisplay 方法找到一个虚拟的 SurfaceHolder,因此我无法使用它来调用预览回调。另一方面,带有新 SurfaceTexturesetPreviewTexture 确实会调用 onPreviewFrame,但我不断收到“BufferQueue 已被放弃”错误并且预览数据似乎也不正确:当我设置图像格式时,从所述数据创建的图像不正确。查看不同的颜色会导致图像显示不同的颜色。同样,相同的代码在另一台设备上运行并且我设置了图像格式,因此输出应该是有效的。

我当前的代码,调用了 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
出现问题的手机:Samsung Galaxy J3 (2016)

最佳答案

回复: 虚拟预览纹理,这是您可以获得的最佳解决方法。官方 API 要求预览必须在某个地方进行,大多数设备都强制执行此政策。

无法在运行时检查设备是否在没有可供绘制的“接收器”(表面或纹理)的情况下提供实时预览。在其他类似情况下,我们被迫根据 QA 实验室实验和最终用户投诉维护设备的白名单和黑名单。对于某些功能,该技术是在您的应用程序首次运行时(在特定设备上)尝试最佳设置,如果它崩溃或失败,则在第二次尝试时使用效率较低的替代方案,并将此标志保留在SharedPreferences 用于 future 的发布。

幸运的是,添加虚拟 SurfaceTexture 不会对性能产生负面影响,即使在没有它也可以工作的设备上也是如此。

为了避免“BufferQueue has been abandoned”错误,add虚拟 SurfaceTexture 作为 Activity 或 fragment 中的字段。

关于java - Camera onPreviewFrame() 未在某些设备上调用(不存在预览显示),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54496700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com