栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何使用JNI在C中获取原始的Android相机缓冲区?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何使用JNI在C中获取原始的Android相机缓冲区?

我对这个话题做了一些调查。该演讲(来自第277页,中文)很有帮助。

相机预览通话链

如其他人所述,您可以使用

Camera.setPreviewCallback
方法获得缓冲区。
这是那里发生的情况(详细版本):

  1. 用户调用
    Camera.startPreview()
    这是一个本机函数。
  2. android_hardware_Camera_startPreview
    调用
    startPreview
    C ++
    Camera
    类的方法。
  3. Camera
    调用接口
    startPreview
    方法
    ICamera
  4. ICamera
    使一个
    IPC
    远程客户端调用。
  5. 它调用类的
    setCameraMode
    方法
    CameraService
    。
  6. CameraService
    设置一个窗口以显示预览并调用类的
    startPreview
    方法
    CameraHardwareInterface
    。
  7. 后者尝试

    start_preview
    在特定
    camera_device_t
    设备上调用方法。
    我没有进一步查找,但是它应该执行呼叫驱动程序。

  8. 当图像到达时,

    dataCallback
    的
    CameraService
    被调用。

  9. 它将数据传递给
    handlePreviewData
    客户端的方法。
  10. 客户端要么复制缓冲区,要么直接将其发送到
    ICameraClient
    。
  11. ICameraClient
    将其发送
    IPC
    到
    Camera
    。
  12. Camera
    调用注册的侦听器并将缓冲区传递给
    JNI
    。
  13. 它调用Java类中的回调。如果用户提供了缓冲区,
    Camera.addCallbackBuffer
    则它将首先复制到缓冲区。
  14. 最后,Java类
    Camera
    处理消息并调用的
    onPreviewframe
    方法
    Camera.PreviewCallback
    。

如您所见

IPC
,在步骤10、11上,调用了2个调用,并且缓冲区被复制了至少两次。所返回的raw缓冲区的第一个实例
camera_device_t
托管在另一个进程中,由于中的安全检查,您无法访问它
CameraService
。

预览表面

但是,当您使用

Camera.setPreviewTexture
或设置预览图面时,或将
Camera.setPreviewDisplay
其直接传递到摄像头设备并实时刷新,而无需上面所有链条的参与。正如文档所述:

处理到由屏幕合成器管理的原始缓冲区。

Java类

Surface
具有一种检索其内容的方法:

public static native Bitmap screenshot(int width, int height, int minLayer, int maxLayer);

但是此API是隐藏的。请参阅此问题以获取使用方法。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/495775.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号