pBuf格式为YUV格式。即:
char * yBuffer= pBuf+16;
其中长度为:pFrameInfo->nHeight * pFrameInfo->nLinseSize[0];
Char * uBuffer= yBuffer + pFrameInfo->nHeight * pFrameInfo->nLinseSize[0];
其中长度为:pFrameInfo-> nHeight * pFrameInfo->nLinseSize[1]/2;
Char * vBuffer= uBuffer + pFrameInfo->nHeight * pFrameInfo->nLinseSize[1]/2;
其中长度为:pFrameInfo->nHeight * pFrameInfo->nLinseSize[2]/2;
注意:对于视频数据,前面有16个字节为YUV行扫描长度。
这就是我的YUV数据
如何转成RGB呢?
我查了一些资料
比如:
// YCbCr转换为RGB
for(i =0 ; i < dest->dwSize; )
{
UCHAR y,u,v;
y = sBuf[i+0];
u = sBuf[i+1];
v = sBuf[i+2];
double temp;
temp = 1.164383*(y- 16) + 0 + 1.596016*(v - 128);
dBuf[i] = (unsigned char)(temp < 0 ? 0 : (temp > 255 ? 255 : temp));
temp = (1.164383*(y- 16) - 0.391762*(u - 128) - 0.812969*(v - 128));
dBuf[i + 1] = (unsigned char)(temp < 0 ? 0 : (temp > 255 ? 255 : temp));
temp = 1.164383*(y- 16) + 2.017230*(u - 128) + 0;
dBuf[i + 2] = (unsigned char)(temp < 0 ? 0 : (temp > 255 ? 255 : temp));
i += 3;
}
可是有一事不明
Y:U:V=4:1:1
如果在一个for循环中,以Y的长度为准的话,U V 就要溢出啊
在我的理解中,yuv应该一样多才可以
我知道理解错了,可是就是不知到如何错的,所以来请教大家
yuv格式很多,你得咨询下获取到视频的设备提供商到底是采用什么格式的yuv,才能正确解码。可以看看http://blog.csdn.net/searchsun/article/details/2443867这篇文章介绍了yuv的知识,yuv有打包(packed)格式和平面(planar)格式,不同格式yuv存储方式不同,http://www.cnblogs.com/niloc/archive/2012/05/10/2495033.html#2731597这篇文章提到的hik的视频就是planar格式的yv12格式。对于4:1:1的问题,重复使用u和v,改写循环中u和v获取方式就可以了。
你的pFrameInfo->nLinseSize放的是什么,是满足下面这样的关系吗
nLineSize[0] == nWidth(像素宽),nLineSize[1] == nLineSize[2] == nLineSize[0] / 2
我猜是的,否则就不满足4:1:1的关系。
int iSrc = 0;
for (int i =0 ; i < dest->dwSize;)
{
y = yBuf[iSrc];
u = uBuf[iSrc / 4];
v = vBuf[iSrc / 4];
// ...
i += 3;
++iSrc;
}
按照上面的公式,一个得到的分量顺序分别是:y0 u0 v0; y1 u0 v0; y2 u0 v0; y3 u0 v0; y4 u1 v1,...每个u和v都被使用4次,个数也就和y分量个数相同。