Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.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
Android:访问硬件相机预览帧数据而不绘制它们_Android_Plugins_Camera_Unity3d_Preview - Fatal编程技术网

Android:访问硬件相机预览帧数据而不绘制它们

Android:访问硬件相机预览帧数据而不绘制它们,android,plugins,camera,unity3d,preview,Android,Plugins,Camera,Unity3d,Preview,根据JavaSDK端的android摄像头文档,摄像头预览帧必须提供一个(可见和活动的)表面来绘制,以便访问帧数据。我已经链接了一些我在这里遇到的东西(我是新来的,所以有2个超链接),但是我在结束之前,已经浏览了大量的文档,然后在这里发布了我自己的问题 我的问题: a) 我明确地不想在屏幕上绘制相机预览,我只希望字节数据(我可以从这里获得)尽可能直接从相机缓冲区中获取 b) 是的,我看到了: 但是,这意味着使用此库的应用程序必须将此(看似)任意视图插入其应用程序布局,该布局必须在应用程序生命周

根据JavaSDK端的android摄像头文档,摄像头预览帧必须提供一个(可见和活动的)表面来绘制,以便访问帧数据。我已经链接了一些我在这里遇到的东西(我是新来的,所以有2个超链接),但是我在结束之前,已经浏览了大量的文档,然后在这里发布了我自己的问题

我的问题: a) 我明确地不想在屏幕上绘制相机预览,我只希望字节数据(我可以从这里获得)尽可能直接从相机缓冲区中获取

b) 是的,我看到了:

但是,这意味着使用此库的应用程序必须将此(看似)任意视图插入其应用程序布局,该布局必须在应用程序生命周期内始终可见(它们不能切换布局、更改父容器的可见性或使用子活动)

事实上,我的需求和之类似,只是我想要相机预览数据的连续实时流,而不是保存到磁盘上的图像捕获。因此,
PictureCallback
myCamera.takePicture
call一起为他工作。出于显而易见的原因,将连续捕获写入磁盘对我来说不是一个解决方案,所以在我的情况下,这不起作用
myCamera.takePicture
也比获取预览帧慢得多

c) 我已经开始涉足NDK,并且对它有了很好的感觉。然而,据了解,通过本机访问摄像头数据是不受支持或不推荐的,即使这样,设备兼容性也是一个巨大的麻烦

如果这是过时的,并且有可靠的NDK路线从android设备获取相机数据,我找不到它们,所以如果你能向我指出它们,那就太好了

d) 我想让这个库可以从Unity(以Unity插件的形式)这样的工具访问,对于Unity,我只想将它编译成一个JAR(对于native,或者.so)并期望它能在android应用程序上工作,以这种方式导入库,这样他们就可以使用摄像头,而无需应用程序开发人员提供特定的UI/布局配置

背景: 我希望能够创建一个用于android应用程序的视觉处理库,并且不希望限制使用该库的应用程序必须使用特定的应用程序布局并在屏幕上绘制特定的视图,以便使用视觉处理结果-举一个非常简单的例子,如果某个应用程序想使用我的库获取相机所看到的图像的平均颜色,并想将屏幕上的图像着色为该颜色


无论我对任何一点有什么建议,都会非常有帮助。非常感谢您抽出时间

使用
SurfaceView
进行图像预览是不可能的。你可以做的是将捕获字节[]的责任委托给实现你的库的应用程序,这样他们不仅可以使用你的库获取相机拍摄的图像,还可以获取已经拍摄的图像。

我完全忘了我有这个问题。2年后,再加上几个Android SDK版本,我们就有了一个工作系统

我们正在使用扩展的
SurfaceTexture
cameraSurface
,并引用所需的摄影机。使用cameraSurface的
SurfaceTexture
,我们调用

mCamera.setPreviewTexture(mSurfaceTexture);
mCamera.startPreview();
然后覆盖当前活动摄像机的
previewCallback
,从您的活动或任何需要它的地方

mCamera.setPreviewCallback(new PreviewCallback() {

     public void onPreviewFrame(final byte[] data, final Camera camera) {
         // Process the contents of byte for whatever you need
     }
});
这使您能够连续处理相机看到的内容,而不仅仅是浏览存储的图像。当然,这将限于您相机的预览分辨率(可能不同于静止捕获或视频分辨率)

如果我有时间的话,我会试着做一个简单的工作演示


编辑:我链接到的SDK不再免费提供。您仍然可以通过请求。

您有过此问题的解决方案吗?我已经添加了我的解决方案作为此问题的答案。抱歉,我花了这么长时间。问题是要不断地做,而不仅仅是在孤立的时间。将这一责任委托给应用程序真的很麻烦,开发人员最好能告诉我们的库“开始处理”/“停止处理”,然后我们给他们我们的处理结果,他们可以通过“lastProcessingOutput”或等效程序访问。这将使它尽可能地拖放,仍然给用户尽可能多的控制。如果我们希望他们能够处理存储的图像,我们可以将其作为一个标志+url,但我们是一个运动检测库,所以静像没有什么意义。@Justin slade:您可以通过TextureView使用SurfaceTexture,也可以直接连接到OpenGL。您找到了解决问题的方法,这太棒了;谢谢分享。让我添加一些提示,这些提示对您的用例可能不是必需的,但对其他人可能会有所不同。首先,如果使用,可以显著减少视频捕获期间的垃圾收集。其次,要将回调推离UI线程,您必须使用一个。这不需要opengl和android 5.0(camera api 2)来处理数据吗?如果我需要在renderscript上只使用camera api1来执行一些renderscript操作,该怎么办?从Android API level 11开始,它是3.0(不同的风格有稍微不同的行为)。它确实需要openGL ES 2,它可以在预冰淇淋三明治设备上使用。我正在尝试编写一个与你的非常类似的应用程序,我遇到了同样的问题。使用SurfaceTexture的代码仍然可用吗?我尝试了你提供的链接,但它不再有效。如果能看到一个有效的演示,我将不胜感激,谢谢!Camera2 API有什么答案吗?