HRESULT CFrameGrabberDlg::GrabFrameFromMovie() { HRESULT hr; // 定义IMediaDet接口实例 CComPtr< IMediaDet > pDet; hr = CoCreateInstance( CLSID_MediaDet, NULL, CLSCTX_INPROC_SERVER, IID_IMediaDet, (void**) &pDet ); if (FAILED(hr)) return hr; // 将影片文件名转换成BSTR类型 CComBSTR openBSTR(m_editOpenDir); // 设置IMediaDet接口的文件关联 hr = pDet->put_Filename(openBSTR); if (FAILED(hr)) return hr; // 从影片中检索视频流和音频流 long lStreams; hr = pDet->get_OutputStreams(&lStreams); if (FAILED(hr)) return hr; // 取出影片的视频流,因为帧的信息是保存在视频流中的 bool bFound = false; for (int i=0; i<lStreams; i++) { GUID major_type; hr = pDet->put_CurrentStream(i); if (SUCCEEDED(hr)) hr = pDet->get_StreamType(&major_type); if (FAILED(hr)) break; if (major_type == MEDIATYPE_Video) { bFound = true; break; } } if (!bFound) return VFW_E_INVALIDMEDIATYPE; long width = 0, height = 0; // 存储位图的宽和高(单位:象素) AM_MEDIA_TYPE mt; hr = pDet->get_StreamMediaType(&mt); if (SUCCEEDED(hr)) { if ((mt.formattype == FORMAT_VideoInfo) && (mt.cbFormat >= sizeof(VIDEOINFOHEADER))) { // 得到VIDEOINFOHEADER结构指针,VIDEOINFOHEADER结构包含一些与视频 // 有关的信息,其中含有BITMAPINFORHEADER结构 VIDEOINFOHEADER *pVih = (VIDEOINFOHEADER*)(mt.pbFormat); width = pVih->bmiHeader.biWidth; height = pVih->bmiHeader.biHeight; } else hr = VFW_E_INVALIDMEDIATYPE; MyFreeMediaType(mt); // 释放AM_MEDIA_TYPE结构 } if (FAILED(hr)) return hr; CComBSTR saveBSTR(m_editSaveDir); // 将第一帧保存为指定路径的位图文件 hr = pDet->WriteBitmapBits(0, width, height, saveBSTR); if (FAILED(hr)) return hr; return S_OK; } http://www.vckbase.com/document/viewdoc/?id=976