相机onPreviewFrame()不叫上一些设备(无预览显示存在)

问题描述 投票:2回答:2

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

我试图让,过程(用OpenCV的),然后使用过时的相机API显示相机的帧。 (因为我使用的是LEGACY设备和过时的API为它提供更好的性能。)

这意味着,我不想直接显示预览框,但我能够确定在该设备上,设置一个显示有必要采取预览。这意味着我必须设置某种高性能虚拟显示的。我的选择是:setPreviewDisplay - > SurfaceHoldersetPreviewTexture - > SurfaceTexture

我学到的另一件事是setPreviewCallbackWithBuffer无法正常工作或在此设备上:我必须使用setPreviewCallback

理想情况下,我想检测是否我需要这些额外的步骤进行预览的工作:如无必要,我不想做这些就不需要这些设备。

我无法找到一个方法SurfaceHolder一个虚拟setPreviewDisplay,所以我没能拿到预览回调使用被调用。在另一方面,setPreviewTexture用新SurfaceTexture确实让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();

对于该预览显示是没有必要的电话:道格X5 MAX 其中有问题的手机:三星Galaxy J3(2016)

java android android-camera
2个回答
1
投票

回复:假预览质地,这是你能得到的最好的解决方法。官方API要求必须预览去的地方,和大多数设备执行这项政策。

有没有办法在运行时检查设备是否可以提供实时预览没有“汇”(表面或纹理)可资借鉴。在其他类似的情况下,我们不得不保持白名单和设备的黑色名单的基础上,QA实验室实验和最终用户的投诉。对于某些功能,该技术是尝试在你的应用程序第一次运行的最佳设置(在特定的设备上),并且,如果它崩溃或以其他方式失败,使用在第二次尝试效率较低的选择,并保持这个标志SharedPreferences为今后的发射。

幸运的是,加入了虚拟表面纹理不会消极甚至可以在没有它的工作设备影响性能。

为了避免“BufferQueue已被放弃”的错误,add虚拟表面纹理为您的活动或片段的字段。


1
投票

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

  • 没查询预览大小,我只是用我设置预览大小值
  • 我叫Camera.Parameters#setRecordingHint(true),其中被锁定的我的分辨率(也可能是其他设置也一样),以硬编码值。该决议是不一样的,我选择了一个,所以我的缓冲确实是太小了。
© www.soinside.com 2019 - 2024. All rights reserved.