14

我有一个 DirectShow 图来从网络流中渲染 MPEG2/4 电影。当我通过手动连接引脚来组装图形时,它不会呈现。但是当我在 GraphBuilder 上调用 Render 时,它渲染得很好。

显然,我没有在 GraphBuilder 正在执行的图中的某些过滤器上执行一些设置步骤。

有没有办法在 GraphBuilder 组装图形时查看调试输出?

有没有办法转储工作图以查看它是如何组合在一起的?

解开 DirectShow 盒子中的谜团还有其他想法吗?

谢谢!-Z

4

7 回答 7

14

您可以使用来自 DirectShow SDK 的工具 GraphEdit 观看您创建的图形。在 GraphEdit 中,选择 File->Connect to remote Graph...

为了在列表中找到您的图表,您必须在运行对象表中注册它:

void AddToRot( IUnknown *pUnkGraph, DWORD *pdwRegister ) 
{
    IMoniker* pMoniker;
    IRunningObjectTable* pROT;
    GetRunningObjectTable( 0, &pROT );

    WCHAR wsz[256];     
    swprintf_s( wsz, L"FilterGraph %08p pid %08x", (DWORD_PTR)pUnkGraph, GetCurrentProcessId() );
    CreateItemMoniker( L"!", wsz, &pMoniker );

    pROT->Register( 0, pUnkGraph, pMoniker, pdwRegister );

    // Clean up any COM stuff here ...
}

销毁图表后,您应该通过调用 IRunningObjectTable::Revoke 将其从 ROT 中删除

于 2008-08-26T12:15:13.160 回答
10

Roman Ryltsov 创建了 DirectShow Filter Graph Spy 工具 ( http://alax.info/blog/777 ),它是 FilterGraph 接口上的包装 COM dll,它记录对 FilterGraph 方法的所有调用。

它还将所有创建的图形添加到运行对象表 (ROT) 中,然后您可以使用 GraphEdit 或 GraphStudio 等工具对其进行可视化。当您需要查看 Windows Media Player 图形的外观时非常有用。

于 2009-07-01T17:21:42.340 回答
5

IGraphBuilder::SetLogFile(请参阅http://msdn.microsoft.com/en-us/library/dd390091(v=vs.85).aspx)将为您提供有关图形构建过程中发生的情况的大量有用诊断信息。传入一个文件句柄(例如由 CreateFile 打开)并将其转换为 DWORD_PTR。在关闭文件句柄之前再次调用 NULL 以完成日志记录。

以下博客文章中用于转储图表的代码将为您提供一些额外的信息来解释日志文件中的数字。

http://rxwen.blogspot.com/2010/04/directshow-debugging-tips.html

于 2011-04-01T15:29:04.493 回答
1

对此有详细的 MSDN 条目。 http://msdn.microsoft.com/en-us/library/windows/desktop/dd390650(v=vs.85).aspx

于 2011-10-02T08:58:42.440 回答
1

你需要:

  1. 将您的过滤器图注册到“运行对象表” - ROT - 使用下面的代码
  2. 使用 GraphEdit (File->Connect to Remote Graph) 或更好的方式连接到您的过滤器图 - 使用GraphEditPlus

要将您的过滤器图注册为“可连接”图,请使用您的过滤器图调用它:

void AddToROT( IUnknown *pUnkGraph, DWORD *pdwRegister ) 
{
    IMoniker * pMoniker;
    IRunningObjectTable *pROT;
    WCHAR wsz[128];
    HRESULT hr;

    if (FAILED(GetRunningObjectTable(0, &pROT)))
        return;

    wsprintfW(wsz, L"FilterGraph %08x pid %08x", (DWORD_PTR)pUnkGraph, GetCurrentProcessId());

    hr = CreateItemMoniker(L"!", wsz, &pMoniker);
    if (SUCCEEDED(hr)) 
    {
        hr = pROT->Register(0, pUnkGraph, pMoniker, pdwRegister);
        pMoniker->Release();
    }

    pROT->Release();
}

并在发布图表之前调用它:

void RemoveFromROT(DWORD pdwRegister)
{
    IRunningObjectTable *pROT;

    if (SUCCEEDED(GetRunningObjectTable(0, &pROT))) 
    {
        pROT->Revoke(pdwRegister);
        pROT->Release();
    }
}

`

于 2014-11-06T17:50:46.770 回答
0

旧版本的 DirectX,我相信 9a,但 9b 没有 dshow 的“调试模式”。它将调试信息的日志输出到调试控制台。

所以下载一个旧版本,将其设置为调试。然后在 Visual Studio 中打开 debugview 或加载 graphedt.exe 以查看调试信息。

于 2008-09-15T20:42:52.693 回答
0

您可以将图形“保存”(序列化)到 .grf graphedit 文件,可能是:https ://stackoverflow.com/a/10612735/32453

此外,graphedit 似乎可以“远程附加”到正在运行的图形?http://rxwen.blogspot.com/2010/04/directshow-debugging-tips.html

于 2012-08-02T15:58:36.773 回答