Pregunta

Tengo un gráfico DirectShow para renderizar películas MPEG2/4 desde una transmisión de red.Cuando ensamblo el gráfico conectando los pines manualmente, no se representa.Pero cuando llamo a Render en GraphBuilder, se muestra bien.

Obviamente, hay algún paso de configuración que no estoy realizando en algún filtro en el gráfico que está realizando GraphBuilder.

¿Hay alguna forma de ver el resultado de depuración de GraphBuilder cuando ensambla un gráfico?

¿Hay alguna manera de volcar un gráfico funcional para ver cómo se armó?

¿Alguna otra idea para desentrañar el misterio que vive en el cuadro de DirectShow?

¡Gracias!-Z

¿Fue útil?

Solución

Puede ver el gráfico que creó usando GraphEdit, una herramienta del SDK de DirectShow.En GraphEdit, seleccione Archivo->Conectar a Graph remoto...

Para encontrar su gráfico en la lista, debe registrarlo en la tabla de objetos en ejecución:

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

Después de destruir su gráfico, debe eliminarlo del ROT llamando a IRunningObjectTable::Revoke

Otros consejos

Roman Ryltsov ha creado una herramienta DirectShow Filter Graph Spy (http://alax.info/blog/777), un contenedor COM dll sobre la interfaz FilterGraph, que registra todas las llamadas a los métodos FilterGraph.

También agregará todos los gráficos creados a la tabla de objetos en ejecución (ROT), que luego podrá visualizar utilizando herramientas como GraphEdit o GraphStudio.Muy útil cuando necesitas ver cómo se ve un gráfico de Windows Media Player.

IGraphBuilder::SetLogFile (ver http://msdn.microsoft.com/en-us/library/dd390091(v=vs.85).aspx) le brindará mucha información de diagnóstico útil sobre lo que sucede durante la creación de gráficos.Pase un identificador de archivo (p. ej.abierto por CreateFile) y transmitirlo a un DWORD_PTR.Llame nuevamente con NULL para finalizar el registro antes de cerrar el identificador del archivo.

El código en la siguiente publicación de blog para volcar un gráfico le brindará información adicional para interpretar los números en el archivo de registro.

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

Necesitas:

  1. Registre su gráfico de filtro en la "Tabla de objetos en ejecución" - ROT - Usando el siguiente código
  2. Conéctese a su gráfico de filtro usando GraphEdit (Archivo->Conectar a gráfico remoto) o incluso mejor: con GráficoEditPlus

Para registrar su gráfico de filtro como un gráfico "conectable", llame a esto con su gráfico de 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();
}

Y llame a esto antes de publicar el gráfico:

void RemoveFromROT(DWORD pdwRegister)
{
    IRunningObjectTable *pROT;

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

`

Creo que las versiones anteriores de DirectX, 9a, pero no 9b, tenían un "modo de depuración" para dshow.Enviaría registros de información de depuración a la consola de depuración.

Descargue una versión anterior y configúrela para depurar.luego abra debugview o cargue graphedt.exe en Visual Studio para ver la información de depuración.

Podrías "guardar" el gráfico (serializarlo) en un archivo Graphedit .grf, posiblemente: https://stackoverflow.com/a/10612735/32453

¿También parece que Graphedit puede "adjuntar de forma remota" a un gráfico en ejecución? http://rxwen.blogspot.com/2010/04/directshow-debugging-tips.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top