13

根据 Java SDK 端的 android 相机文档,必须为相机预览帧提供一个(可见且活动的)要绘制的表面,以便访问帧数据。我已经链接了我在这里遇到的一些事情(我是新来的,所以最多只能有 2 个超链接),但是在结束在 SO 上发布我自己的问题之前,我查阅了大量关于各种事情的文档。

我的问题:

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

b) 是的,我看到了这个: 从没有预览的相机拍照

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

事实上,我的需求与这张海报的类似,除了我想要相机预览数据的连续实时流,而不是保存到磁盘上的图像的捕获。因此PictureCallbackmyCamera.takePicture呼叫一起为他工作。出于显而易见的原因,将连续捕获写入磁盘不是我的解决方案,因此在我的情况下不起作用。myCamera.takePicture也比获取预览帧慢得多。

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

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

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

语境:

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

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

4

2 回答 2

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 联系页面申请。

于 2014-05-24T11:05:37.753 回答
0

没有解决SurfaceView图像预览的问题。您可以做的是将捕获图像的责任委托byte[]给实现您的库的应用程序,这将允许他们使用您的库,不仅可以获取来自相机的图像,还可以使用已经拍摄的图像。

于 2014-05-14T08:09:28.757 回答