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

时间:2012-08-09 02:47:44

标签: android plugins camera unity3d preview

根据Java SDK方面的Android相机文档,必须提供相机预览帧(可见和活动)表面以便访问帧数据。我已经把我遇到的一些事情联系起来了(我是新的,因此限制在2个超链接上),但是在结束发布我自己的问题之前,我已经阅读了大量关于各种事情的文档。

我的问题:

a)我明确地不想将相机预览绘制到屏幕上,如果可能的话,我只想直接从相机缓冲区获取字节数据(我可以从这里获得)。

b)是的,我看到了这个: Taking picture from camera without preview

然而,这要求使用此库的应用程序必须将这个(看似)任意视图插入到他们的应用程序布局中,该布局必须始终可见(他们无法切换布局,更改父容器的可见性或使用应用程序生命周期中的子活动。

事实上,我的需求类似于this poster's,除了我想要连续的实时视频流预览数据流,而不是保存到磁盘上的图像的捕获。因此,PictureCallbackmyCamera.takePicture电话一起为他工作。出于显而易见的原因,将连续捕获写入磁盘对我来说不是一个解决方案,因此在我的情况下不起作用。 myCamera.takePicture也比获取预览帧慢得多。

c)我已经开始涉足NDK了,并且对它有了很好的感觉。但是,根据this,仅通过本机访问摄像机数据是不受支持或推荐的,即使在那时设备兼容性也会非常麻烦。

如果这已经过时,并且有可靠的NDK路线从Android设备获取相机数据,我找不到它们,所以如果你能指出它们会很棒。

d)我想通过像Unity这样的工具(以统一插件的形式)访问这个库,我希望能够将它编译成JAR(或原生的.so)并期望它处理以这种方式导入库的Android应用程序,以便他们可以使用相机而无需应用程序开发人员所需的特定UI /布局配置。

上下文

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

无论我有什么建议,我都会对我提出的任何要点都非常有帮助。非常感谢你的时间!

2 个答案:

答案 0 :(得分:5)

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

我们使用扩展的SurfaceTexturecameraSurface来引用所需的相机。使用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已不再免费提供。您仍然可以通过BitGym contact page申请一个。

答案 1 :(得分:0)

没有可用于SurfaceView的图像预览。您可以做的是将捕获byte[]的责任委托给实现您的库的应用程序,这样他们就可以使用您的库不仅可以使用相机中的图像,还可以使用已经拍摄的图像。