Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 某些设备上未调用Camera onPreviewFrame()(不存在预览显示)_Java_Android_Android Camera - Fatal编程技术网

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

Java 某些设备上未调用Camera onPreviewFrame()(不存在预览显示),java,android,android-camera,Java,Android,Android Camera,在我的两台设备中的一台上,尽管我使用了相同的代码,但没有调用onPreviewFrame 我正在尝试获取、处理(使用OpenCV),然后使用不推荐的CameraAPI显示相机帧。(因为我使用的是遗留设备,而且不推荐使用的API为其提供了更好的性能。) 这意味着我不想直接显示预览帧,但我能够确定,在这个设备上,设置显示是拍摄预览所必需的。这意味着我必须设置某种高性能的虚拟显示。我的选项是:setPreviewDisplay->SurfaceHolder和setPreviewTexture->Sur

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

我正在尝试获取、处理(使用OpenCV),然后使用不推荐的CameraAPI显示相机帧。(因为我使用的是
遗留设备,而且不推荐使用的API为其提供了更好的性能。)

这意味着我不想直接显示预览帧,但我能够确定,在这个设备上,设置显示是拍摄预览所必需的。这意味着我必须设置某种高性能的虚拟显示。我的选项是:
setPreviewDisplay
->
SurfaceHolder
setPreviewTexture
->
SurfaceTexture

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

理想情况下,我希望检测预览是否需要这些额外步骤:如果没有必要,我不希望在不需要这些步骤的设备上执行这些步骤

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

我的当前代码,其中调用了
onPreviewFrame
,但数据无效:

camera=camera.open();
camera.setPreviewTexture(新表面纹理(1));
照相机。设置预览回调(此);
setParameters(configurator.getParameters())//将分辨率(在两台设备上相同)、fps范围和格式设置为ImageFormat.YV12(或NV21,没有区别)
camera.startPreview();
不需要预览显示的手机:Doogee X5 MAX
出现问题的手机:三星Galaxy J3(2016)

Re:dummy preview texture,这是您可以获得的最佳解决方案。官方API要求预览必须在某个地方进行,大多数设备都强制执行此策略

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

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


为避免“BufferQueue已被放弃”错误,请将虚拟的SurfaceTexture作为活动或片段中的字段。

setPreviewCallbackWithBuffer
无法工作,因为缓冲区太小。直到消除了“BufferQueue已被放弃”错误,我才看到错误。缓冲区太小的原因是:

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

  • 我调用了
    Camera.Parameters#setRecordingHint(true)
    ,这将我的分辨率(可能还有其他设置)锁定为硬编码值。这个分辨率与我选择的分辨率不一样,因此我的缓冲区确实太小了


欢迎来到俱乐部!不要期望使用相机很容易。Re:图像格式和正确的颜色。请提供更多信息:你尝试了哪种格式,你得到了什么颜色(一张样本图像就好了)。如果您可以公开设备型号,那么它对于回答您的问题以及其他可能遇到相同问题的开发人员都会非常有帮助。Re:setPreviewCallbackWithBuffer()–这对于高性能相机非常重要,因为线程正确。请解释它是如何不起作用的。@AlexCohn我恐怕不知道怎么做,但我已经解决了预览输出无效的问题。我认为该输出与所示的输出类似。关于缓冲区:我想我知道发生了什么(老实说,我真的不确定),看看我的答案。非常感谢你的帮助!这是另一个常见的平台缺陷:一些设备忽略或误解了我们传递给摄像机的参数。有时,他们会谎报支持的功能、大小等。请注意,对camera的任何调用,尤其是setParameters()都可能引发RuntimeException,有时是出于无正当理由。