- 浏览: 1065504 次
- 性别:
- 来自: 南昌
文章分类
- 全部博客 (276)
- 生活 (1)
- 代码之美 (22)
- Media (7)
- Android Widget (3)
- Android Intent (1)
- Android Activity (4)
- UI event handle--UI事件处理机制 (2)
- Java基础知识 (12)
- android Databases (5)
- Android 系统知识 (70)
- 平常遇到的问题与解决方法 (38)
- Android TextView/EditView (2)
- Thinking Java (1)
- android webkit (6)
- JSON (1)
- XML (4)
- HTTP (1)
- Google Weather API (1)
- android 2.3 NFC (10)
- android app (20)
- android framework (7)
- C++ (2)
- android System (5)
- Pthread (1)
- Wifi (8)
- Unix/Linux C (8)
- Android 4.0 (1)
- Mail (1)
- Smack 源码学习 (4)
- iOS (4)
- Android (1)
- git (1)
- Gallery3d (2)
- React-Natice (1)
最新评论
-
dd18349182956:
你是用的smack哪个版本?我用的smack4.1.3和sma ...
关于socket长连接的心跳包 -
xukaiyin:
全英文
getApplicationContext()与this,getBaseContext() -
裂风矢:
...
<category android:name="android.intent.category.DEFAULT" /> 惹的祸 -
xanthodont:
mark一下
XMPP——Smack -
Evilover3:
mark一下,学习了
XMPP——Smack
转自: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的时候就注意到通过模拟器,相机预览的时候只能显示黑白电影。这些天总算有点空闲时间了,决定研究下这个。 关于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
发表评论
-
ACTIVITY的LAUNCH MODE详解 SINGLETASK正解
2012-05-30 08:58 1098转自:http://www.cnblogs.com/xiaoQ ... -
android的一些开源项目
2011-12-06 14:08 1178转自:http://www.iteye.com/problem ... -
修改StatusBar
2011-10-10 10:27 1245转自:http://iserveandroid.blogspo ... -
单独一个应用程序换语言
2011-09-29 15:16 1436转自http://blog.csdn.net/sodino/a ... -
通过代码设置live wall paper
2011-09-02 09:17 25071. The code is: private Wall ... -
关于Activity切换动画——overridePendingTransition
2011-05-25 14:33 5756Activity的切换动画指的是从一个activity跳转到另 ... -
sendBroadcast和sendStickyBroadcast的区别
2011-04-28 13:39 9699我们平时最经常使用的是sendBroadcast,就是把一个I ... -
Settings.System.getInt获取Setting里面的一些设置
2011-04-28 10:29 7020好久没有更新博客了,其实这期间我都在研究android如何换皮 ... -
Service 启动Activity
2011-03-11 11:06 25161我想我们一般在Service里想启动Activity一定会这样 ... -
Android Windows
2011-03-11 09:45 2041转自:http://elsila.blog.163.com/b ... -
IntentService
2011-03-11 09:23 3435看android的源码可以发现很多很多有趣有用的代码,今天在看 ... -
AsyncQueryHandler
2011-03-02 15:10 6788在QuickContactBadge里面我 ... -
QuickContactBadge如何实现
2011-03-02 11:52 4909从前一篇,我们知道了如何使用了QuikcContactBadg ... -
如何使用QuickContactBadge
2011-03-02 09:34 4051参考文章:http://mobile.tutsplus.com ... -
QuickSearcheBox---SearchManager获取search列表
2011-02-25 14:05 1848在android 2.2之后加入了SearchManager, ... -
QuickSearcheBox---SearchWidgetConfigActivity
2011-02-24 10:48 1629再把QuickSearchBox放到桌面前,会先触发它的Con ... -
RemoteView总结
2011-02-23 11:15 2324我最初认识RemoteView是在AppWidget里面的,但 ... -
Google Search Widget, Google Search ap, Globe Search ap
2011-02-23 10:39 1281http://blog.csdn.net/Judy889/ar ... -
调用android system Search UI须注意的问题
2011-02-23 10:38 1535http://blog.csdn.net/Judy889/ar ...
相关推荐
以上就是Android显示Camera图像的基本步骤和关键技术点。实际开发过程中可能还需要处理旋转、对焦、闪光灯等细节,以及适配不同设备和Android版本的差异。通过熟练掌握这些知识点,开发者可以创建出功能完善的Camera...
这个压缩包文件包含了一系列与Android Camera问题相关的文档,涵盖了从基础问题解决到深入的技术分析。以下是对这些文档内容的概览: 1. **解决Android 2.2 Camera问题**: 这份文档可能提供了针对Android 2.2版本...
因为工作中要使用 Android Camera2 API 来实现相机功能,但因为Camera2比较复杂,网上资料也比较乱,有一定入门门槛,所以花了几天时间系统研究了下,这个项目就是我研究的成果。 其中包括一个自己写的Camera2的Demo...
这个“android Camera源码(可用)”提供了一套完整的源代码,已经解决了常见的问题,如包名冲突或运行时错误,使得开发者可以方便地研究和使用。在本文中,我们将深入探讨Android Camera API的各个方面,并结合这个...
`Camera2` API自Android 5.0(API级别21)开始引入,旨在解决旧版`Camera` API的局限性,提供更高清晰度的图片、更好的手动控制以及更多的视频录制选项。 标题"android camera2 google官方demo"表明这是一个基于`...
- **准备MediaRecorder**: 设置摄像头源(Camera2 API提供),音频源(默认为麦克风),并调用`MediaRecorder.prepare()`进行内部配置。 - **开始录像**: 在用户触发录像操作后,调用`MediaRecorder.start()`开始...
本篇文章将详尽地探讨"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平台上,相机功能是开发者和用户都非常关注的部分,尤其是在移动设备上,高质量的拍照体验对用户来说至关重要。随着Android系统的不断演进,Camera API也经历了从早期的...
由于工作中需要用到Camera1,所以花了两天时间研究了以下,使用Android Camera1 API实现了相机预览、拍照和录制视频的功能。 资源中有个MyCamera1Demo.apk可以直接安装运行,MyCamera1Demo.zip是Demo源码。 具体详见...
专栏主要记录Camera开发相关内容,包含Camera、Camera2、CameraX以及USB(UVC)摄像头。 和大家一起快速入门Camera开发工作,为后期的视频编解码、拍照、录像、推流等打好基础工作。
自己总结的Android Camera系统架构及源码分析,以framework和hal为主。
在Android平台上,人脸识别是一项重要的功能,它允许应用检测并识别用户面部特征,广泛应用于自拍、安全认证等领域。...在实际开发中,还需要考虑兼容性问题,因为`Camera2` API仅在较新的Android版本中可用。
android camera mirror 前置后置相机视频预览时左右镜像,实现镜子效果 基于以下网址实现的android studio项目源代码包,可以直接打开使用 https://blog.csdn.net/mbrose/article/details/80167781 代码做了一...
在Android平台上,Camera2 API是用于访问和控制设备相机功能的高级接口,相较于早期的Camera API,Camera2提供了更精细的控制和更好的性能。本文将深入探讨如何使用Camera2 API来实现预览和拍照功能。 一、Camera2 ...
在Android平台上,Camera2 API是自Android 5.0(API级别21)引入的全新相机接口,旨在提供更高级别的控制和性能。这个API允许开发者深入到相机硬件的细节,实现专业级的拍照和视频录制功能。本文将详细介绍如何使用...
androidcamera摄像头驱动.pdf