我怎样才能逆向工程DirectShowgraphics?

我有一个DirectShowgraphics来呈现来自networkingstream的MPEG2 / 4电影。 当我通过手动连接引脚来组装graphics时,它不会渲染。 但是当我在GraphBuilder上调用Render时,渲染效果很好。

很显然,在GraphBuilder正在执行的graphics中,有一些设置步骤没有执行。

在组装graphics时,有什么方法可以查看GraphBuilder的debugging输出吗?

有没有办法转储一个工作图,看看它是如何放在一起的?

任何其他的想法,解开在DirectShow框中的奥秘?

谢谢! -Z

您可以使用GraphEdit(DirectShow SDK中的工具)观看您创build的graphics。 在GraphEdit中,selectFile-> Connect to remote Graph …

为了在列表中find您的graphics,您必须在运行的对象表中注册它:

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创build了一个DirectShow Filter Graph间谍工具( http://alax.info/blog/777 ),它是一个FilterGraph接口上的包装器COM DLL,它将所有调用logging到FilterGraph方法中。

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

IGraphBuilder :: SetLogFile(参见http://msdn.microsoft.com/zh-cn/library/dd390091(v=vs.85).aspx )会给你很多有用的诊断信息,关于在图build设期间会发生什么。 传入文件句柄(例如,由CreateFile打开)并将其转换为DWORD_PTR。 在closures文件句柄之前,再次用NULL调用以完成日志logging。

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

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

你需要:

  1. 注册你的过滤图到“运行对象表” – ROT – 使用下面的代码
  2. 使用GraphEdit(文件 – >连接到远程图表)连接到您的filter图表,甚至更好 – 使用GraphEditPlus

要将filtergraphics注册为“可连接”graphics,请使用filtergraphics调用此filtergraphics:

 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有一个“debugging模式”。 它会将debugging信息的日志输出到debugging控制台。

所以下载一个旧版本,把它设置为debug。 然后打开debugview或在visual studio中加载graphedt.exe来查看debugging信息。

你可以“保存”graphics(序列化)到一个.grf格式化文件,可能: https ://stackoverflow.com/a/10612735/32453

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