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

简介:

原文:http://m-ittrue.iteye.com/blog/758410

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

  大多数图像处理软件在处理时是需要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[],相应的还原机制也就是返过来而已。


相关文章
|
3月前
|
开发工具 Android开发 开发者
Android平台如何不推RTMP|不发布RTSP流|不实时录像|不回传GB28181数据时实时快照?
本文介绍了一种在Android平台上实现实时截图快照的方法,尤其适用于无需依赖系统接口的情况,如在RTMP推送、RTSP服务或GB28181设备接入等场景下进行截图。通过底层模块(libSmartPublisher.so)实现了截图功能,封装了`SnapShotImpl.java`类来管理截图流程。此外,提供了关键代码片段展示初始化SDK实例、执行截图、以及在Activity销毁时释放资源的过程。此方案还考虑到了快照数据的灵活处理需求,符合GB/T28181-2022的技术规范。对于寻求更灵活快照机制的开发者来说,这是一个值得参考的设计思路。
|
1月前
|
存储 大数据 数据库
Android经典面试题之Intent传递数据大小为什么限制是1M?
在 Android 中,使用 Intent 传递数据时存在约 1MB 的大小限制,这是由于 Binder 机制的事务缓冲区限制、Intent 的设计初衷以及内存消耗和性能问题所致。推荐使用文件存储、SharedPreferences、数据库存储或 ContentProvider 等方式传递大数据。
76 0
|
2月前
|
XML IDE 开发工具
🔧Android Studio高级技巧大公开!效率翻倍,编码不再枯燥无味!🛠️
【9月更文挑战第11天】在软件开发领域,Android Studio凭借其强大的功能成为Android开发者的首选IDE。本文将揭示一些提升开发效率的高级技巧,包括自定义代码模板、重构工具、高级调试技巧及多模块架构。通过对比传统方法,这些技巧不仅能简化编码流程,还能显著提高生产力。例如,自定义模板可一键插入常用代码块;重构工具能智能分析并安全执行代码更改;高级调试技巧如条件断点有助于快速定位问题;多模块架构则提升了大型项目的可维护性和团队协作效率。掌握这些技巧,将使你的开发之旅更加高效与愉悦。
67 5
|
3月前
|
Java Android开发 芯片
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
本文介绍了如何将基于全志H713芯片的AOSP Android源码导入Android Studio以解决编译和编码问题,通过操作步骤的详细说明,展示了在Android Studio中利用代码提示和补全功能快速定位并修复编译错误的方法。
143 0
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
|
3月前
|
JSON Java Android开发
Android 开发者必备秘籍:轻松攻克 JSON 格式数据解析难题,让你的应用更出色!
【8月更文挑战第18天】在Android开发中,解析JSON数据至关重要。JSON以其简洁和易读成为首选的数据交换格式。开发者可通过多种途径解析JSON,如使用内置的`JSONObject`和`JSONArray`类直接操作数据,或借助Google提供的Gson库将JSON自动映射为Java对象。无论哪种方法,正确解析JSON都是实现高效应用的关键,能帮助开发者处理网络请求返回的数据,并将其展示给用户,从而提升应用的功能性和用户体验。
97 1
|
3月前
|
缓存 API Android开发
Android经典实战之Kotlin Flow中的3个数据相关的操作符:debounce、buffer和conflate
本文介绍了Kotlin中`Flow`的`debounce`、`buffer`及`conflate`三个操作符。`debounce`过滤快速连续数据,仅保留指定时间内的最后一个;`buffer`引入缓存减轻背压;`conflate`仅保留最新数据。通过示例展示了如何在搜索输入和数据流处理中应用这些操作符以提高程序效率和用户体验。
52 6
|
3月前
|
编解码 网络协议 前端开发
如何实现Android平台GB28181设备接入模块按需打开摄像头并回传数据
后台采集摄像头,如果想再进一步扩展,可以把android平台gb28181的camera2 demo,都移植过来,实现功能更强大的国标设备侧,这里主要是展示,收到国标平台侧的回传请求后,才打开摄像头,才开始编码打包,最大限度的减少资源的占用
|
3月前
|
编解码 网络协议 Android开发
Android平台GB28181设备接入模块实现后台service按需回传摄像头数据到国标平台侧
我们在做Android平台GB28181设备对接模块的时候,遇到这样的技术需求,开发者希望能以后台服务的形式运行程序,国标平台侧没有视频回传请求的时候,仅保持信令链接,有发起视频回传请求或语音广播时,打开摄像头,并实时回传音视频数据或接收处理国标平台侧发过来的语音广播数据。
|
3月前
|
算法 数据处理 开发工具
Android平台RTSP|RTMP播放器如何回调YUV或RGB数据
在开发Android平台上的RTSP或RTMP播放器时,开发者不仅追求低延迟播放,还希望获取解码后的视频数据(如YUV或RGB格式),以便进行视觉算法分析。使用大牛直播SDK中的SmartPlayer,可在确保播放流畅的同时,通过设置外部渲染器(`SmartPlayerSetExternalRender`)来高效地回调原始视频数据。例如,对于RGBA数据,需实现`NTExternalRender`接口,并重写相关方法以处理数据和尺寸变化。同样地,对于I420(YUV)数据,也需要相应地实现接口以满足需求。这种方式使得开发者能在不影响常规播放功能的情况下,进行定制化的视频处理任务。
|
4月前
|
XML IDE 开发工具
🔧Android Studio高级技巧大公开!效率翻倍,编码不再枯燥无味!🛠️
【7月更文挑战第28天】在软件开发领域, Android Studio作为首选IDE, 其高级技巧能显著提升开发效率与乐趣。掌握这些技巧, 让开发旅程更高效有趣!
46 2
下一篇
无影云桌面