我有一个 DirectShow 图来从网络流中渲染 MPEG2/4 电影。当我通过手动连接引脚来组装图形时,它不会呈现。但是当我在 GraphBuilder 上调用 Render 时,它渲染得很好。
显然,我没有在 GraphBuilder 正在执行的图中的某些过滤器上执行一些设置步骤。
有没有办法在 GraphBuilder 组装图形时查看调试输出?
有没有办法转储工作图以查看它是如何组合在一起的?
解开 DirectShow 盒子中的谜团还有其他想法吗?
谢谢!-Z
我有一个 DirectShow 图来从网络流中渲染 MPEG2/4 电影。当我通过手动连接引脚来组装图形时,它不会呈现。但是当我在 GraphBuilder 上调用 Render 时,它渲染得很好。
显然,我没有在 GraphBuilder 正在执行的图中的某些过滤器上执行一些设置步骤。
有没有办法在 GraphBuilder 组装图形时查看调试输出?
有没有办法转储工作图以查看它是如何组合在一起的?
解开 DirectShow 盒子中的谜团还有其他想法吗?
谢谢!-Z
您可以使用来自 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 中删除
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
你需要:
要将您的过滤器图注册为“可连接”图,请使用您的过滤器图调用它:
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 的“调试模式”。它将调试信息的日志输出到调试控制台。
所以下载一个旧版本,将其设置为调试。然后在 Visual Studio 中打开 debugview 或加载 graphedt.exe 以查看调试信息。
您可以将图形“保存”(序列化)到 .grf graphedit 文件,可能是:https ://stackoverflow.com/a/10612735/32453
此外,graphedit 似乎可以“远程附加”到正在运行的图形?http://rxwen.blogspot.com/2010/04/directshow-debugging-tips.html