Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему так непредсказуемо ведут себя фильтры DS? 
:(
    Опции темы
Dims
Дата 28.10.2009, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



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

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

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



В мануале написано http://msdn.microsoft.com/en-us/library/dd...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
PM MAIL   Вверх
AndreySol
Дата 30.10.2009, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 19.6.2004

Репутация: нет
Всего: 1



Цитата

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

Для однозначной идентификации фильтров используется 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;
}

с аргументами ф-ции я думаю и так все понятно
PM MAIL   Вверх
Dims
Дата 30.10.2009, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



А если я открыл граф, созданный и записанный в другой программе? На графе уже есть фильтры. Как посмотреть ИХ гуиды и т.п.?
PM MAIL   Вверх
AndreySol
Дата 7.11.2009, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 19.6.2004

Репутация: нет
Всего: 1



Ну проще всего, открыть там-же в GraphEdit'е окно добавления фильтра в граф и поискать там требуемые фильтры по названиям.
PM MAIL   Вверх
Dims
Дата 8.11.2009, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



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

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

Я уж не говорю о том, что идентифицировать по названиям объекты, у которых нет названий, некорректно.
PM MAIL   Вверх
AndreySol
Дата 12.11.2009, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 772
Регистрация: 19.6.2004

Репутация: нет
Всего: 1



Ну тогда никак smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0422 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.