`
M_ittrue
  • 浏览: 77025 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

《android中对camera数据的简单编码处理》

阅读更多

    大多数图像处理软件在处理时是需要RGB格式的图像,而默认的视频流是压缩的YUV格式,Android下是YUV420SP,这个格式,虽然可以在程序中修改,但是修改后好像不起作用,也就是说只能得到编码为YUV420SP的视频流,这就需要把YUV420SP的视频流转换成RGB格式的图像,用于图像识别
     从log中可以看到Parameters预设的参数:
picture-format=jpeg
picture-preview=yuv422sp
    看来,真的行不通,那就只能获取帖数据了,其中的data是yuv格式的,需要对其解码。
    这是我在开发android程序中用到的一个用于处理图片解码的方法,不是本人所写,特此共享。

/**
*:YUV420SP解码的方式
*yuv420sp[]为原始的数据
*width为图片位图长,height为图片位图高
*rgbBuf[]是用于存贮原始数据经过解码后的r g b三元色数据
*/
static public void decodeYUV420SP(byte[] rgbBuf, byte[] yuv420sp, int width, int height) {   
              //定义单通道数据长度
	    final int frameSize = width * height;   
             //如果传进来的rgbBuf 为空,则抛出空指针异常
	if (rgbBuf == null)   
	    throw new NullPointerException("buffer 'rgbBuf' is null");      //如果传进来的rgbBuf 为比三通道数据长度小,则抛出异常,并打出相应信息
	if (rgbBuf.length < frameSize * 3)   
	    throw new IllegalArgumentException("buffer 'rgbBuf' size "  
	             + rgbBuf.length + " < minimum " + frameSize * 3);   
	   //如果传进来的yuv420sp 为空,则抛出空指针异常
	if (yuv420sp == null)   
	    throw new NullPointerException("buffer 'yuv420sp' is null");   
	  //如果传进来的rgbBuf 为比三通道数据长度的一半小,则抛出异常,并打出相应信息
	if (yuv420sp.length < frameSize * 3 / 2)   
	    throw new IllegalArgumentException("buffer 'yuv420sp' size " + yuv420sp.length   
	             + " < minimum " + frameSize * 3 / 2);   
	       //经过上面的叛断,我们正式进行解码了
	    int i = 0, y = 0;   
	    int uvp = 0, u = 0, v = 0;  
               //r g b 三元色初始化 
	    int y1192 = 0, r = 0, g = 0, b = 0;   
             //下面的两个for循环都只是为了把第一个像素点的的R G B读取出来,就是一行一行循环读取.
	    for (int j = 0, yp = 0; j < height; j++) {   
	         uvp = frameSize + (j >> 1) * width;   
	         u = 0;   
	         v = 0;   
	        for (i = 0; i < width; i++, yp++) {   
	             y = (0xff & ((int) yuv420sp[yp])) - 16;   
	            if (y < 0) y = 0;   
	            if ((i & 1) == 0) {   
	                 v = (0xff & yuv420sp[uvp++]) - 128;   
	                 u = (0xff & yuv420sp[uvp++]) - 128;   
	             }   
	               
	             y1192 = 1192 * y;   
	             r = (y1192 + 1634 * v);   
	             g = (y1192 - 833 * v - 400 * u);   
	             b = (y1192 + 2066 * u);   
	               //始终持 r g b在0 - 262143
	            if (r < 0) r = 0; else if (r > 262143) r = 262143;   
	            if (g < 0) g = 0; else if (g > 262143) g = 262143;   
	            if (b < 0) b = 0; else if (b > 262143) b = 262143;   
	               //安位运算,分别将一个像素点中的r g b 存贮在rgbBuf中
	             rgbBuf[yp * 3] = (byte)(r >> 10);   
	             rgbBuf[yp * 3 + 1] = (byte)(g >> 10);   
	             rgbBuf[yp * 3 + 2] = (byte)(b >> 10);   
	         }   
	     }   
	   }  

通过这样的解码,我们就可以得到我们想要的rgbBuf[],相应的还原机制也就是返过来而已。

http://chenweihuacwh.iteye.com/blog/571223

感谢cwh643
分享到:
评论
1 楼 wyh471738293 2012-06-06  
你好,请问
int y1192 = 1192 * y;
int r = (y1192 + 1634 * v);
int g = (y1192 – 833 * v – 400 * u);
int b = (y1192 + 2066 * u);
1192 、 1634 、 833 、 400 、 2066 、 262143都代表什么意思?

相关推荐

    android平台camera采集数据利用ffmpeg第三方库进行编码

    本项目标题为“android平台camera采集数据利用ffmpeg第三方库进行编码”,其核心目标是展示如何使用JNI(Java Native Interface)调用FFmpeg库的接口,对Android Camera获取的原始视频数据进行高效的编码处理。...

    Android 采用MediaCodec实现Camera预览视频编解码

    在"Android 采用MediaCodec实现Camera预览视频编解码"的场景中,我们将深入探讨如何利用MediaCodec进行视频流的处理,以及如何结合Camera2 API来实现更高级的功能。 首先,MediaCodec的工作原理是基于硬件加速的,...

    android camera 数据预览和处理代码

    Android Camera API允许开发者捕获图像和视频,同时提供了对图像数据预览和处理的能力。本篇将深入探讨如何利用Android Camera API进行数据预览和处理,特别是在面部识别场景中的应用。 首先,我们需要创建一个...

    Android Camera添加水印(编码)

    综上所述,Android Camera添加水印的编码涉及到图像处理、视音频流的解析与合成,以及性能优化等多个方面。开发者需要对Android系统有深入理解,并熟悉相关库和API的使用,才能实现高效且具有良好用户体验的水印功能...

    Android摄像头采集视频并编码H264存储

    总的来说,"Android摄像头采集视频并编码H264存储"项目涉及到Android的高级摄像头API、硬件编码器的使用、文件I/O操作以及多媒体数据封装等技术。这些技术的掌握和应用,对于Android开发者来说,是实现高效、高质量...

    Android中Camera使用案例

    本示例将深入探讨如何在Android应用中有效地使用Camera API,以及MediaRecorder类,以实现拍照、录像等功能。 1. **Camera API简介** Android Camera API分为两代:Camera1(旧版)和Camera2(新版)。Camera1 API...

    Android采集摄像头图像--MediaCodec编码

    在`MainActivity.java`中,你可能需要引入FFmpeg库,创建一个AVFormatContext,配置编码器,然后将摄像头数据送入AVPacket,通过编码器处理后写入到AVStream。 6. **处理回调和线程同步**: 在处理摄像头数据和...

    Android Studio Camera2的录像功能

    Camera2 API是自Android Lollipop(API级别21)引入的,它提供了对摄像头更底层、更精细的控制,允许开发者调整曝光、对焦、白平衡等参数,以及获取原始图像数据。相比老版的Camera API,Camera2提供了更多的灵活性...

    android4.0camera源码

    在Android 4.0中,JpegEncoder和VideoEncoder分别处理拍照和录像的编码工作。它们位于`frameworks/av/media/libstagefright`目录下的对应模块。编码后的数据会被写入到指定的文件或通过网络传输。 七、事件处理 ...

    Android 开发 Camera拍照出现竖线

    此外,还需要有对Android系统、特别是Linux内核中内存管理模块的深入了解,包括对内存属性的配置,以及对硬件编码流程中各环节的理解。 此外,这个案例也展示了在开发中遇到内存Bug时,进行问题分析和调试的重要...

    Android 自定义相机Camera2源码下载

    7. **图像处理**:如果需要对捕获的图像进行实时处理,如滤镜效果,可以在CaptureRequest中设置YUV或JPEG格式,然后在ImageReader的onImageAvailable()回调中处理图像数据。 8. **权限管理**:Android 6.0(API级别...

    Android使用MediaCodec将摄像头采集的视频编码为h264

    接着,我们使用MediaCodec将视频流数据编码为h264,并将其保存到文件中。 在 MediaCodec中,我们可以使用各种参数来控制编码的质量、bitrate、帧率等参数。例如,我们可以使用setVideoSize()方法来设置视频的分辨率...

    Android USBCamera,UVCCamera开发通用库

    6. **帧处理**:`UVCCamera`库提供了回调机制,开发者可以注册一个`OnFrameAvailableListener`来处理每一帧数据。这可用于实时处理、分析或录制视频。 7. **兼容性问题**:不同品牌的USB摄像头可能存在兼容性问题,...

    Android平台Camera采集数据,AudioRecord采集音频数据,并硬编码,通过MediaMuxer合成MP4.zip

    本项目中,开发者使用了Camera API来捕获视频数据,AudioRecord类来采集音频,MediaCodec进行硬件编码,最后通过MediaMuxer将编码后的音视频流合成为一个完整的MP4文件。以下是对这些技术的详细解析: 1. **Camera ...

    Android使用ffmpeg4.0+实现camera和record合成mp4

    在这个案例中,AudioRecord被用来捕获音频,然后将音频数据编码为AAC(Advanced Audio Coding)格式。AAC是一种高压缩率的音频编码格式,能保持高质量的音频同时减少存储空间。 4. **NV21到I420的转换**:NV21是...

    androidusbcamera.rar

    综上所述,"androidusbcamera.rar"项目涉及了Android平台上的USB摄像头集成、多媒体处理、设备适配等多个关键知识点,对于希望在Android应用中集成UVC摄像头功能的开发者来说,是一个宝贵的资源。通过深入研究和理解...

    AndroidUSBCamera.zip

    该demo的核心是使用UVCCamera库,这是一个专为Android设计的开源库,用于处理USB摄像头的图像数据。UVCCameras标签表明了该示例主要涉及到UVCCamera的使用。UVCCamera库提供了基本的视频流管理和图像处理功能,如...

    android Camera源码(可用)

    Camera1是早期版本的API,适用于Android 2.3 (Gingerbread)到Android 5.1 (Lollipop),它相对简单但功能有限。Camera2 API是在Android 5.0 (Lollipop)引入的,提供更高级的功能,如手动对焦、曝光控制和更高的图像...

    视频电话中camera部分数据流分析

    通过对视频电话中camera部分数据流的分析,我们可以看到,为了实现本地预览和远程传输的功能,Android的camera系统采用了复杂的回调机制和数据处理流程。客户端需要向HAL层注册回调函数,以便在获取图像数据后能够...

    Android_Camera_Demo

    7. **处理照片**: `PictureCallback`接口的`onPictureTaken(byte[] data, Camera camera)`方法会在照片拍摄完成后被调用,你可以在这里处理图片数据,比如保存到本地或进行图像处理。 8. **释放资源**: 当不再使用...

Global site tag (gtag.js) - Google Analytics