Вопрос

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

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

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

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

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

Спасибо!-З

Это было полезно?

Решение

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

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

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.

Другие советы

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

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

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

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

Вам нужно:

  1. Зарегистрируйте граф фильтра в «Таблице запущенных объектов» — ROT — используя приведенный ниже код.
  2. Подключитесь к графу фильтра с помощью GraphEdit (Файл->Подключиться к удаленному графику) или, что еще лучше, с помощью ГрафикEditPlus

Чтобы зарегистрировать граф фильтра как «подключаемый» граф, вызовите его с помощью графа фильтра:

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

`

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

Так что скачайте более старую версию, настройте ее на отладку.затем откройте debugview или загрузите Graphedt.exe в Visual Studio, чтобы просмотреть информацию об отладке.

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

Также оказывается, что Graphedit может «удаленно подключаться» к работающему графику? http://rxwen.blogspot.com/2010/04/directshow-debugging-tips.html

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top