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

kOr*_*Orc 13 plugins camera android preview unity-game-engine

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

我的问题:

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

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

然而,这决定了使用这个库的应用程序都在插入这个(貌似)任意查看到他们的应用程序布局,这必须是可见的所有的时间(他们无法切换布局,父容器的变化可视性或使用子活动)应用程序生命周期.

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

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

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

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

语境:

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

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

kOr*_*Orc 5

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

我们正在使用扩展SurfaceTexture,cameraSurface并参考所需的相机.使用cameraSurface SurfaceTexture,我们打电话

mCamera.setPreviewTexture(mSurfaceTexture);
mCamera.startPreview();
Run Code Online (Sandbox Code Playgroud)

然后previewCallback从您的活动或您需要的任何地方覆盖当前活动的摄像机.

mCamera.setPreviewCallback(new PreviewCallback() {

     public void onPreviewFrame(final byte[] data, final Camera camera) {
         // Process the contents of byte for whatever you need
     }
});
Run Code Online (Sandbox Code Playgroud)

这使您可以连续处理相机看到的内容,而不必仅仅通过存储的图像.当然,这仅限于相机的预览分辨率(可能与静态拍摄或视频分辨率不同).

如果我有时间,我会尝试抛出准系统工作演示.

编辑:我链接到的SDK不再免费提供.您仍然可以通过BitGym联系页面请求一个.

  • 很高兴您找到了解决问题的方法; 谢谢你的分享.让我添加一些可能对您的用例不重要的提示,但可以为其他人带来改变.首先,如果你使用[Camera.setPreviewCallbackWithBuffer()](http://developer.android.com/reference/android/hardware/Camera.html#setPreviewCallbackWithBuffer(android.hardware.Camera.PreviewCallback)),你可以大大减少垃圾视频捕获期间的收集.其次,要从UI线程推送回调,必须使用[Handler thread](http://stackoverflow.com/a/20693740/192373). (2认同)