14

ネットワーク ストリームから MPEG2/4 ムービーをレンダリングする DirectShow グラフがあります。ピンを手動で接続してグラフを組み立てると、レンダリングされません。しかし、GraphBuilder で Render を呼び出すと、正常にレンダリングされます。

明らかに、GraphBuilder が実行しているグラフの一部のフィルターで実行していないセットアップ手順があります。

グラフをアセンブルするときに GraphBuilder からのデバッグ出力を表示する方法はありますか?

作業グラフをダンプして、それがどのようにまとめられたかを確認する方法はありますか?

DirectShow ボックスにあるミステリーを解明するための他のアイデアはありますか?

ありがとう!-Z

4

7 に答える 7

14

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 から削除する必要があります。

于 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などのツールを使用して視覚化できます。WindowsMediaPlayerのグラフがどのように見えるかを確認する必要がある場合に非常に便利です。

于 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. フィルター グラフを "Running Objects Table" - 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();
    }
}

`

于 2014-11-06T17:50:46.770 に答える
0

グラフを .grf graphedit ファイルに「保存」(シリアル化) できます

また、graphedit は実行中のグラフに「リモート アタッチ」できるように見えますか? http://rxwen.blogspot.com/2010/04/directshow-debugging-tips.html

于 2012-08-02T15:58:36.773 に答える
0

DirectX の古いバージョン、私は 9a を信じていますが、9b には dshow の「デバッグ モード」がありませんでした。デバッグ情報のログをデバッグ コンソールに出力します。

古いバージョンをダウンロードして、デバッグに設定します。次に、debugview を開くか、Visual Studio で graphedt.exe をロードして、デバッグ情報を確認します。

于 2008-09-15T20:42:52.693 に答える