频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

DirectShow入门之构建Graph图常用技术

来源:天极开发 作者: 出处:巧巧读书 2006-10-18 进入讨论组
下一页 1 2 3 4 
摘要:本文主要讲述了Graph图构建过程中常用的技巧,主要的内容如下:

  ·如何根据CLSID向graph中添加filter
  ·如何查找filter空闲的pin
  ·如何连接两个Filter
  ·如何获得filter或者pin的接口指针
  ·如何查找和某个filter的上下相连的filter
  ·如何删除graph中的所有filter
  ·如何利用Capture Graph Builder构建Graph图表

  如何根据CLSID向graph中添加filter

  下面的代码演示了如何利用CLSID生成一个filter,然后将其加入到graph图中

HRESULT AddFilterByCLSID(
 IGraphBuilder *pGraph, // Pointer to the Filter Graph Manager.
 const GUID& clsid, // CLSID of the filter to create.
 LPCWSTR wszName, // A name for the filter.
 IBaseFilter **ppF) // Receives a pointer to the filter.
{
 if (!pGraph || ! ppF) return E_POINTER;
 *ppF = 0;
 IBaseFilter *pF = 0;
 HRESULT hr = CoCreateInstance(clsid, 0, CLSCTX_INPROC_SERVER,
 IID_IBaseFilter, reinterpret_cast<void**>(&pF));
 if (SUCCEEDED(hr))
 {
  hr = pGraph->AddFilter(pF, wszName);
  if (SUCCEEDED(hr))
   *ppF = pF;
  else
   pF->Release();
 }
 return hr;
}

  在你的应用程序中,你可以这样用这个函数

IBaseFilter *pMux;
hr = AddFilterByCLSID(pGraph, CLSID_AviDest, L"AVI Mux", &pMux);

if (SUCCEEDED(hr))
{
 /* ... */
 pMux->Release();
}

  注:有些filter是不能通过with CoCreateInstance方法创建的。例如AVI Compressor Filter和WDM Video Capture filter

  如何查找filter空闲的pin

  看代码吧:

HRESULT GetUnconnectedPin(
 IBaseFilter *pFilter, // Pointer to the filter.
 PIN_DIRECTION PinDir, // Direction of the pin to find.
 IPin **ppPin) // Receives a pointer to the pin.
{
 *ppPin = 0;
 IEnumPins *pEnum = 0;
 IPin *pPin = 0;
 HRESULT hr = pFilter->EnumPins(&pEnum);
 if (FAILED(hr))
 {
  return hr;
 }
 while (pEnum->Next(1, &pPin, NULL) == S_OK)
 {
  PIN_DIRECTION ThisPinDir;
  pPin->QueryDirection(&ThisPinDir);
  if (ThisPinDir == PinDir)
  {
   IPin *pTmp = 0;
   hr = pPin->ConnectedTo(&pTmp);
   if (SUCCEEDED(hr)) // Already connected, not the pin we want.
   {
    pTmp->Release();
   }
   else // Unconnected, 这就是我们想要的pin,空闲的pin
   {
    pEnum->Release();
    *ppPin = pPin;
    return S_OK;
   }
  }
  pPin->Release();
 }
 pEnum->Release();
 // Did not find a matching pin.
 return E_FAIL;
}

  下面的代码演示了如何利用上面的函数来在一个filter查找一个输出的空闲的pin。

IPin *pOut = NULL;
HRESULT hr = GetUnconnectedPin(pFilter, PINDIR_OUTPUT, &pOut);
if (SUCCEEDED(hr))
{
 /* ... */
 pOut->Release();
}

  如何连接两个Filter

  下面的函数演示了如何将一个filter的输出pin和另一个filter的第一个空闲的输入pin进行连接。

HRESULT ConnectFilters(
 IGraphBuilder *pGraph, // Filter Graph Manager.
 IPin *pOut, // Output pin on the upstream filter.
 IBaseFilter *pDest) // Downstream filter.
{
 if ((pGraph == NULL) || (pOut == NULL) || (pDest == NULL))
 {
  return E_POINTER;
 }
 #ifdef debug
  PIN_DIRECTION PinDir;
  pOut->QueryDirection(&PinDir);
  _ASSERTE(PinDir == PINDIR_OUTPUT);
 #endif
 //找一个空闲的输入pin
 IPin *pIn = 0;
 HRESULT hr = GetUnconnectedPin(pDest, PINDIR_INPUT, &pIn);
 if (FAILED(hr))
 {
  return hr;
 }
 // Try to connect them.
 hr = pGraph->Connect(pOut, pIn);
 pIn->Release();
 return hr;
}

  下面是ConnectFilters的一个重载函数,但是第二个参数是一个指向filter的指针,而不是指向pin的指针,这个函数将两个filter连接起来。

HRESULT ConnectFilters(
 IGraphBuilder *pGraph,
 IBaseFilter *pSrc,
 IBaseFilter *pDest)
{
 if ((pGraph == NULL) || (pSrc == NULL) || (pDest == NULL))
 {
  return E_POINTER;
 }
 // 首先在第一个filter上查询一个输出的pin接口
 IPin *pOut = 0;
 HRESULT hr = GetUnconnectedPin(pSrc, PINDIR_OUTPUT, &pOut);
 if (FAILED(hr))
 {
  return hr;
 }
 //然后将它和第二个filter的输入接口衔接。
 hr = ConnectFilters(pGraph, pOut, pDest);
 pOut->Release();
 return hr;
}

  下面的函数演示了利用这个函数来连接AVIMux 过滤器和File Writer过滤器,这个例子也使用了AddFilterByCLSID函数。

IBaseFilter *pMux, *pWrite;
hr = AddFilterByCLSID(pGraph, CLSID_AviDest, L"AVI Mux", &pMux);
if (SUCCEEDED(hr))
{
 hr = AddFilterByCLSID(pGraph, CLSID_FileWriter, L"File Writer", &pWrite);
 if (SUCCEEDED(hr))
 {
  hr = ConnectFilters(pGraph, pMux, pWrite);
  /* Use IFileSinkFilter to set the file name (not shown). */
  pWrite->Release();
 }
 pMux->Release();
}
转载保留:http://www.qqread.com/vc/q242690.html 更多文章 更多内容请看Solaris基础知识入门专题,或进入讨论组讨论。
下一页 1 2 3 4 
收藏此文】【 】【打印】【关闭
较早的文章:最简单的SDK窗口程序(SDK)

较新的文章:APIHOOK实例剖析
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
最新论坛文章
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章