`

Android camera 默认显示黑白的问题

阅读更多
转自:http://tassardge.blog.163.com/blog/static/172301708201123043753616/

在初次接触android的时候就注意到通过模拟器,相机预览的时候只能显示黑白电影。这些天总算有点空闲时间了,决定研究下这个。 关于android camera的构造不再说了,模拟器上使用用的是一个虚拟的Camera-----FakeCamera这个大家应该都知道。
首先初略的了解一下camera preview图像显示的原理。Camera application 初始化的时候会创建一个surfaceview,从camera device 接收到的数据就可以通过它显示在屏幕上。内部处理的流程是很复杂的,下面我只给出一个从初始化到绘图函数调用的流程。
Surface初始化:
Android_view_surface:: Surface_init-->SurfaceComposerClient::CreateSurface-->
SurfaceFlinger:: createSurface-->Android_view_surface:: setSurface
Camera数据缓冲区Heap初始化:
CameraHardwareStub::initHeapLocked-->new MemoryBase-->new FakeCamera
Heap缓冲区注册到surface:
Android_hardware_camera:: android_hardware_Camera_setPreviewDisplay-->
Camera:: setPreviewDisplay-->CameraService::Client::setPreviewDisplay-->
CameraService::Client::registerPreviewBuffers-->LayerBuffer::registerBuffers
FakeCamera 原始数据的传递与绘图:
CameraHardwareStub::previewThread-->CameraService::Client::previewCallback-->
CameraService::Client::postPreviewFrame-->ISurface:: postBuffer-->
LayerBuffer::postBuffer--> LayerBuffer::BufferSource::postBuffer-->
LayerBase::invalidate-->SurfaceFlinger::signalEvent-->SurfaceFlinger::threadLoop-->
SurfaceFlinger::handleRepaint-->LayerBase::draw-->
LayerBuffer::BufferSource::onDraw-->LayerBase::drawWithOpenGL
FakeCamera得到数据为Yuv422, 原以为是库里某个地方绘图的时候出问题,但LayerBuffer::OnDraw 往下走很复杂的:
                       t.format == GGL_PIXEL_FORMAT_YCbCr_420_SP) {
                // just show the Y plane of YUV buffers。 不明白为什么google这么做。。。。。
但要解决预览为黑白电影的问题应该就比较简单了。只要我们将YUV数据转换为RGB丢给cameraService就可以了。用以下的代码替代ccrgb16toyuv_wo_colorkey。
int32_t ccrgb16toyuv_wo_colorkey(uint8_t *rgb16,uint8_t *yuv422,uint32_t *param,uint8_t *table[])
{
       int32_t width_dst = param[0];
    int32_t height_dst = param[1];
       memcpy(yuv422, rgb16, width_dst*height_dst*2);
}
CameraService中改动:
status_t CameraService::Client::registerPreviewBuffers()
{
   。。。。。。。。。。。。。。。。。。。。。。。
    ISurface::BufferHeap buffers(w, h, w, h,
                                PIXEL_FORMAT_RGB_565,
//PIXEL_FORMAT_YCbCr_420_SP,
                                 transform,
                                 0,
                                 mHardware->getPreviewHeap());
  status_t ret = mSurface->registerBuffers(buffers);
    if (ret != NO_ERROR) {
        LOGE("registerBuffers failed with status %d", ret);
    }
    return ret;
}
用PIXEL_FORMAT_RGB_565替换PIXEL_FORMAT_YCbCr_420_SP。这样就可以了。不妨动手试一试吧,看看是不是预览视频变为彩色的了。
对于实际的camera device出来的数据如果是yuv的话,也可以通过算法将yuv转换为RGB,这样做并不会导致转换效率降低,因为即使将yuv得数据丢到surfaceflinger中,最终还是会转换为BMp。
----AlbertChen
分享到:
评论

相关推荐

    Android 显示Camera图像

    以上就是Android显示Camera图像的基本步骤和关键技术点。实际开发过程中可能还需要处理旋转、对焦、闪光灯等细节,以及适配不同设备和Android版本的差异。通过熟练掌握这些知识点,开发者可以创建出功能完善的Camera...

    Android Camera问题资料

    这个压缩包文件包含了一系列与Android Camera问题相关的文档,涵盖了从基础问题解决到深入的技术分析。以下是对这些文档内容的概览: 1. **解决Android 2.2 Camera问题**: 这份文档可能提供了针对Android 2.2版本...

    Android Camera2 Demo - 实现相机预览、拍照、录制视频功能

    因为工作中要使用 Android Camera2 API 来实现相机功能,但因为Camera2比较复杂,网上资料也比较乱,有一定入门门槛,所以花了几天时间系统研究了下,这个项目就是我研究的成果。 其中包括一个自己写的Camera2的Demo...

    android Camera源码(可用)

    这个“android Camera源码(可用)”提供了一套完整的源代码,已经解决了常见的问题,如包名冲突或运行时错误,使得开发者可以方便地研究和使用。在本文中,我们将深入探讨Android Camera API的各个方面,并结合这个...

    Android Camera添加水印(编码)

    "Android Camera添加水印(编码)"这一主题主要涉及如何在用户拍摄照片或录制视频时,实时地将自定义的水印信息叠加到图像或视频帧上。下面我们将深入探讨这个话题,包括必要的理论知识、实现方法以及可能遇到的问题。...

    Android Studio Camera2的录像功能

    - **准备MediaRecorder**: 设置摄像头源(Camera2 API提供),音频源(默认为麦克风),并调用`MediaRecorder.prepare()`进行内部配置。 - **开始录像**: 在用户触发录像操作后,调用`MediaRecorder.start()`开始...

    android camera2 google官方demo

    `Camera2` API自Android 5.0(API级别21)开始引入,旨在解决旧版`Camera` API的局限性,提供更高清晰度的图片、更好的手动控制以及更多的视频录制选项。 标题"android camera2 google官方demo"表明这是一个基于`...

    Android Camera开发与设置偏好值

    本篇文章将详尽地探讨"Android Camera开发与设置偏好值"这一主题,包括如何启动相机预览、设置相机参数以及理解Android Camera API的工作原理。 首先,Android Camera API分为两个版本:Camera API1(在Android 3.0...

    android camera 拍照流程图

    Android Camera API提供了丰富的接口和工具,让开发者可以构建出具有复杂拍照功能的应用。以下是基于提供的标题、描述和标签所解析出的Android相机拍照流程的关键知识点。 首先,我们要理解Android Camera API的三...

    Android Camera2 API

    《深入解析Android Camera2 API》 在Android平台上,相机功能是开发者和用户都非常关注的部分,尤其是在移动设备上,高质量的拍照体验对用户来说至关重要。随着Android系统的不断演进,Camera API也经历了从早期的...

    Android Camera1 Demo - 实现预览、拍照、录制视频功能

    由于工作中需要用到Camera1,所以花了两天时间研究了以下,使用Android Camera1 API实现了相机预览、拍照和录制视频的功能。 资源中有个MyCamera1Demo.apk可以直接安装运行,MyCamera1Demo.zip是Demo源码。 具体详见...

    Android Camera架构及源码解析

    自己总结的Android Camera系统架构及源码分析,以framework和hal为主。

    android 原生人脸识别Camera和Camera2的示例

    在Android平台上,人脸识别是一项重要的功能,它允许应用检测并识别用户面部特征,广泛应用于自拍、安全认证等领域。...在实际开发中,还需要考虑兼容性问题,因为`Camera2` API仅在较新的Android版本中可用。

    androidcamera摄像头驱动.pdf

    androidcamera摄像头驱动.pdf

    Android camera2预览和取数据

    在Android平台上,Camera2 API是自Android 5.0(API级别21)引入的全新相机接口,旨在提供更高级别的控制和性能。这个API允许开发者深入到相机硬件的细节,实现专业级的拍照和视频录制功能。本文将详细介绍如何使用...

    Android Camera开发入门代码,包含Camera1、Camera2、cameraX和UVC Camera

    专栏主要记录Camera开发相关内容,包含Camera、Camera2、CameraX以及USB(UVC)摄像头。 和大家一起快速入门Camera开发工作,为后期的视频编解码、拍照、录像、推流等打好基础工作。

Global site tag (gtag.js) - Google Analytics