public class DecodeYUV420sp {
static public void decodeYUV420SP(int[] rgb, byte[] yuv420sp, int width, int height) {
final int frameSize = width * height; for (int j = 0, yp = 0; j < height; j++) {
int uvp = frameSize + (j >> 1) * width, u = 0, v = 0;
for (int i = 0; i < width; i++, yp++) {
int 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;
} int y1192 = 1192 * y;
int r = (y1192 + 1634 * v);
int g = (y1192 - 833 * v - 400 * u);
int b = (y1192 + 2066 * u); 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; rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00)
| ((b >> 10) & 0xff);
}
}
}
}
自己解决了- - 写了一个类
static public void decodeYUV420SP(int[] rgb, byte[] yuv420sp, int width, int height) {
final int frameSize = width * height; for (int j = 0, yp = 0; j < height; j++) {
int uvp = frameSize + (j >> 1) * width, u = 0, v = 0;
for (int i = 0; i < width; i++, yp++) {
int 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;
} int y1192 = 1192 * y;
int r = (y1192 + 1634 * v);
int g = (y1192 - 833 * v - 400 * u);
int b = (y1192 + 2066 * u); 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; rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00)
| ((b >> 10) & 0xff);
}
}
}
}
自己解决了- - 写了一个类
可以考虑用JNI解码,或者用YuvImage应该也可以
RGB420转化 RGB 彩色yuv颜色会失真
RGB420转化 RGB 彩色yuv颜色会失真
失真应该是可以忽略不计的。Yuv转RGB的算法有很多,自己搜一下吧
RGB420转化 RGB 彩色yuv颜色会失真
失真应该是可以忽略不计的。Yuv转RGB的算法有很多,自己搜一下吧YUV转RGB 看看算法就那么几种 都会失真 颜色
你的问题我觉得可能是算法导致的,你先不要用优化的YUV转RGB算法试试,就是直接用浮点运算的那个算法,百度应该有。
YUV有很多格式,比如你的YUV是yuv420p的,如果用yuv420sp的转码方式,就会这样
420sp 420p - -如何分辨
IYUV 格式 会显示正确
YYY.................
UUU..............
VVV.................
| ((b >> 10) & 0xff);
把 rgb[yp] 改成rgb[i*height+height-1-j] 试试
数据源- - 别人给 - -
http://url.cn/QEcixm
数据源这个yuv 文件
我是说可以把YUV420的算法改成YUV411的 你百度一下YUV的各种格式
我是说可以把YUV420的算法改成YUV411的 你百度一下YUV的各种格式YUV12 格式 貌似是有 符号的读入