MFC 如何获取视频文件的第一帧 在MFC环境下如何获取视频文件(如avi或者mpeg)的第一帧,我想使用它的第一帧进行视频文件预览功能。请高手指点方向!谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1 MFC环境下,可以用DirectShow,不过,要保证安装了相应的codec,否则不能解码。至于DirectShow怎么用,那相当复杂,至少要学上两周才能进行这个问题2 使用AviFile函数,比如AviFileOpen,MSDN上有介绍,相对简单一些,不过估计也要一周才能熟练掌握。 将视频文件做为Source Filter,然后用GetCurrentimage就可以了。 以下抓视频文件第一帧并显示的代码 CString strFileName; CFileDialog fd(TRUE); if (fd.DoModal()==IDOK) { IMediaDet* pDet=NULL; CoCreateInstance(CLSID_MediaDet,NULL,CLSCTX_INPROC_SERVER,IID_IMediaDet,(void**)&pDet); CComBSTR filename(fd.GetFileName()); pDet->put_Filename(filename); CRect rect; m_Movie.GetClientRect(&rect); LONG widht=rect.Width(),hight=rect.Height(),buffsize=0;//大小可自己定义 pDet->GetBitmapBits(0/*这里可以设置任何时间,这里的0表示第一帧*/,&buffsize,NULL,widht,hight); if (widht==0||hight==0) { AfxMessageBox(TEXT("hb is NULL")); } CHAR* buff=new CHAR[buffsize]; pDet->GetBitmapBits(0,0,buff,widht,hight); LPBITMAPINFOHEADER pBih=(LPBITMAPINFOHEADER)buff; HDC hdc=::GetDC(NULL); void* pData=buff+sizeof(BITMAPINFOHEADER); BITMAPINFO bi; ZeroMemory(&bi,sizeof(BITMAPINFO)); CopyMemory(&(bi.bmiHeader),pBih,sizeof(BITMAPINFOHEADER)); HBITMAP hb=::CreateDIBitmap(hdc,pBih,CBM_INIT,pData,&bi,DIB_RGB_COLORS); CDC memDC; CDC* dc=m_Movie.GetDC();//m_Movie是CStatic控件变量 memDC.CreateCompatibleDC(dc); memDC.SelectObject(hb); dc->StretchBlt(0,0,rect.Width(),rect.Height(),&memDC,0,0,widht,hight,SRCCOPY); delete []buff; pDet->Release(); } 我要怎么才能给你们分数啊,谢谢。这个问题我解决了,基本上是使用directshow完成的。不过比较的麻烦 用CAsyncSocket的派生类做TELNET,如何发送TELNET的COMMAND? 如何提取图像的颜色 mfc绘图刷新 再散分一次~,请大家笑纳 怎么实现netstat的功能? 我是计算机系大三学生,我该怎么学 下面这段程序中结果变为1,-1,-4.不知为何???把0x99变了后结果也变.谢谢! 一个简单的msflexgrid的问题!如何设置CellAlignment属性 一个软件共享的问题。 请问如何编程实现在局域网内实现数据的共享 扇形渐变填充 用VC如何把一个对话框设置成WS_CHILD属性?
2 使用AviFile函数,比如AviFileOpen,MSDN上有介绍,相对简单一些,不过估计也要一周才能熟练掌握。
CFileDialog fd(TRUE);
if (fd.DoModal()==IDOK)
{
IMediaDet* pDet=NULL;
CoCreateInstance(CLSID_MediaDet,NULL,CLSCTX_INPROC_SERVER,IID_IMediaDet,(void**)&pDet);
CComBSTR filename(fd.GetFileName());
pDet->put_Filename(filename);
CRect rect;
m_Movie.GetClientRect(&rect);
LONG widht=rect.Width(),hight=rect.Height(),buffsize=0;//大小可自己定义
pDet->GetBitmapBits(0/*这里可以设置任何时间,这里的0表示第一帧*/,&buffsize,NULL,widht,hight);
if (widht==0||hight==0)
{
AfxMessageBox(TEXT("hb is NULL"));
}
CHAR* buff=new CHAR[buffsize];
pDet->GetBitmapBits(0,0,buff,widht,hight);
LPBITMAPINFOHEADER pBih=(LPBITMAPINFOHEADER)buff;
HDC hdc=::GetDC(NULL);
void* pData=buff+sizeof(BITMAPINFOHEADER); BITMAPINFO bi;
ZeroMemory(&bi,sizeof(BITMAPINFO));
CopyMemory(&(bi.bmiHeader),pBih,sizeof(BITMAPINFOHEADER));
HBITMAP hb=::CreateDIBitmap(hdc,pBih,CBM_INIT,pData,&bi,DIB_RGB_COLORS); CDC memDC;
CDC* dc=m_Movie.GetDC();//m_Movie是CStatic控件变量
memDC.CreateCompatibleDC(dc);
memDC.SelectObject(hb);
dc->StretchBlt(0,0,rect.Width(),rect.Height(),&memDC,0,0,widht,hight,SRCCOPY);
delete []buff;
pDet->Release(); }
这个问题我解决了,基本上是使用directshow完成的。不过比较的麻烦