GraphEdit使用

GraphEdit 是一个用于建立和测试Filter graph 的可视化工具。在DirectX SDK.中附带一个可执行程序版本(在SDK目录中的Bin/DXUtils/graphedt.exe)。你可以快速测试你建立的Filter graph是否达到预期的效果,你也可以查看由另一个程序建立的Filter graph。GraphEdit有标准的Windows用户界面,如图:

 
查看到系统中安装的Filter
使用GraphEdit,可以查看到系统中所有(正常)安装的Filter。执行菜单命令Graph | Insert Filters…,将弹出一个如图的对话框。

提示:Filter的注册信息通常包括两部分——COM服务器信息和Filter描述信息。前者是必需的,它表明了Filter是一个COM组件;后者不是必需的,不注册也不会妨碍到Filter功能的实现。GraphEdit查看不到没有注册Filter描述信息的Filter。
通常在开发DirectShow应用程序时,注册在“DirectShow Filters”目录下的Filter可以通过指定其CLSID、调用API函数CoCreateInstance来创建。而注册在其他目录(比如“Audio Capture Sources”、“Audio Compressors”、“Video Capture Sources”、“Video Compressors”等)下的Filter,需要通过系统枚举来创建。
 
构建指定文件播放用的Filter Graph
使用GraphEdit,还可以播放媒体文件。构建指定文件播放用的Filter Graph至少有以下4种方法:
(1)执行菜单命令File | Render Media File…,在随后弹出的对话框中选择一个媒体文件。
(2)在文件浏览器中直接将要播放的媒体文件拖到GraphEdit中。
(3)执行菜单命令Graph | Insert Filters…,在“DirectShow Filters”目录下找到“File Source (Async.)”这个Filter并双击插入,在随后弹出的对话框中选择一个媒体文件,然后再在Source Filter的输出Pin上执行鼠标右键菜单项“Render Pin”。
(4)与方法(3)类似,预先插入所有需要的Filter;连接时,在上一级Filter的输出Pin上按下鼠标左键并按住不放,拖动鼠标到下一级Filter的输入Pin上后放开;这样依次连接所有必要的Pin即可。(连接的顺序一般总是从左到右,即从Source Filter连到Renderer Filter。)
构建的Filter Graph典型如图。

 
当Filter Graph构建完成后,就可以进行播放了。执行菜单命令Graph | Play或Pause或Stop;或者直接使用工具条上的播放控制按钮。
用GraphEdit显示应用程序中构建的Filter Graph
GraphEdit的这个远程连接功能仅在Windows 2000和Windows XP操作系统下能用。
在用GraphEdit显示应用程序中构建的Filter Graph之前,应用程序必须把它创建的Filter Graph进行注册,可以在应用程序成功创建了一个Filter Graph之后调用AddToRot进行注册
// pUnkGraph:Filter Graph Manager对象指针
// pdwRegister:成功注册后返回的一个ID
HRESULT AddToRot(IUnknown *pUnkGraph, DWORD *pdwRegister)
{
    IMoniker * pMoniker;
    IRunningObjectTable *pROT;
    if (FAILED(GetRunningObjectTable(0, &pROT))) {
        return E_FAIL;
    }
    WCHAR wsz[256];
    wsprintfW(wsz, L"FilterGraph %08x pid %08x", (DWORD_PTR)pUnkGraph, GetCurrentProcessId());
    HRESULT hr = CreateItemMoniker(L"!", wsz, &pMoniker);
    if (SUCCEEDED(hr)) {
        hr = pROT->Register(0, pUnkGraph, pMoniker, pdwRegister);
        pMoniker->Release();
    }
    pROT->Release();
    return hr;
}

在销毁Filter Graph Manager对象之前,还必须调用RemoveFromRot进行反注册
// pdwRegister为成功调用AddToRot函数后返回的ID
void RemoveFromRot(DWORD pdwRegister)
{
    IRunningObjectTable *pROT;
    if (SUCCEEDED(GetRunningObjectTable(0, &pROT))) {
        pROT->Revoke(pdwRegister);
        pROT->Release();
    }
}

应用程序中的整个操作过程如下:

 

IGraphBuilder *pGraph;
DWORD dwRegister;
   
// Create the filter graph manager.
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
                        IID_IGraphBuilder, (void **)&pGraph);
#ifdef _DEBUG
hr = AddToRot(pGraph, &dwRegister);
#endif

// Rest of the application (not shown).

#ifdef _DEBUG
RemoveFromRot(dwRegister);
#endif
pGraph->Release();

 

IGraphBuilder *pGraph;
DWORD dwRegister;
   
// Create the filter graph manager.
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
                        IID_IGraphBuilder, (void **)&pGraph);
#ifdef _DEBUG
hr = AddToRot(pGraph, &dwRegister);
#endif

// Rest of the application (not shown).

#ifdef _DEBUG
RemoveFromRot(dwRegister);
#endif
pGraph->Release();

在用GraphEdit显示应用程序中构建的Filter Graph之前,把应用程序和GraphEdit同时执行,然后执行GraphEdit菜单命令File | Connect to Remote Graph…,随后将弹出如图1.5的对话框,选中一个Filter Graph的注册条目后按下“OK”按钮即可

文章来自:http://blog.donews.com/jiji262/archive/2006/02/21/736958.aspx 

IGraphBuilder *pGraph;
DWORD dwRegister;
   
// Create the filter graph manager.
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
                        IID_IGraphBuilder, (void **)&pGraph);
#ifdef _DEBUG
hr = AddToRot(pGraph, &dwRegister);
#endif

// Rest of the application (not shown).

#ifdef _DEBUG
RemoveFromRot(dwRegister);
#endif
pGraph->Release();

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值