Как я могу перестроить график DirectShow?
У меня есть график DirectShow для рендеринга фильмов MPEG2/4 из сетевого потока. Когда я собираю график, подключая булавки вручную, он не отображает. Но когда я вызываю Render на GraphBuilder, он отлично отображает.
Очевидно, что есть некоторый шаг настройки, который я не выполняю на каком-либо фильтре на графике, который выполняет GraphBuilder.
Есть ли способ увидеть вывод debug из GraphBuilder при сборке графика?
Есть ли способ сбросить рабочий график, чтобы увидеть, как он был собран?
Любые другие идеи для раскрытия тайны, которая живет в окне DirectShow?
Спасибо!
-Z
Ответы
Ответ 1
Вы можете посмотреть график, созданный с помощью GraphEdit, инструмента из DirectShow SDK. В GraphEdit выберите File- > Connect to remote 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
Ответ 2
Роман Рыльцов создал инструмент DirectShow Filter Graph Spy (http://alax.info/blog/777), COM-оболочку COM-оболочки через интерфейс FilterGraph, который регистрирует все вызовы методам FilterGraph.
Также он добавит все созданные графики в таблицу рабочих столов (ROT), которую вы сможете визуализировать с помощью таких инструментов, как GraphEdit или GraphStudio. Очень полезно, когда вам нужно посмотреть, как выглядит график проигрывателя Windows Media.
Ответ 3
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
Ответ 4
На этом есть подробная запись MSDN.
http://msdn.microsoft.com/en-us/library/windows/desktop/dd390650(v=vs.85).aspx
Ответ 5
Вам необходимо:
- Зарегистрируйте график фильтра в таблице "Выполняемые объекты" - ROT - используя код ниже
- Подключитесь к графику фильтра с помощью GraphEdit (Файл- > Подключиться к удаленному графику) или еще лучше - С GraphEditPlus
Чтобы зарегистрировать ваш график фильтра как "подключаемый" график, назовите это графиком вашего фильтра:
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();
}
}
`
Ответ 6
Старые версии DirectX, я верю 9a, но не 9b имел "режим отладки" для dshow. Он выводит журналы отладочной информации в консоль отладки.
Итак, загрузите более старую версию, настройте ее для отладки. затем откройте debugview или загрузите graphedt.exe в visual studio, чтобы просмотреть информацию об отладке.
Ответ 7
Вы можете "сохранить" график (сериализовать его) в файл .grf graphedit, возможно: fooobar.com/info/360086/...
Также кажется, что graphedit может "удалять прикрепление" к работающему графику? http://rxwen.blogspot.com/2010/04/directshow-debugging-tips.html