论坛: 编程破解 标题: 关于VFW对AVI的操作 复制本贴地址    
作者: ncutwang [ncutwang]    论坛用户   登录
这几天要编一程序,要求如下:采用C/S的形式在局域网上实现AVI文件的点播.我最初的想法是这样的:把

AVI文件中的一祯图像分解出来,进行压缩,网络传输然后在客户端进行解压并显示出来.动手之后才发现这

里面有太多的问题了,在网上搜了一下,中文网页关于VFW对AVI文件进行编辑的介绍很少,而且多是类同的

很不详细的几句话.在这里求教各位了!
问题一:要实现该程序,我的想法是否正确?应该传输的是AVI文件中的一祯的图像还是传输什么东西(不能

说把整个AVI文件传输过去,要求服务端和客户端是实时的).
问题二:下面是我尝试的把AVI中的一祯图像保存为BMP文件的一段程序.结果是能够生成一225k的BMP文件,

但打开看时,该文件是一片灰的,根本没有图像.为什么??????????!!!!!!!!!
程序如下:
定义: WORD wVer;
PAVIFILE pfile;
PAVISTREAM ps;
HRESULT hr;
PAVISTREAM pvstr;
PGETFRAME pget;
LPBITMAPINFOHEADER lpbi;
int cy;
int cx;
BYTE *pData;
BITMAPINFO *m_pBMI;
PAVISTREAM pavi;
AVIFILEINFO pfi;
AVISTREAMINFO strinfo;
初始化:pfile=NULL;
ps=NULL;
m_pBMI=NULL;
pData=NULL;
实现段:AVIFileInit();
hr=AVIFileOpen(&pfile,"C:\cat.avi",OF_READ,NULL);
if(hr!=AVIERR_OK)
MessageBox("1111!");

hr=AVIFileInfo(pfile,&pfi,sizeof(AVIFILEINFO));

cy=pfi.dwHeight;
cx=pfi.dwWidth;

hr=AVIFileGetStream(pfile,&pvstr,streamtypeVIDEO,0);
if(hr!=AVIERR_OK)
MessageBox("2222!");
hr=AVIStreamInfo(pvstr,&strinfo,sizeof(strinfo));
m_pBMI=new BITMAPINFO;
m_pBMI->bmiHeader.biBitCount=24;
m_pBMI->bmiHeader.biClrImportant=0;
m_pBMI->bmiHeader.biClrUsed=0;
m_pBMI->bmiHeader.biCompression=BI_RGB;
m_pBMI->bmiHeader.biHeight=cy;
m_pBMI->bmiHeader.biWidth=cx;
m_pBMI->bmiHeader.biPlanes=1;
m_pBMI->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
m_pBMI->bmiHeader.biXPelsPerMeter=0;
m_pBMI->bmiHeader.biYPelsPerMeter=0;
m_pBMI->bmiHeader.biSizeImage=0;
pData=(BYTE*) new char[cx*cy*3];
hr=AVIStreamRead(pvstr,111,1,pData,cx*cy*3,NULL,NULL);
if(hr!=AVIERR_OK)
MessageBox("rrrr!");
CFile theFile("c:\\ok.bmp",CFile::modeWrite|CFile::modeCreate);
BITMAPFILEHEADER FileHeader;
FileHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
FileHeader.bfReserved1=FileHeader.bfReserved2=0;
FileHeader.bfSize=FileHeader.bfOffBits+cx*cy*3;
FileHeader.bfType=0x4d42;

theFile.Write(&FileHeader,sizeof(BITMAPFILEHEADER));
theFile.Write(m_pBMI,sizeof(BITMAPINFOHEADER));
theFile.Write(pData,cx*cy*3);

theFile.Close();
//pget=AVIStreamGetFrameOpen(pvstr,NULL);
//lpbi=(LPBITMAPINFOHEADER)AVIStreamGetFrame(pget,1);

delete m_pBMI;
delete pData;
AVIFileRelease(pfile);
AVIFileExit();
问题三:AVI文件中提取的图像是压缩的还是不压缩的?
问题四:
LPBITMAPINFOHEADER lpbi;
pget=AVIStreamGetFrameOpen(pvstr,NULL);
lpbi=(LPBITMAPINFOHEADER)AVIStreamGetFrame(pget,1);
如果象上面一样提取一祯返回的是BITMAPINFOHEADER文件,怎么通过它来获得相关的文件头

BIYMAFILEHEADER和图像数据呢?如果要传输,把什么传过去?
问题五:.......以后再请教吧


地主 发表时间: 04-05-15 09:26

回复: ncutwang [ncutwang]   论坛用户   登录
问题四:
LPBITMAPINFOHEADER lpbi;
pget=AVIStreamGetFrameOpen(pvstr,NULL);
lpbi=(LPBITMAPINFOHEADER)AVIStreamGetFrame(pget,1);
如果象上面一样提取一祯返回的是BITMAPINFOHEADER文件,怎么通过它来获得相关的文件头

BIYMAFILEHEADER和图像数据呢?如果要传输,把什么传过去?

该问题已初步解决:
AVIStreamGetFrame返回的尾LPBTIMAPINFOHEADER文件,利用它可以生成图像.
代码基本为:
write(BTIMAPFILEHEADER *fileheader)
write(BITMAPINFOHEADER *infoheader)
这种方法生成的图像很大,肯定无法直接传输该文件,谁做过这种东西啊,救救!


B1层 发表时间: 04-05-15 20:43

回复: ncutwang [ncutwang]   论坛用户   登录
.............................

B2层 发表时间: 04-05-22 11:50

回复: ncutwang [ncutwang]   论坛用户   登录
传送过去解压出来的图像的下面`的部分为黑块!!!!!!!??????

B3层 发表时间: 04-05-28 14:44

回复: ncutwang [ncutwang]   论坛用户   登录
俺做完了,不说了

B4层 发表时间: 04-06-04 15:51

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号