
正文
yuvandroid的简单介绍
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
如何在Android上快速显示yuv数据
你说的是OpenGL ES么?似乎不行,可以试试用着色器编程把YUV转成RGB 查看原帖
相关问答
Q1: Android Camera提取出来的yuv源数据怎么提取y,u,v分量
Android
camera采集到的可以是yuv420sp也可以食yuv420p。我知道yuv420中yuv的分布。现在主要有个前提是从Android
Camera
中采集到的yuv420数据,这个byte[]的长度是一倍的视频宽高乘积,不是1.5倍。在jni里面获取到的长度又确实是1.5倍,但是在jni里面转换为jbyte*
的长度还是1倍,就不知道怎么弄了~
查看原帖
Q2: 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 copy
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;
Q3: android camera 采集到的数据是yuv吗
是,android camera初始采集到的格式是yuv格式的,图像绘制的时候会转换成rgb格式的。
Q4: android可否在NDK部分直接采集yuv图像
android是不可以在NDK部分直接采集yuv图像的,采集图像要用电脑中的扫描仪。
扫描仪是文字和图片输入的主要设备,相当于电脑的眼睛,能够通过光电器件把光信号转换为电信号,把电信号通过模数转换器转化为数字信号传输到电脑中,把大量的文字、图片信息输入到电脑中。
扫描仪的关键器件是电荷耦合器,采用三棱镜分色光学系统,以三棱镜来分离自然光为红、绿、蓝三原色来扫描图形。
用平板式扫描仪把文件扫描到电脑上的时候,要把文字和图片固定在一个玻璃窗口中,扫描头在文字或图片下移动,接受来自文字或图片的反射光,这些反射线由一个镜面系统进行反射,通过凸透镜把光聚焦到光敏二极管上面,把光变成电流,最后再转换成数字信息存储在电脑中,它能一次扫描,读入一整页的文字或图片。
扫描仪的性能指标包括:光学分辨率、色彩位数、扫描速度和幅面大小。光学分辨率也叫水平分辨率,单位为像素/英寸或点/英寸。色彩位数是扫描仪对图片色彩的分辨能力。
Q5: android yuv怎么转换成RGB565?
参数分别是宽,高,原数据指针,转化后的目标数据指针。
你找的这个函数是用C写的,而你的save(byte[] yuv420, String path, int width, int height,int quality)是JAVA,因此你要使用JNI。或者你把cvt_420p_to_rgb565函数转成JAVA版。
举个例子 使用jni(实际自己测试):
cvt_420p_to_rgb565修改为
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jobjectArray JNICALL 你的包名_类名_cvt420pToRGB565(JNIEnv * env, jobject obj,jint width, jint height,jcharArray srcData,jcharArray dstData);
#ifdef __cplusplus
};
#endif
JNIEXPORT jobjectArray JNICALL 你的包名_类名_cvt420pToRGB565(JNIEnv * env, jobject obj,jint width, jint height,jcharArray srcData,jcharArray dstData)
{
unsigned char * src =(unsigned char *) (env- GetByteArrayElements(srcData, 0));
unsigned char * dst =(unsigned char *) (env- GetByteArrayElements(dstData, 0));
下面照抄!!







