在用VC做视频通信软件时遇到的问题,希望高手指点,急!急!急!

uuhua9 2010-05-20 09:46:15
我是菜鸟,做一个视频通信的软件.遇到调试不能过,是RGB转YUV处,请大家帮帮忙看看,谢谢。。。

从摄像头采集到视频数据-->编码-->传输->解码->播放;

在编码之前进行RGB-->YUV的转换,如下代码:

void CPTPHelpDlg::SendVideo(BYTE *data,int size)
{
CRect wndrect;
Bits bits; // Various count about compression


if(vidcap->isOver==TRUE)
return;

if(data==NULL)
return;


// Display the captured frame...
if(isViewLocalVideo)
{

::DrawDibDraw(hdib,
m_hdc,
local_wnd_x, // dest : left pos
local_wnd_y, // dest : top pos
IMAGE_WIDTH*1.5,//-1, // don't stretch
IMAGE_HEIGHT*1.5,//-1, // don't stretch
&m_bmpinfo->bmiHeader, // bmp header info
data, // bmp data
0, // src :left
0, // src :top
IMAGE_WIDTH, // src : width
IMAGE_HEIGHT, // src : height
DDF_SAME_DRAW // use prev params....
);

}

if(isVideoSend)
{

//log.WriteString("\n Converting to YUV format..");

//Convert the data from rgb format to YUV format
ConvertRGB2YUV(IMAGE_WIDTH,IMAGE_HEIGHT,data,yuv);


// Reset the counter
count=0;

//Compress the data...to h263
cparams.format=CPARAM_CIF;
cparams.inter = CPARAM_INTRA;
cparams.Q_intra = 8;
cparams.data=yuv; // Data in YUV format...
CompressFrame(&cparams, &bits);

// Transmit the compressed frame
//log.WriteString("Transmitting the frame");
dvideo.SendVideoData(cdata,count);

}

}



// Conversion from RGB to YUV420
int RGB2YUV_YR[256], RGB2YUV_YG[256], RGB2YUV_YB[256];
int RGB2YUV_UR[256], RGB2YUV_UG[256], RGB2YUV_UBVR[256];
int RGB2YUV_VG[256], RGB2YUV_VB[256];

void InitLookupTable()
{
int i;

for (i = 0; i < 256; i++) RGB2YUV_YR[i] = (float)65.481 * (i<<8);
for (i = 0; i < 256; i++) RGB2YUV_YG[i] = (float)128.553 * (i<<8);
for (i = 0; i < 256; i++) RGB2YUV_YB[i] = (float)24.966 * (i<<8);
for (i = 0; i < 256; i++) RGB2YUV_UR[i] = (float)37.797 * (i<<8);
for (i = 0; i < 256; i++) RGB2YUV_UG[i] = (float)74.203 * (i<<8);
for (i = 0; i < 256; i++) RGB2YUV_VG[i] = (float)93.786 * (i<<8);
for (i = 0; i < 256; i++) RGB2YUV_VB[i] = (float)18.214 * (i<<8);
for (i = 0; i < 256; i++) RGB2YUV_UBVR[i] = (float)112 * (i<<8);
}

