大多数图像处理软件在处理时是需要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
分享到:
相关推荐
本项目标题为“android平台camera采集数据利用ffmpeg第三方库进行编码”,其核心目标是展示如何使用JNI(Java Native Interface)调用FFmpeg库的接口,对Android Camera获取的原始视频数据进行高效的编码处理。...
在"Android 采用MediaCodec实现Camera预览视频编解码"的场景中,我们将深入探讨如何利用MediaCodec进行视频流的处理,以及如何结合Camera2 API来实现更高级的功能。 首先,MediaCodec的工作原理是基于硬件加速的,...
Android Camera API允许开发者捕获图像和视频,同时提供了对图像数据预览和处理的能力。本篇将深入探讨如何利用Android Camera API进行数据预览和处理,特别是在面部识别场景中的应用。 首先,我们需要创建一个...
综上所述,Android Camera添加水印的编码涉及到图像处理、视音频流的解析与合成,以及性能优化等多个方面。开发者需要对Android系统有深入理解,并熟悉相关库和API的使用,才能实现高效且具有良好用户体验的水印功能...
总的来说,"Android摄像头采集视频并编码H264存储"项目涉及到Android的高级摄像头API、硬件编码器的使用、文件I/O操作以及多媒体数据封装等技术。这些技术的掌握和应用,对于Android开发者来说,是实现高效、高质量...
本示例将深入探讨如何在Android应用中有效地使用Camera API,以及MediaRecorder类,以实现拍照、录像等功能。 1. **Camera API简介** Android Camera API分为两代:Camera1(旧版)和Camera2(新版)。Camera1 API...
在`MainActivity.java`中,你可能需要引入FFmpeg库,创建一个AVFormatContext,配置编码器,然后将摄像头数据送入AVPacket,通过编码器处理后写入到AVStream。 6. **处理回调和线程同步**: 在处理摄像头数据和...
Camera2 API是自Android Lollipop(API级别21)引入的,它提供了对摄像头更底层、更精细的控制,允许开发者调整曝光、对焦、白平衡等参数,以及获取原始图像数据。相比老版的Camera API,Camera2提供了更多的灵活性...
在Android 4.0中,JpegEncoder和VideoEncoder分别处理拍照和录像的编码工作。它们位于`frameworks/av/media/libstagefright`目录下的对应模块。编码后的数据会被写入到指定的文件或通过网络传输。 七、事件处理 ...
此外,还需要有对Android系统、特别是Linux内核中内存管理模块的深入了解,包括对内存属性的配置,以及对硬件编码流程中各环节的理解。 此外,这个案例也展示了在开发中遇到内存Bug时,进行问题分析和调试的重要...
7. **图像处理**:如果需要对捕获的图像进行实时处理,如滤镜效果,可以在CaptureRequest中设置YUV或JPEG格式,然后在ImageReader的onImageAvailable()回调中处理图像数据。 8. **权限管理**:Android 6.0(API级别...
接着,我们使用MediaCodec将视频流数据编码为h264,并将其保存到文件中。 在 MediaCodec中,我们可以使用各种参数来控制编码的质量、bitrate、帧率等参数。例如,我们可以使用setVideoSize()方法来设置视频的分辨率...
6. **帧处理**:`UVCCamera`库提供了回调机制,开发者可以注册一个`OnFrameAvailableListener`来处理每一帧数据。这可用于实时处理、分析或录制视频。 7. **兼容性问题**:不同品牌的USB摄像头可能存在兼容性问题,...
本项目中,开发者使用了Camera API来捕获视频数据,AudioRecord类来采集音频,MediaCodec进行硬件编码,最后通过MediaMuxer将编码后的音视频流合成为一个完整的MP4文件。以下是对这些技术的详细解析: 1. **Camera ...
在这个案例中,AudioRecord被用来捕获音频,然后将音频数据编码为AAC(Advanced Audio Coding)格式。AAC是一种高压缩率的音频编码格式,能保持高质量的音频同时减少存储空间。 4. **NV21到I420的转换**:NV21是...
综上所述,"androidusbcamera.rar"项目涉及了Android平台上的USB摄像头集成、多媒体处理、设备适配等多个关键知识点,对于希望在Android应用中集成UVC摄像头功能的开发者来说,是一个宝贵的资源。通过深入研究和理解...
该demo的核心是使用UVCCamera库,这是一个专为Android设计的开源库,用于处理USB摄像头的图像数据。UVCCameras标签表明了该示例主要涉及到UVCCamera的使用。UVCCamera库提供了基本的视频流管理和图像处理功能,如...
Camera1是早期版本的API,适用于Android 2.3 (Gingerbread)到Android 5.1 (Lollipop),它相对简单但功能有限。Camera2 API是在Android 5.0 (Lollipop)引入的,提供更高级的功能,如手动对焦、曝光控制和更高的图像...
通过对视频电话中camera部分数据流的分析,我们可以看到,为了实现本地预览和远程传输的功能,Android的camera系统采用了复杂的回调机制和数据处理流程。客户端需要向HAL层注册回调函数,以便在获取图像数据后能够...
7. **处理照片**: `PictureCallback`接口的`onPictureTaken(byte[] data, Camera camera)`方法会在照片拍摄完成后被调用,你可以在这里处理图片数据,比如保存到本地或进行图像处理。 8. **释放资源**: 当不再使用...