cngreatwall

赫赫盛唐艺轩

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

HRESULT CVideoSource::GetFameImageFromAVI(TCHAR * szAVIFileSource, TCHAR * szImageFileDest)
{
 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(szAVIFileSource);
 // 设置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(szImageFileDest);
 // 将第2帧保存为指定路径的位图文件
 hr = pDet->WriteBitmapBits(10, width, height, saveBSTR);
 if (FAILED(hr))
  return hr;

 return S_OK;
}

posted on 2011-09-02 11:46  cngreatwall  阅读(360)  评论(0编辑  收藏  举报