Сведения о вопросе

1234123213

07:25, 15th August, 2020

Теги

video   directx   directshow   mpeg    

Как я могу реинжинирировать график DirectShow?

Просмотров: 408   Ответов: 7

У меня есть график DirectShow для визуализации фильмов MPEG2/4 из сетевого потока. Когда я собираю график, соединяя контакты вручную, он не визуализируется. Но когда я вызываю Render на GraphBuilder, он делает это нормально.

Очевидно, есть какой-то шаг настройки, который я не выполняю на каком-то фильтре в графике, который выполняет GraphBuilder.

Есть ли какой-либо способ увидеть выходные данные отладки из GraphBuilder, когда он собирает график?

Есть ли способ сбросить рабочий график, чтобы посмотреть, как он был собран?

Есть еще идеи для разгадки тайны, которая живет в коробке DirectShow?

Спасибо! -Зет



  Сведения об ответе

baggs

08:23, 12th August, 2020

Вы можете посмотреть график, созданный с помощью GraphEdit, инструмента из DirectShow SDK. В поле GraphEdit выберите Файл - >подключиться к удаленному графику...

Чтобы найти свой график в списке, вы должны зарегистрировать его в таблице запущенных объектов:

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

После уничтожения вашего графика, вы должны удалить его из ROT, вызвав IRunningObjectTable::Revoke


  Сведения об ответе

P_S_S

22:31, 12th August, 2020

Роман Рыльцов создал DirectShow Filter Graph Spy tool (http://alax.info/blog/777), оболочку COM dll над интерфейсом FilterGraph, которая регистрирует все вызовы методов FilterGraph.

Кроме того, он добавит все созданные графики в таблицу запущенных объектов (ROT), которую затем можно визуализировать с помощью таких инструментов, как GraphEdit или GraphStudio. Очень полезно, когда вам нужно увидеть, как выглядит график игрока Windows Media.


  Сведения об ответе

DAAA

20:18, 23rd August, 2020

IGraphBuilder::SetLogFile (см. http://msdn.microsoft.com/en-us/library/dd390091 (v=vs.85).aspx)) даст вам много полезной диагностической информации о том, что происходит во время построения графика. Передайте дескриптор файла (например, открытый CreateFile) и приведите его к DWORD_PTR. Повторите вызов с NULL, чтобы завершить ведение журнала, прежде чем закрыть дескриптор файла.

Код в следующем сообщении блога для сброса графика даст вам дополнительную информацию для интерпретации чисел в файле журнала.

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


  Сведения об ответе

SKY

16:52, 1st August, 2020

Здесь есть подробная запись MSDN. http://msdn.microsoft.com/en-us/library/windows/desktop/dd390650(с V=vs.85).aspx


  Сведения об ответе

repe

06:06, 12th August, 2020

Вам нужно:

  1. Регистрация вы фильтруете график к "Running Objects Table" - ROT-используя код ниже
  2. Подключитесь к вашему графу фильтра с помощью GraphEdit (File - >Connect to Remote Graph) или еще лучше-с помощью GraphEditPlus

Чтобы зарегистрировать свой график фильтра как график "connectable", вызовите его вместе с графом фильтра:

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

И назовите это перед тем как выпустить график:

void RemoveFromROT(DWORD pdwRegister)
{
    IRunningObjectTable *pROT;

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

`


  Сведения об ответе

DO__IT

06:21, 4th August, 2020

Более старые версии DirectX, я верю 9a, но не 9b имели "debug mode" для dshow. Он будет выводить журналы отладочной информации в консоль отладки.

Поэтому загрузите старую версию, установите ее на отладку. затем откройте debugview или загрузите graphedt.exe в visual studio,чтобы просмотреть сведения об отладке.


  Сведения об ответе

SKY

21:06, 1st October, 2020

Вы можете "save" граф (сериализовать его) в файл .grf graphedit, возможно: https://stackoverflow.com/a/10612735/32453

Также оказывается, что graphedit может "remote attach" к запущенному графу? http://rxwen.blogspot.com/2010/04/directshow-debugging-tips.html


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться