Pergunta

Eu tenho um gráfico DirectShow para renderizar filmes MPEG2/4 a partir de um fluxo de rede.Quando eu monto o gráfico conectando os pinos manualmente ele não renderiza.Mas quando eu chamo Render no GraphBuilder ele fica bem.

Obviamente há alguma etapa de configuração que não estou executando em algum filtro do gráfico que o GraphBuilder está executando.

Existe alguma maneira de ver a saída de depuração do GraphBuilder quando ele monta um gráfico?

Existe uma maneira de despejar um gráfico funcional para ver como ele foi montado?

Alguma outra idéia para desvendar o mistério que vive na caixa do DirectShow?

Obrigado!-Z

Foi útil?

Solução

Você pode observar o gráfico criado usando GraphEdit, uma ferramenta do DirectShow SDK.No GraphEdit, selecione Arquivo->Conectar ao Graph remoto...

Para encontrar seu gráfico na lista, você deve registrá-lo na tabela de objetos em execução:

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

Após destruir seu gráfico, você deve removê-lo do ROT chamando IRunningObjectTable::Revoke

Outras dicas

Roman Ryltsov criou uma ferramenta DirectShow Filter Graph Spy (http://alax.info/blog/777), uma dll COM wrapper sobre a interface FilterGraph, que registra todas as chamadas para métodos FilterGraph.

Além disso, ele adicionará todos os gráficos criados à Running Object Table (ROT), que você poderá visualizar usando ferramentas como GraphEdit ou GraphStudio.Muito útil quando você precisa ver a aparência de um gráfico do Windows Media Player.

IGraphBuilder::SetLogFile (veja http://msdn.microsoft.com/en-us/library/dd390091(v=vs.85).aspx) fornecerá muitas informações úteis de diagnóstico sobre o que acontece durante a construção do gráfico.Passe um identificador de arquivo (por exemploaberto por CreateFile) e convertê-lo em um DWORD_PTR.Chame novamente com NULL para concluir o log antes de fechar o identificador de arquivo.

O código na postagem do blog a seguir para despejar um gráfico fornecerá algumas informações extras para interpretar os números no arquivo de log.

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

Você precisa:

  1. Registre seu gráfico de filtro na "Tabela de objetos em execução" - ROT - Usando o código abaixo
  2. Conecte-se ao seu gráfico de filtro usando GraphEdit (Arquivo->Conectar ao Gráfico Remoto) ou ainda melhor - Com GráficoEditPlus

Para registrar seu gráfico de filtro como um gráfico "conectável", chame isto com seu 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();
}

E chame isso antes de liberar o gráfico:

void RemoveFromROT(DWORD pdwRegister)
{
    IRunningObjectTable *pROT;

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

`

Versões mais antigas do DirectX, acredito que 9a, mas não 9b tinha um "modo de depuração" para dshow.Ele geraria logs de informações de depuração no console de depuração.

Então baixe uma versão mais antiga e configure-a para depuração.em seguida, abra o debugview ou carregue o graphedt.exe no visual studio para ver as informações de depuração.

Você poderia "salvar" o gráfico (serializá-lo) em um arquivo .grf graphedit, possivelmente: https://stackoverflow.com/a/10612735/32453

Também parece que o graphedit pode "anexar remotamente" a um gráfico em execução? http://rxwen.blogspot.com/2010/04/directshow-debugging-tips.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top