如何取出AVI视频文件中的一帧并显示在屏幕上(每一帧为256色位图) 如题。请多多指教? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 msdn里aviview的例子你看看吧。 把avi文件中的一个视频包取出来就可以显示了 以下是我写的程序在CAVIplayerDoc.h声明//略public: PAVIFILE pFile; PAVISTREAM pavi; AVISTREAMINFO avis; PGETFRAME pgf; LPBITMAPINFOHEADER lpbi; LPBYTE lpBuf; BOOL m_bOpened;//判断文件是否打开在另一个文件中:void CAVIplayerDoc::OnFileOpen(){ CFileDialog dlg(TRUE,"AVI文件(.avi)|*.avi||",NULL,OFN_HIDEREADONLY, "AVI文件(.avi)|*.avi||",NULL); CString filename; if (dlg.DoModal()==IDOK) { filename=dlg.GetPathName(); HRESULT hr; AVIFileInit(); hr=AVIFileOpen(&pFile,filename,OF_SHARE_DENY_NONE|OF_READ, NULL); if (hr !=AVIERR_OK) { AVIFileExit(); AfxMessageBox("无法打开AVI文件"); return; } hr=AVIFileGetStream(pFile,&pavi,streamtypeVIDEO,0); if (hr!=AVIERR_OK) { AVIFileExit(); AfxMessageBox("无法打开AVI文件"); return; } AVISTREAMINFO si; AVIStreamInfo(pavi,&si,sizeof(AVISTREAMINFO)); pgf = AVIStreamGetFrameOpen(pavi, NULL); lpbi= (LPBITMAPINFOHEADER)AVIStreamGetFrame(pgf, 1);//取第一帧 lpBuf= LPBYTE(lpbi + lpbi->biSize + 256 * sizeof(RGBQUAD)); m_bOpened=TRUE; UpdateAllViews(NULL); }}void CAVIplayerView::OnPaint(){ CPaintDC dc(this); CAVIplayerDoc* pDoc=GetDocument(); if (pDoc->m_bOpened) { SetDIBitsToDevice(dc.m_hDC,0,0,pDoc->lpbi->biWidth,pDoc->lpbi->biHeight, 0,0,0,pDoc->lpbi->biHeight,pDoc->lpBuf,(LPBITMAPINFO)pDoc->lpbi, DIB_RGB_COLORS); }}但图像总是无法显示出来,到底是什么原因呢?!!请各位大虾多多指教还有那位大虾用过DrawDibDraw函数,可以不用SetDIBitsToDevice而用DrawDibDraw函数吗?怎么用?! 我用DrawDibDraw可以在屏幕上显示一帧,但是想在一段时间内显示一系列帧时,用到了settimer函数,每隔1秒重画一帧,但是屏幕会很闪,不知大虾有什么其它方法使得屏幕不闪? 显示坐标,要在非模态对话框中,如何实现 求救!!!关于COMBO的一个简单问题 如何区分右键单击跟右键双击 如何将CString中的内容(内容为数值)转换成int(或long)类型? 如何给本地所有的UDP端口发一个广播包? 菜鸟一问,高分相送 不妨进来看看我的错误,能给个解答吗? 谁用过c#?究竟好在哪里? 请问钩子函数是什么意思? MFC 与flash控件通信 紧急求救:急急急! 菜鸟求救:如何用VC实现局域网内主机扫描,在线等待
在CAVIplayerDoc.h声明
//略
public:
PAVIFILE pFile;
PAVISTREAM pavi;
AVISTREAMINFO avis;
PGETFRAME pgf;
LPBITMAPINFOHEADER lpbi;
LPBYTE lpBuf; BOOL m_bOpened;//判断文件是否打开
在另一个文件中:
void CAVIplayerDoc::OnFileOpen()
{
CFileDialog dlg(TRUE,"AVI文件(.avi)|*.avi||",NULL,OFN_HIDEREADONLY,
"AVI文件(.avi)|*.avi||",NULL);
CString filename;
if (dlg.DoModal()==IDOK)
{
filename=dlg.GetPathName();
HRESULT hr;
AVIFileInit();
hr=AVIFileOpen(&pFile,filename,OF_SHARE_DENY_NONE|OF_READ,
NULL);
if (hr !=AVIERR_OK)
{ AVIFileExit();
AfxMessageBox("无法打开AVI文件");
return;
} hr=AVIFileGetStream(pFile,&pavi,streamtypeVIDEO,0);
if (hr!=AVIERR_OK)
{ AVIFileExit();
AfxMessageBox("无法打开AVI文件");
return;
} AVISTREAMINFO si;
AVIStreamInfo(pavi,&si,sizeof(AVISTREAMINFO));
pgf = AVIStreamGetFrameOpen(pavi, NULL);
lpbi= (LPBITMAPINFOHEADER)AVIStreamGetFrame(pgf, 1);//取第一帧
lpBuf= LPBYTE(lpbi + lpbi->biSize + 256 * sizeof(RGBQUAD));
m_bOpened=TRUE;
UpdateAllViews(NULL);
}
}void CAVIplayerView::OnPaint()
{
CPaintDC dc(this);
CAVIplayerDoc* pDoc=GetDocument(); if (pDoc->m_bOpened)
{
SetDIBitsToDevice(dc.m_hDC,0,0,pDoc->lpbi->biWidth,pDoc->lpbi->biHeight,
0,0,0,pDoc->lpbi->biHeight,pDoc->lpBuf,(LPBITMAPINFO)pDoc->lpbi,
DIB_RGB_COLORS);
}
}
但图像总是无法显示出来,到底是什么原因呢?!!
请各位大虾多多指教还有那位大虾用过DrawDibDraw函数,可以不用SetDIBitsToDevice而用DrawDibDraw函数吗?
怎么用?!