//
// Convert from RGB24 to YUV420
//
int ConvertRGB2YUV(int w,int h,unsigned char *bmp,unsigned int *yuv)
{

unsigned int *u,*v,*y,*uu,*vv;
unsigned int *pu1,*pu2,*pu3,*pu4;
unsigned int *pv1,*pv2,*pv3,*pv4;
unsigned char *r,*g,*b;
int i,j;

uu=new unsigned int[w*h];
vv=new unsigned int[w*h];

if(uu==NULL || vv==NULL)
return 0;

y=yuv;
u=uu;
v=vv;

// Get r,g,b pointers from bmp image data....
r=bmp;
g=bmp+1;
b=bmp+2;


//Get YUV values for rgb values...

for(i=0;i<h;i++)
{

for(j=0;j<w;j++)
{
*y++=( RGB2YUV_YR[*r] +RGB2YUV_YG[*g]+RGB2YUV_YB[*b]+1048576)>>16;
*u++=(-RGB2YUV_UR[*r] -RGB2YUV_UG[*g]+RGB2YUV_UBVR[*b]+8388608)>>16;
*v++=( RGB2YUV_UBVR[*r]-RGB2YUV_VG[*g]-RGB2YUV_VB[*b]+8388608)>>16;

r+=3;
g+=3;
b+=3;
}

}

在红色函数出错,调试出现access violate这样的错误。

不知道是不是data指针传到RGB2YUV函数的形参char*bmp时出错,因为调试最后停在了

*y++=( RGB2YUV_YR[*r] +RGB2YUV_YG[*g]+RGB2YUV_YB[*b]+1048576)>>16;处,应该是RGB2YUV_YR[*r]这个值得不到。。。。

我知道的就这么多,我是一个菜鸟,请大家多多指教啊,,,

提问者:飞鸟... - 初学一级
问题补充:首先十分感谢eaglet。
单步 调试出错时i=193,j=328,*r是expression cannot evaluate.我设置了w*h=352*288;
bmp指针是从vfw采集缓冲传过来的,他的大小都是按默认的...我在本地显示视频没问题,YUV定义应该没错:
unsigned int yuv[ CIF_WIDTH*CIF_HEIGHT + (CIF_WIDTH*CIF_HEIGHT)/2 ];

我还是不知道怎么弄,可否再指导下啊,。。或留个QQ,谢谢哈~~
...全文
252 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
99263 2010-05-30
[Quote=引用 7 楼 uuhua9 的回复:]
m_bmpinfo.bmiHeader.biSizeImage=0;
[/Quote]

这个地方有问题,不能为0.
回复
fjcy118 2010-05-27
学习一下
回复
uuhua9 2010-05-27
capGetVideoFormat(m_capwnd,&m_bmpinfo,sizeof(m_bmpinfo));
m_bmpinfo.bmiHeader.biWidth=IMAGE_WIDTH;
m_bmpinfo.bmiHeader.biHeight=IMAGE_HEIGHT;
m_bmpinfo.bmiHeader.biBitCount=24;
m_bmpinfo.bmiHeader.biCompression=BI_RGB;
m_bmpinfo.bmiHeader.biSizeImage=0;
BOOL ret=capSetVideoFormat(m_capwnd,&m_bmpinfo,sizeof(m_bmpinfo));
我这样设置也得不到IMAGE_WIDTH*IMAGE_HEIGHT*3的数据。有没有其它的方法啊?
[Quote=引用 5 楼 99263 的回复:]
需要对采集的格式进行设置,输出的数据类型是与采集前的设置相关的。
[/Quote]
回复
99263 2010-05-26
需要对采集的格式进行设置,输出的数据类型是与采集前的设置相关的。
回复
uuhua9 2010-05-26
谢谢你,是这个问题,bmp指向的是 LPVIDEOHDR->lpData里存放的视频数据,这里的数据只有w*h*2,这个大小的格式是不是就是YUV422的格式啊?还是其它什么格式?[Quote=引用 1 楼 oldn_cc_bird 的回复:]
这样的话应该是你的bmp对应的数据区内容少,bits和宽高不是一个匹配关系
[/Quote]
回复
uuhua9 2010-05-26
谢谢追梦人和郭亮,我还想部一个问题:
在VC6.0里利用vfw.h实时捕获视频时, LPVIDEOHDR->lpData里存放的视频数据是什么格式的?我要RGB24的,要怎么设置。
谢谢~
回复
99263 2010-05-25
用现有的SDK吧:[URL=http://www.anychat.cn/faq/]http://www.anychat.cn/faq/[/URL],有Demo程序的VC++源代码可供参考的。
回复
oldn123 2010-05-20
这样的话应该是你的bmp对应的数据区内容少,bits和宽高不是一个匹配关系
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2010-05-20 09:46
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……