Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Почему так непредсказуемо ведут себя фильтры DS?


Автор: Dims 28.10.2009, 15:40
Ничего не понимаю в этом DirectShow! Первоначально думал, что всё просто и логично, но в конце концов начинает казаться, что в системе царит полнейший хаос и неразбериха. 

В общем, вывод телевизионной картинки и звука я освоил. Теперь пытаюсь создать приложение, которое выводит на экран субтитры CC.

Создаю программно граф из фильтров, сохраняю его в файл, а потом смотрю, что получается в программе GraphEdt. Иногда пытаюсь что-то подредактировать, чтобы понять происходящее.



В мануале написано http://msdn.microsoft.com/en-us/library/dd407354%28VS.85%29.aspx что CC Decoder надо подключить к выходу VBI устройства захвата через фильтр непонятного назначения Tee/Sink-to-Sink.

Возникают следующие вопросы:

1) Как найти нужный фильтр в списке? По русски есть два фильтра "Преобразователь Tee/Sink-to-sink" в группах "Устройства расщепления WDM потока" и "Преобразователи связи WDM потока". Это один и тот же фильтр или два разных с одним названием? В мануале написано, что фильтр "appears in the "WDM Streaming Tee/Splitter Devices" filter category (AM_KSCATEGORY_SPLITTER)". Видимо, правильный перевод "расщепление", но как в этом убедиться?

2) Как идентифицировать фильтр, который уже присутствует на графе? Программно я кладу фильтр из категории AM_KSCATEGORY_SPLITTER. Как определить его в списке фильтров GraphEdt?

3) У меня не получается соединить вручную фильтры из GraphEdt, почему?

4) Программно попытка соединить фильтры оказывается успешной (ошибок не возникает). Но если я открываю сохранённый файл, то там фильтры Tee и CC оказываются разъединены. Причём, если я открываю файл в какой-то другой момент, то фильтры могут быть и соединены, причём у фильтра Tee образуется второй выход, который и соединяется с CC Decoder. 

В общем, либо я чего-то крупно не понимаю, либо мелкософты откровенно наваяли чего ни попадя. Второе нежелательно, ибо как тогда жить? smile

Автор: AndreySol 30.10.2009, 08:41
Цитата

Как найти нужный фильтр в списке?

Для однозначной идентификации фильтров используется GUID - глобальный уникальный идентификатор.
Если Вы в окне добавления фильтров GraphEdit'а щелкните название нужного фильтра, то внизу в окошке "Filter Moniker" вы увидите два GUID'а, взятые в скобки и разделенные слешем - первый это GUID категории фильтра, а второй - это GUID самого фильтра.
Вот пример как добавить фильтр в граф, используя его GUID:
Код

GUID CLSID_AddFilter;
UuidFromString((unsigned char*)"BC08AF6C-63AB-4E43-A774-04BCA4879810", &CLSID_AddFilter);
//// вместо BC08AF6C-63AB-4E43-A774-04BCA4879810 вставите требуемый

if(AddFilterByClsid(pGraphBuilder, L"Назовите как надо", CLSID_AddFilter, &pIBaseFilterPointer) == S_OK)
{
..................
}

///  ф-ция которая добавит в граф нужный фильтр.

AddFilterByClsid(IGraphBuilder *pGraph, LPCWSTR wszFilterName, const GUID &clsid, IBaseFilter **ppF)
{
    HRESULT hr;
    *ppF = NULL;
    if(CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)ppF) == S_OK)
        hr = pGraph->AddFilter((*ppF), wszFilterName);

    return hr;
}

с аргументами ф-ции я думаю и так все понятно

Автор: Dims 30.10.2009, 10:33
А если я открыл граф, созданный и записанный в другой программе? На графе уже есть фильтры. Как посмотреть ИХ гуиды и т.п.?

Автор: AndreySol 7.11.2009, 19:08
Ну проще всего, открыть там-же в GraphEdit'е окно добавления фильтра в граф и поискать там требуемые фильтры по названиям.

Автор: Dims 8.11.2009, 10:10
Цитата(AndreySol @  7.11.2009,  19:08 Найти цитируемый пост)
поискать там требуемые фильтры по названиям

Невозможно! При добавлении фильтра на граф я могу дать ему произвольное название, которое может не совпадать с названием в каталоге. 

Я уж не говорю о том, что идентифицировать по названиям объекты, у которых нет названий, некорректно.

Автор: AndreySol 12.11.2009, 08:29
Ну тогда никак smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)