在Android上获取RAW相机数据?

时间:2016-03-14 12:17:35

标签: android camera

我想使用每个输入帧的位数组,基本上是为每帧从相机传感器接收的YUV格式,并对其进行一些处理。 我是java / android的新手,在我学习的同时学习,所以我的一些问题非常基本,但我找不到符合我需要的任何答案。

Q1:如何获取相机传感器接收到的每个帧的位数? (如何保存YUV字节流以供进一步使用?)
Q2:如何为接收到的每个新帧设置一个新的数据阵列将被接收进行处理? 问题3:我是否必须设置预览才能执行此操作,还是可以直接点击保存打开相机的原始数据的缓冲区?
问题4:预览是否会减慢(接收新帧)的过程?

如果需要,还可以进行一些进一步的解释:通过将手机摄像头指向LED,实现与闪烁的LED灯和智能手机的单向通信,实时过程将记录轻微的变化并将其解码为原始发送的数据。这样做我计划接收每帧的YUV数据,将其剥离到Y部分并决定每个帧是否打开或关闭。

2 个答案:

答案 0 :(得分:3)

是的,那是Camera API。 Android 21和更新的支持camera2 API可以为您提供更快的响应,但这取决于设备。如果您的目标是最大覆盖率,我建议您仍然使用已弃用的旧API。

通常,Android相机会生成NV21格式,从中可以很容易地提取出8bpp的亮度。

如果您想拍摄相机框架,Android需要实时预览。有许多变通方法可以让预览对最终用户隐藏,但是不支持这种方法,并且任何此类技巧可能会在下一个设备或下一次系统升级时失败。但不用担心:实时预览根本不会延迟您的处理速度,因为它都是在一个单独的硬件通道中完成的。

总而言之,当您使用Camera.setPreviewCallbackWithBuffer()并执行所有操作correctly时,您平均可以获得30 fps的平均设备。完全实现camera2 api的高端设备可以提供更高的帧速率。三星发布了他们自己的相机sdk。如果您需要三星设备的一些特殊功能,请使用它。

在多核设备上,您可以将图像处理卸载到线程池,但帧速率可能会受到相机硬件的限制。

请注意,您可以在GPU中执行一些有限的图像处理,将着色器应用于从相机获取的纹理。

答案 1 :(得分:2)

假设您已完成基本操作,并且您有摄像头预览和Camera对象。你可以打电话:

Camera.PreviewCallback callback = new Camera.PreviewCallback() {
    @Override
    public void onPreviewFrame(byte[] data, Camera camera) {
        //Do your processing here... Use the byte[] called "data"
    }
};

然后:

mCamera.setPreviewCallback(callback);

如果从未调用过Camera.Parameters.setPreviewFormat(),则默认格式为NV21,它使用NV21编码格式。