Domanda

Ho un grafico DirectShow per eseguire il rendering di filmati MPEG2/4 da un flusso di rete.Quando assemblo il grafico collegando manualmente i pin, non viene visualizzato.Ma quando chiamo Render su GraphBuilder il rendering funziona correttamente.

Ovviamente c'è qualche passaggio di configurazione che non sto eseguendo su alcuni filtri nel grafico eseguito da GraphBuilder.

Esiste un modo per visualizzare l'output di debug di GraphBuilder quando assembla un grafico?

C'è un modo per scaricare un grafico funzionante per vedere come è stato messo insieme?

Qualche altra idea per svelare il mistero che vive nella scatola di DirectShow?

Grazie!-Z

È stato utile?

Soluzione

Puoi guardare il grafico che hai creato utilizzando GraphEdit, uno strumento dell'SDK di DirectShow.In GraphEdit, seleziona File->Connetti al grafico remoto...

Per trovare il tuo grafico nell'elenco, devi registrarlo nella tabella degli oggetti in esecuzione:

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 ...
}

Dopo aver distrutto il tuo grafico, dovresti rimuoverlo dal ROT chiamando IRunningObjectTable::Revoke

Altri suggerimenti

Roman Ryltsov ha creato uno strumento Spia grafico filtro DirectShow (http://alax.info/blog/777), una dll COM wrapper sull'interfaccia FilterGraph, che registra tutte le chiamate ai metodi FilterGraph.

Inoltre aggiungerà tutti i grafici creati nella Running Object Table (ROT) che potrai quindi visualizzare utilizzando strumenti come GraphEdit o GraphStudio.Molto utile quando hai bisogno di vedere come appare un grafico di Windows Media Player.

IGraphBuilder::SetLogFile (vedi http://msdn.microsoft.com/en-us/library/dd390091(v=vs.85).aspx) ti fornirà molte informazioni diagnostiche utili su ciò che accade durante la creazione del grafico.Passare un handle di file (ad es.aperto da CreateFile) e trasmetterlo a un DWORD_PTR.Richiamare nuovamente con NULL per terminare la registrazione prima di chiudere l'handle del file.

Il codice nel seguente post del blog per il dump di un grafico ti fornirà alcune informazioni aggiuntive per interpretare i numeri nel file di registro.

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

Devi:

  1. Registra il grafico filtrato nella "Tabella oggetti in esecuzione" - ROT - Utilizzando il codice seguente
  2. Connettiti al grafico del filtro utilizzando GraphEdit (File->Connetti al grafico remoto) o ancora meglio - Con GraphEditPlus

Per registrare il grafico del filtro come grafico "collegabile", chiama questo con il grafico del filtro:

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

E chiamalo prima di rilasciare il grafico:

void RemoveFromROT(DWORD pdwRegister)
{
    IRunningObjectTable *pROT;

    if (SUCCEEDED(GetRunningObjectTable(0, &pROT))) 
    {
        pROT->Revoke(pdwRegister);
        pROT->Release();
    }
}

`

Le versioni precedenti di DirectX, credo la 9a, ma non la 9b avevano una "modalità debug" per dshow.Verrebbe generato log di informazioni di debug nella console di debug.

Quindi scarica una versione precedente, impostala su debug.quindi apri debugview o carica graphedt.exe in Visual Studio per vedere le informazioni di debug.

Potresti "salvare" il grafico (serializzarlo) in un file graphedit .grf, possibilmente: https://stackoverflow.com/a/10612735/32453

Sembra inoltre che graphedit possa "collegarsi in remoto" a un grafico in esecuzione? http://rxwen.blogspot.com/2010/04/directshow-debugging-tips.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top