我有一个DirectShow图形,可以从网络流中呈现MPEG2/4电影。当我手动连接引脚组装图形时,它无法渲染。但是在GraphBuilder上调用Render时,它可以正常渲染。
显然,我没有在图形中的某个过滤器上执行GraphBuilder正在执行的一些设置步骤。
是否有任何方法可以查看GraphBuilder组装图形时的调试输出?
是否有一种方法可以转储工作图以查看其如何组合?
其他任何想法可用于解开DirectShow盒子中存在的神秘问题吗?
谢谢!-Z
我有一个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方法的调用。
此外,它还将所有创建的图形添加到Running Object Table (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();
}
}
`
关于这个问题,MSDN上有一篇详细的文章。 http://msdn.microsoft.com/en-us/library/windows/desktop/dd390650(v=vs.85).aspx
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