directshow 之 视频文件位图提取

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;
}

转载于:https://www.cnblogs.com/cngreatwall/archive/2011/09/02/2163557.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值