栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > 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号