当前位置:首页 » 安卓系统 » androidyuv转换

androidyuv转换

发布时间: 2022-12-09 14:22:47

⑴ 如何RGB帧转换为YUV在Android中使用GPU

优点: Android软件应用程序接口可以使用CPU或GPU的渲染,包括桌面。由于GPU比CPU能够更好地处理图形,GPU渲染它更流畅的应用程序界面也将减少对CPU的负担。 缺点: 首先是迫使GPU加速会增加功率消耗,减少待机时间。 二是对于不支持GPU加速的一些老程序,开始GPU加速会停止运行(崩溃) 总之,强制GPU渲染将利用GPU的优势,同时增加了功耗,减少电池寿命,但不会影响手机的使用寿命。

⑵ UVC Camera使用简单记录

程序是根据 UVCCamera 去修改的。
使用过程中遇到的几点关键问题:
1.YUV 格式:NV21等格式。
2.YUV转RGB效率问题。
3.Bitmap内存泄漏问题。
4.Handler内存泄漏的问题

首先onFrame(这是camera取图的callBack函数,byte[] data就是camera的数据)中不能做耗时操作(例如将data转bitmap等操作),不然会阻塞(之前把这个操作放到这里然后直接将bitmap传出)导致卡顿。

在传输byte[]数据之后,需要将byte[]转bitmap。
在byte[] 转bitmap的过程中,由于创建了过多的Bitmap,会导致内存泄漏,程序崩溃。
因此1.将Bitmap设置为静态变量,避免重复创建的问题。2.修改byte[] 转bitmap的函数,原来函数是返回Bitmap,现在是将Bitmap作为参数传入函数中,直接将Bitmap数据传递出去。减少了一个返回的步骤。

之前是这样的:

现在是这样的:

后面就是通过handleImage将Bitmap显示在ImageView上。

NV21转bitmap的问题。
我的程序基本是根据 UVCCamera 去修改的,UVCCamera中没有取每一帧,但是留有接口,我这里设定每一帧的数据为NV21格式。

并且在onFrame中取出的data格式是NV21(NV21是YUV中的一个,YUV有很多格式),因此在转成bitmap的时候,需要根据公式去转化。用系统自带的RenderScript去转换,发现图片虽然清晰但是颜色不对。

查找yuv转bitmap函数,找到的是这个。依旧是转出来的图片,非常明显,成像很清晰,但是就是颜色不对。

因此对函数进行了修改。修改后如下所示。

由于对YUV与RGB这个概念模糊不清,而搜索得到的YUV转bitmap函数是虽然的确是NV21转bitmap,但转换后有色差。后修改rgba[]的赋值顺序后,颜色才正常。其实就是在由YUV编码转RGB编码的过程中,数据传递出现问题才导致色彩异常,这种情况就需要一步步分析YUV到RGB的数据转换中哪里出现了问题。之前是存储为ABGR,后面才是存储为ARGB。
具体分析可以看这篇:
RGB和YUV简单学习记录

但是上面这种方式实际使用中发现效率过低。因此需要使用so的方式去转换。

具体参考链接:
libyuv—libyuv测试使用ARGBToI420和ConvertToARGB接口
https://blog.csdn.net/XIAIBIANCHENG/article/details/73065646

但是这个是yuvI420 数据转为bitmap 。我在使用的时候需要对format进行修改。

即将void Java_com_example_libyuv_Test_convertToArgb函数中的FOURCC_IYUV改为FOURCC_NV21。

Handle内存泄漏的问题。
之前因为想偷懒所以没有处理Android studio关于Handle内存泄漏的提示。然后让程序跑了一天果然崩了。

之前是如下所示,这种写法Android Studio会提示你这是有风险的。

现在改成如下所示

其实还可通过在activity的destroy中调用 handler.removeCallbacksAndMessages(null) ,来达到避免内存泄漏的目的,android 系统源码中也基本是使用这个方法。

后记:这篇文章始于2018年,当时是用于双目USB摄像头上,最近在整理东西所以完善了一下。
参考链接:
Android yuv转换成bitmap
图文详解YUV420数据格式
Android中的YUV格式解析
Nv21转Bitmap(高效率转化)
Android 之 Bitmap
Android解惑之Handler为什么需要是static的

⑶ 如何RGB帧转换为YUV在Android中使用GPU

进来了

⑷ Android摄像头获得YUV格式的视频,网上很多都把它转换为RGB为什么呢能不能把它转换为H264或者MP4格式的

RGB ? YUV ?这是视频格式?难道我OUT了,经常和视频打交道,视频格式平常的和少见的都略知,就是没见过这两种,RGB不会是代表红绿蓝三基色通道的视频吧,YUV的原理或许和RGB一样,并不代表格式,而是视频的颜色通道

⑸ android yuv怎么转换成RGB565

参数分别是宽,高,原数据指针,转化后的目标数据指针。


你找的这个函数是用C写的,而你的save(byte[]yuv420,Stringpath,intwidth,intheight,intquality)是JAVA,因此你要使用JNI。或者你把cvt_420p_to_rgb565函数转成JAVA版。

举个例子使用jni(实际自己测试):

cvt_420p_to_rgb565修改为

#ifdef__cplusplus
extern"C"{
#endif

JNIEXPORTjobjectArrayJNICALL你的包名_类名_cvt420pToRGB565(JNIEnv*env,jobjectobj,jintwidth,jintheight,jcharArraysrcData,jcharArraydstData);
#ifdef__cplusplus
};
#endif

