Frage

Ich habe ein DirectShow-Diagramm zum Rendern von MPEG2/4-Filmen aus einem Netzwerkstream.Wenn ich das Diagramm zusammenbaue, indem ich die Stifte manuell verbinde, wird es nicht gerendert.Aber wenn ich Render im GraphBuilder aufrufe, wird es einwandfrei gerendert.

Offensichtlich gibt es einen Einrichtungsschritt, den ich für einen Filter in dem von GraphBuilder ausgeführten Diagramm nicht ausführe.

Gibt es eine Möglichkeit, die Debug-Ausgabe von GraphBuilder anzuzeigen, wenn ein Diagramm zusammengestellt wird?

Gibt es eine Möglichkeit, ein Arbeitsdiagramm zu sichern, um zu sehen, wie es erstellt wurde?

Irgendwelche anderen Ideen, um das Geheimnis zu lüften, das in der DirectShow-Box steckt?

Danke!-Z

War es hilfreich?

Lösung

Sie können das von Ihnen erstellte Diagramm mit GraphEdit ansehen, einem Tool aus dem DirectShow SDK.Wählen Sie in GraphEdit Datei->Mit Remote-Graph verbinden... aus.

Um Ihr Diagramm in der Liste zu finden, müssen Sie es in der laufenden Objekttabelle registrieren:

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

Nachdem Sie Ihr Diagramm zerstört haben, sollten Sie es aus dem ROT entfernen, indem Sie IRunningObjectTable::Revoke aufrufen

Andere Tipps

Roman Ryltsov hat ein DirectShow Filter Graph Spy-Tool erstellt (http://alax.info/blog/777), eine Wrapper-COM-DLL über die FilterGraph-Schnittstelle, die alle Aufrufe von FilterGraph-Methoden protokolliert.

Außerdem werden alle erstellten Diagramme in die Running Object Table (ROT) eingefügt, die Sie dann mit Tools wie GraphEdit oder GraphStudio visualisieren können.Sehr nützlich, wenn Sie sehen möchten, wie ein Windows Media Player-Diagramm aussieht.

IGraphBuilder::SetLogFile (siehe http://msdn.microsoft.com/en-us/library/dd390091(v=vs.85).aspx) liefert Ihnen viele nützliche Diagnoseinformationen darüber, was während der Diagrammerstellung passiert.Übergeben Sie ein Dateihandle (z. B.von CreateFile geöffnet) und wandeln Sie es in einen DWORD_PTR um.Rufen Sie erneut mit NULL auf, um die Protokollierung abzuschließen, bevor Sie das Dateihandle schließen.

Der Code im folgenden Blogbeitrag zum Dumpen eines Diagramms liefert Ihnen einige zusätzliche Informationen zur Interpretation der Zahlen in der Protokolldatei.

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

Du brauchst:

  1. Registrieren Sie Ihr Filterdiagramm in der „Running Objects Table“ (ROT) mithilfe des folgenden Codes
  2. Stellen Sie eine Verbindung zu Ihrem Filterdiagramm über GraphEdit (Datei->Mit Remote-Diagramm verbinden) oder noch besser – mit her GraphEditPlus

Um Ihr Filterdiagramm als „verknüpfbares“ Diagramm zu registrieren, rufen Sie dies mit Ihrem Filterdiagramm auf:

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

Und rufen Sie dies auf, bevor Sie das Diagramm veröffentlichen:

void RemoveFromROT(DWORD pdwRegister)
{
    IRunningObjectTable *pROT;

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

`

Ältere Versionen von DirectX, ich glaube 9a, aber nicht 9b, hatten einen „Debug-Modus“ für Dshow.Es würde Protokolle mit Debug-Informationen in der Debug-Konsole ausgeben.

Laden Sie also eine ältere Version herunter und stellen Sie sie auf Debug ein.Öffnen Sie dann Debugview oder laden Sie graphedt.exe in Visual Studio, um die Debug-Informationen anzuzeigen.

Sie könnten das Diagramm möglicherweise in einer .grf-Graphedit-Datei „speichern“ (serialisieren): https://stackoverflow.com/a/10612735/32453

Es scheint auch, dass graphedit eine „Remote-Anbindung“ an ein laufendes Diagramm durchführen kann? http://rxwen.blogspot.com/2010/04/directshow-debugging-tips.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top