|
作者: 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号