YUV轉為RGB24(Java版本實現)


YUV簡介

一般來說,直接采集到的視頻數據是RGB24的格式,RGB24一幀的大小size=width×heigth×3 Byte,RGB32的size=width×heigth×4 Byte。如果是I420(即YUV標准格式4:2:0)的數據量是size=width×heigth×1.5 Byte。在采集到RGB24數據后,需要對這個格式的數據進行第一次壓縮。即將圖像的顏色空間由RGB24轉化為IYUV。因為X264在進行編碼的時候需要標准的YUV(4:2:0)。但是這里需要注意的是,雖然YV12也是(4:2:0),但是YV12和I420的卻是不同的,在存儲空間上面有些區別。區別如下:

  • YV12 : 亮度(行×列) + V(行×列/4) + U(行×列/4)
  • I420 : 亮度(行×列) + U(行×列/4) + V(行×列/4)

可以看出,YV12和I420基本上是一樣的,就是UV的順序不同。

YUV420p 和 YUV420的區別在於存儲格式上有區別:

  • YUV420p:yyyyyyyy uuuu vvvvv
  • YUV420: yuv yuv yuv

另外需要注意的是海康威視設備回調數據類型為YV12格式;而大華設備回調數據類型為YUV420格式。

// YV12格式一個像素占1.5個字節
private byte[] YV12_To_RGB24(byte[] yv12, int width, int height) {
	if(yv12 == null) {
		return null;
	}
	
	int nYLen = (int)width * height;
	int halfWidth = width >> 1;
	
	if(nYLen<1 || halfWidth<1) {
		return null;
	}
	
	// yv12's data structure  
	// |WIDTH |  
	// y......y--------  
	// y......y   HEIGHT  
	// y......y  
	// y......y--------  
	// v..v  
	// v..v  
	// u..u  
	// u..u
	
	// Convert YV12 to RGB24
	byte[] rgb24 = new byte[width * height * 3];
	int[] rgb = new int[3];
	int i, j, m, n, x, y;
	m = -width;
	n = -halfWidth;
	for(y=0; y<height; y++) {
		m += width;
		if(y%2 != 0) {
			n += halfWidth;
		}
		
		for(x=0; x<width; x++) {
			i = m+x;
			j = n + (x>>1);
			rgb[2] = (int)((int)(yv12[i]&0xFF) + 1.370705 * ((int)(yv12[nYLen+j]&0xFF) - 128)); // r  
			rgb[1] = (int)((int)(yv12[i]&0xFF) - 0.698001 * ((int)(yv12[nYLen+(nYLen>>2)+j]&0xFF) - 128)  - 0.703125 * ((int)(yv12[nYLen+j]&0xFF) - 128));   // g  
			rgb[0] = (int)((int)(yv12[i]&0xFF) + 1.732446 * ((int)(yv12[nYLen+(nYLen>>2)+j]&0xFF) - 128)); // b  
			
			//j = nYLen - iWidth - m + x;  
			//i = (j<<1) + j;    //圖像是上下顛倒的  
			
			j = m + x;
			i = (j<<1) + j;
				
			for(j=0; j<3; j++) {
				if(rgb[j]>=0 && rgb[j]<=255) {
					rgb24[i+j] = (byte)rgb[j];
				} else {
					rgb24[i+j] = (byte) ((rgb[j] < 0)? 0 : 255);
				}
			}
		}
	}
	
	return rgb24;
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM