求YUV420数据流处理方法(YUV解码)

east_0012 2010-08-19 11:40:44
最近遇到个问题,摄像头把YUV数据流给我传过来,我通过什么方式能把它转换成图片直接画出来,我给大家说说我现在的想法。

数据流是一段一段传的,在网上有YUV 转 RGB 什么的算法公式什么的,我首先要接收完这段流,然后在找YUV分量值,这样面写太慢了,肯定不行。

我想用directShow能不能把YUV数据流转换成图片直接画出来,这样一边获取流一边画应该就不慢了。

急急急,这些都是很经典的问题了,问问大家有什么好的办法,说说大家的想法互相交流下,目前我是用C#解,我获取到的就

是一段字节流,什么都没有,还知道发过来的流最后转成的图像是720*576的,剩余的不知道了,而且我想的编码什么的找找

有什规律吧,让我失望了,一直是乱码。
...全文
556 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinhaijian 2010-08-19
  • 打赏
  • 举报
回复
C++里写dll库,查询下就有
http://blog.sina.com.cn/s/blog_628cc2b70100im4a.html
east_0012 2010-08-19
  • 打赏
  • 举报
回复
汗,很失望,结贴了!
east_0012 2010-08-19
  • 打赏
  • 举报
回复
您是否能给我一个C++写好的dll库,能让C#掉就行了,100分就归你了,或告诉我怎么在C++里面写dll库啊,我不熟悉C++,咱俩反了
jinhaijian 2010-08-19
  • 打赏
  • 举报
回复
C#不熟悉
east_0012 2010-08-19
  • 打赏
  • 举报
回复
是,你说的很对大哥,我现在要用C#调,可是这些都是C++写的,网上这方面的资料是很多,我用C#调要传RGB的 buffer的指针什么的,我应该怎么调?

void ConvertYUVtoRGB(unsigned char *src0,unsigned char *src1,unsigned char *src2,unsigned char *dst_ori,int width, int height)
{
extern long int crv_tab[];
extern long int cbu_tab[];
extern long int cgu_tab[];
extern long int cgv_tab[];
extern long int tab_76309[];
int y11, y21;
int y12, y22;
int y13, y23;
int y14, y24;
int u, v;
int i, j;
int c11, c21, c31, c41;
int c12, c22, c32, c42;
unsigned int DW;
unsigned int *id1, *id2;
unsigned char *py1, *py2, *pu, *pv;
unsigned char *d1, *d2;

d1 = dst_ori;
d1 += width * height * 3 - width * 3;
d2 = d1 - width * 3;

py1 = src0;
pu = src1;
pv = src2;
py2 = py1 + width;

id1 = (unsigned int *) d1;
id2 = (unsigned int *) d2;
for (j = 0; j < height; j += 2)



{
/* line j + 0 */
for (i = 0; i < width; i += 4)
{
u = *pu++;
v = *pv++;
c11 = crv_tab[v];
c21 = cgu_tab[u];
c31 = cgv_tab[v];
c41 = cbu_tab[u];
u = *pu++;
v = *pv++;
c12 = crv_tab[v];
c22 = cgu_tab[u];
c32 = cgv_tab[v];
c42 = cbu_tab[u];

y11 = tab_76309[*py1++]; /* (255/219)*65536 */
y12 = tab_76309[*py1++];
y13 = tab_76309[*py1++]; /* (255/219)*65536 */
y14 = tab_76309[*py1++];

y21 = tab_76309[*py2++];
y22 = tab_76309[*py2++];
y23 = tab_76309[*py2++];
y24 = tab_76309[*py2++];

/* RGBR */
DW = ((clp[(y11 + c41) >> 16])) |
((clp[(y11 - c21 - c31) >> 16]) << 8) |
((clp[(y11 + c11) >> 16]) << 16) |
((clp[(y12 + c41) >> 16]) << 24);
*id1++ = DW;

/* GBRG */
DW = ((clp[(y12 - c21 - c31) >> 16])) |
((clp[(y12 + c11) >> 16]) << 8) |
((clp[(y13 + c42) >> 16]) << 16) |
((clp[(y13 - c22 - c32) >> 16]) << 24);
*id1++ = DW;

/* BRGB */
DW = ((clp[(y13 + c12) >> 16])) |
((clp[(y14 + c42) >> 16]) << 8) |
((clp[(y14 - c22 - c32) >> 16]) << 16) |
((clp[(y14 + c12) >> 16]) << 24);
*id1++ = DW;

/* RGBR */
DW = ((clp[(y21 + c41) >> 16])) |
((clp[(y21 - c21 - c31) >> 16]) << 8) |
((clp[(y21 + c11) >> 16]) << 16) |
((clp[(y22 + c41) >> 16]) << 24);
*id2++ = DW;

/* GBRG */
DW = ((clp[(y22 - c21 - c31) >> 16])) |
((clp[(y22 + c11) >> 16]) << 8) |
((clp[(y23 + c42) >> 16]) << 16) |
((clp[(y23 - c22 - c32) >> 16]) << 24);
*id2++ = DW;

/* BRGB */
DW = ((clp[(y23 + c12) >> 16])) |
((clp[(y24 + c42) >> 16]) << 8) |
((clp[(y24 - c22 - c32) >> 16]) << 16) |
((clp[(y24 + c12) >> 16]) << 24);
*id2++ = DW;
}
id1 -= (9 * width) >> 2;
id2 -= (9 * width) >> 2;
py1 += width;
py2 += width;
}
}


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zsJum/archive/2007/11/18/1891155.aspx
jinhaijian 2010-08-19
  • 打赏
  • 举报
回复
directshow本身就支持color space converter(色彩空间)转换的。
如果你不想用directshow来画,自己画。
数据流是一段一段传的,在网上有YUV 转 RGB 什么的算法公式什么的,我首先要接收完这段流,然后在找YUV分量值,这样面写太慢了,肯定不行
数据流不是一段一段,而是一帧一帧的传。YUV的分类是很容易算的,在camera中,一般传过来的是YV12数据,首先是Y分量,然后才是V和U的分量。如果你的视频长宽式w和h,数据首地址是P,那么Y=P,V=w*h + p,U=V + w*h/4。
对于预览来说,YUV->RGB的速度还是很快的。

7,655

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