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

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

在组装图形时,有什么方法可以查看 GraphBuilder 的调试输出吗?

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

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

谢谢!-Z

有帮助吗?

解决方案

您可以使用 DirectShow SDK 中的工具 GraphEdit 观看您创建的图形。在 GraphEdit 中,选择“文件”->“连接到远程图形...”

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

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 中删除

其他提示

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

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

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

你需要:

  1. 将您的过滤器图注册到“运行对象表” - ROT - 使用下面的代码
  2. 使用 GraphEdit 连接到您的过滤器图表(文件 -> 连接到远程图表)或什至更好 - 使用 图形编辑增强版

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

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

`

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top