JNIEXPORTjobjectArrayJNICALL你的包名_类名_cvt420pToRGB565(JNIEnv*env,jobjectobj,jintwidth,jintheight,jcharArraysrcData,jcharArraydstData)
{
unsignedchar*src=(unsignedchar*)(env->GetByteArrayElements(srcData,0));
unsignedchar*dst=(unsignedchar*)(env->GetByteArrayElements(dstData,0));

下面照抄!!

⑹ YUV格式图像基础

yuv是一种类似rgb的颜色模型,起源于黑白和彩电的过渡时期。其中Y代表亮度,uv组合起来可以表示色度。yuv信息只有y的信息就足以显示黑白的图片,yuv和YCbCr表示相同的东西,且Cb严格对应U,Cr严格对应V,yuv和rgb可以通过固定公式进行转换。

yuv转rgb:

rgb转yuv:

yuv主流的采样方式有yuv4:4:4、yuv4:2:2、yuv4:2:0。下图中以黑点表示采样该像素点的Y分量,以空心圆圈表示采用该像素点的UV分量,可以看到这些采样方式是影响uv的采样的,对y都是全部采样。

可以看到,yuv格式图像信息可以比rgb格式占用的字节码更少,所以可以用yuv来传输色彩数据,接收到yuv数据后再转换为rgb来显示图像,从而减少了传输图像占用的带宽。

yuv衍生出了很多格式,主要是由于其存储方式决定的。

packed存储的yuv的存储先后不同,细分为了yuv、yvu、yvyu、uyvy等等。

planar存储的yuv依据数组数量分成了yuv分别三个数组表示的完全平面的,以及y一个数组而uv一个数组的半平面(Semi planar)的两类,而半平面的又可以细分为uv和vu两个存储顺序。

I420: YYYYYYYY UU VV =>YUV420P
YV12: YYYYYYYY VV UU =>YUV420P
NV12: YYYYYYYY UVUV =>YUV420SP
NV21: YYYYYYYY VUVU =>YUV420SP //安卓Camera默认格式

涉及到摄像头帧图像处理的应用经常需要操作Yuv数据帧,例如镜像、加滤镜等。

操作yuv图像可以直接使用google开源的libyuv库,提供了对yuv图像的格式转换、缩放、裁剪、旋转、镜像等操作: 谷歌git libyuv ,github上有人用其做了简单的安卓版本的demo: 安卓libyuvDemo ,包含了基础的yuv库的使用逻辑,但是该项目没有同步谷歌libyuv更新。

参考链接:

https://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html

http://www.360doc.com/content/16/0517/16/496343_559909505.shtml

谷歌git libyuv

[安卓libyuvDemo

⑺ 如何RGB帧转换为YUV在Android中使用GPU

帧数与CPU&GPU有关,就和电脑一样,CPU主频越高帧数越高,且不会递减,GPU越高帧数也越高,但是有阀值 所以,在GPU和CPU相同的起始情况下,CPU的提升比GPU的提升效果更明显 RAM的话主要是保持帧数,与帧数高低无关。也就是RAM不够可能会在运行的时候大卡一下,RAM足够支持的时候,就算提升了也没什么变化

⑻ 【道听途说】Android如何直接显示FFMpeg解码后的yuv数据

一般的编译会编译各种编解码器,这样编译后的so文件就会有6.0MB左右。 ...也遇到同样问题,帮楼主顶一下。 ...

⑼ android yuv旋转耗时严重怎么解决

void CTool::YUV420spRotate90(uchar *des, uchar *src,int width,int height)
{
int wh = width * height;
//旋转Y
int k = 0;
for(int i = 0; i < width; i++) {
for(int j = 0; j < height; j++)
{
des[k] = src[width * j + i];
k++;
}
}

for(int i = 0; i < width; i += 2) {
for(int j = 0; j < height / 2; j++)
{
des[k] = src[wh+ width * j + i];
des[k+1] = src[wh + width * j + i + 1];
k+=2;
}
}
}

在android上运行了一下,发现视频非常卡。所以只有自己优化了。这段代码里有乘法,优化的重点就是去掉乘法用加法代替:
[cpp] view plain
void CTool::YUV420spRotate90(uchar *dst, const uchar *src, int srcWidth, int srcHeight)
{
static int nWidth = 0, nHeight = 0;
static int wh = 0;
static int uvHeight = 0;
if(srcWidth != nWidth || srcHeight != nHeight)
{
nWidth = srcWidth;
nHeight = srcHeight;
wh = srcWidth * srcHeight;
uvHeight = srcHeight >> 1;//uvHeight = height / 2
}

//旋转Y
int k = 0;
for(int i = 0; i < srcWidth; i++) {
int nPos = 0;
for(int j = 0; j < srcHeight; j++) {
dst[k] = src[nPos + i];
k++;
nPos += srcWidth;
}
}

for(int i = 0; i < srcWidth; i+=2){
int nPos = wh;
for(int j = 0; j < uvHeight; j++) {
dst[k] = src[nPos + i];
dst[k + 1] = src[nPos + i + 1];
k += 2;
nPos += srcWidth;
}
}
return;

热点内容
文件夹2寸 发布:2024-04-28 19:42:48 浏览:656
怎么用服务器的ip做内网穿透 发布:2024-04-28 19:28:52 浏览:925
常用的单向哈希算法有 发布:2024-04-28 19:16:04 浏览:116
牛贝微信淘客源码 发布:2024-04-28 19:09:16 浏览:33
传奇装备强化脚本 发布:2024-04-28 18:34:29 浏览:329
QQ如何撤销以储存的密码 发布:2024-04-28 18:32:13 浏览:321
ttsandroid中文 发布:2024-04-28 18:30:38 浏览:766
修改密码后为什么连接不了 发布:2024-04-28 18:16:48 浏览:743
cfm安卓转苹果在哪个买 发布:2024-04-28 18:07:15 浏览:161
编译器错误都是什么意思 发布:2024-04-28 17:31:30 浏览:74