Question

J'ai un graphique DirectShow pour restituer des films MPEG2/4 à partir d'un flux réseau.Lorsque j'assemble le graphique en connectant les broches manuellement, le rendu ne s'effectue pas.Mais lorsque j'appelle Render sur GraphBuilder, le rendu est correct.

Évidemment, il y a une étape de configuration que je n'effectue pas sur certains filtres du graphique exécuté par GraphBuilder.

Existe-t-il un moyen de voir la sortie de débogage de GraphBuilder lorsqu'il assemble un graphique ?

Existe-t-il un moyen de vider un graphique fonctionnel pour voir comment il a été élaboré ?

Avez-vous d'autres idées pour percer le mystère qui réside dans la boîte DirectShow ?

Merci!-Z

Était-ce utile?

La solution

Vous pouvez regarder le graphique que vous avez créé à l'aide de GraphEdit, un outil du SDK DirectShow.Dans GraphEdit, sélectionnez Fichier->Connecter au graphique distant...

Afin de retrouver votre graphique dans la liste, vous devez l'enregistrer dans la table des objets en cours d'exécution :

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

Après avoir détruit votre graphique, vous devez le supprimer du ROT en appelant IRunningObjectTable :: Revoke

Autres conseils

Roman Ryltsov a créé un outil d'espionnage DirectShow Filter Graph (http://alax.info/blog/777), une dll COM wrapper sur l'interface FilterGraph, qui enregistre tous les appels aux méthodes FilterGraph.

Il ajoutera également tous les graphiques créés dans la table des objets en cours d'exécution (ROT) que vous pourrez ensuite visualiser à l'aide d'outils tels que GraphEdit ou GraphStudio.Très utile lorsque vous avez besoin de voir à quoi ressemble un graphique de Windows Media Player.

IGraphBuilder :: SetLogFile (voir http://msdn.microsoft.com/en-us/library/dd390091(v=vs.85).aspx) vous donnera de nombreuses informations de diagnostic utiles sur ce qui se passe lors de la création d'un graphique.Transmettez un descripteur de fichier (par ex.ouvert par CreateFile) et convertissez-le en DWORD_PTR.Appelez à nouveau avec NULL pour terminer la journalisation avant de fermer le descripteur de fichier.

Le code du billet de blog suivant pour vider un graphique vous donnera des informations supplémentaires pour interpréter les nombres dans le fichier journal.

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

Il existe une entrée MSDN détaillée à ce sujet.http://msdn.microsoft.com/en-us/library/windows/desktop/dd390650(v=vs.85).aspx

Vous devez:

  1. Enregistrez votre graphique de filtre dans la "Table des objets en cours d'exécution" - ROT - En utilisant le code ci-dessous
  2. Connectez-vous à votre graphique de filtre en utilisant GraphEdit (Fichier->Connect to Remote Graph) ou encore mieux - Avec GraphEditPlus

Pour enregistrer votre graphique de filtre en tant que graphique « connectable », appelez ceci avec votre graphique de filtre :

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

Et appelez ceci avant de publier le graphique :

void RemoveFromROT(DWORD pdwRegister)
{
    IRunningObjectTable *pROT;

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

`

Les anciennes versions de DirectX, je crois que 9a, mais pas 9b, n'avaient de "mode débogage" pour dshow.Il afficherait des journaux d'informations de débogage dans la console de débogage.

Alors téléchargez une ancienne version, configurez-la pour déboguer.puis ouvrez debugview ou chargez graphedt.exe dans Visual Studio pour voir les informations de débogage.

Vous pouvez "enregistrer" le graphique (le sérialiser) dans un fichier graphedit .grf, éventuellement : https://stackoverflow.com/a/10612735/32453

Il semble également que graphedit puisse « s'attacher à distance » à un graphique en cours d'exécution ? http://rxwen.blogspot.com/2010/04/directshow-debugging-tips.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top