Консультация № 155322
22.12.2008, 11:56
0.00 руб.
0 4 0
Здравствуйте господа эксперты.
Столкнулся со следующей проблемой: приложение содержит две формы, на каждой находятся компоненты, в порядке наложения друг на друга TDSVideoWindowEx2 (из набора dspack) panel, image плюс TFilterGraph. Для того чтобы panel и image при работе видео были прозрачные, использую код
Код:

procedure TProector.DSVideoWindowExVidColorKeyChanged(Sender: TObject);
begin
If DSVideoWindowExvid.OverlayVisible then
Begin
Panel1.Color := DSVideoWindowExvid.ColorKey;
Imagevid.Canvas.Brush.Color := DSVideoWindowExvid.ColorKey;
end
else
Begin
Panel1.Color := DSVideoWindowExvid.Color;
Imagevid.Canvas.Brush.Color := DSVideoWindowExvid.Color;
end;
end;

procedure TProector.DSVideoWindowExVidOverlayVisible(Sender: TObject;
Visible: Boolean);
begin
If Visible then
begin
Panel1.Color := DSVideoWindowExvid.ColorKey;
end
else
begin
Panel1.Color := DSVideoWindowExvid.Color;
end;
end;

Proector.panel1.Color:= Proector.DSVideoWindowExvid.ColorKey;
Proector.Imagevid.Canvas.Brush.Color:= Proector.DSVideoWindowExvid.ColorKey;
Proector.imagevid.Canvas.Pen.Color:= Proector.DSVideoWindowExvid.ColorKey;
Proector.imagevid.Canvas.Rectangle(Proector.ClientRect);

так вот на главной форме это работает, а вот на второй не хочет: panel делает прозрачной, а картинку нет, меняет только цвет на чёрный, причём если в первой форме отключить фильтр от DSVideoWindowEx то тогда всё начинает работать и на второй, хотя иногда и без отключения срабатывает. Понимаю что где-то есть глюк, а вот где не найду, толи у меня толи в наборе компонент. При воспроизведение только на одной форме можно обойтись и так , но мне надо и воспроизводить разное видео одновременно на обоих формах. Может, кто-то сталкивался с этим.

Обсуждение

Неизвестный
23.12.2008, 11:33
общий
Правильно я понимаю, что речь идет о прозрачной картинке поверх видео? Будьте с этим осторожны - на разных видеокартах это может работать очень по-разному. На большинстве карт только один оверлей (исключение, встроенный Intel, но он там слегка "калечно" реализован), на других есть особенности с ColorKey, на третих отсутствует RGB-YUV аппаратные конверторы. Использование же штатных компонент означает работу с GDI. Когда же GDI одновременно с DirectShow друг на друге - это вообще песня.

Не работаю с DSPack (хотя и советую его всем как начальный этап :)) - поэтому не знаю какую именно из технологий он использует, но на данный момент наиболее универсальным является использование VMR блока из DirectShow (в MSDN есть примеры с наложением картинок-логотипов), либо "ручное" наложение картинок с прозрачностью на полученные кадры с последующим выводом на экран самостоятельно.

В вашем случае я полагаю все-таки дело в оверлее - он один. А то что иногда срабатывает возможно срабатывает переключение блока вывода DSPack в другой режим. Попробуйте порыться в пакете и принудительно переключить его в режим отказа от использования аппаратных оверлеев.
давно
Профессионал
153662
1070
23.12.2008, 12:05
общий
Вы правильно поняли, речь идет о прозрачной картинке поверх видео. На двух машинах разные карты GeForse, но эффект одинаковый. Использовать оверлей DSVideoWindowEx не получается из-за мерцания картинки во время её изменения, такой вопрос я уже задавал. С помощью VMR я уже делал, получается вполне хорошо но, буковки привязаны к размеру видео (на разных клиппах меняется их местоположение), границы не совсем чёткие и слишком жрёт ресурсы, на испытательном компе типа пень 3 или Celeron 4 не хватает мощи видео идёт с рывками, проц на 100% загрузки, а так процентов 70 грузит. С DirectShow пока не могу разобраться, по найденым примерам в Delphi World получается не лучше. Как я понял DSPack использует DirectShow9 и DirectX9, DirectShow тоже использует оверлей видеокарты.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
23.12.2008, 18:27
общий
Два GeForce = один производитель - эффект и будет одинаковый. Под разными я понимал карты разных производителей (мне, например, приходится работать с одновременно с Intel, NVidia, ATI/AMD, Matrox).

DirectShow может использовать 4 отличные друг от друга технологии: DD Primary, DD offscreen, Overlay, 3D. Иногда на выбор можно повлиять, иногда нет. Так фильтр DirectShow VMR задейтсвует "оптимальную" по его мнению технологию (обычно 3Д-блок или оверлей). В то время как для обычного рендерера DirectShow можно "порулить" - посмотрите в graphedit свойства - страница DirectDraw для Video Renderer (не VMR - у того такой страницы нет). Может отключение тех или иных технологий поможет?

VMR прожорлив - это да, особенно на старых видеокартах. Хотя на хороших видеокартах это сложно заметить (ATI 3850, например - на ней все летает, если процессора на распаковку хватает - HD1080 сам по себе требует хорошего процессора). А для старых процессоров и карт (да еше и AGP/PCI вероятно) - есть ли вообще смысл работать?

давно
Профессионал
153662
1070
23.12.2008, 18:43
общий
В машине для которой делается программа стоит тоже GeForce 8900 только слот PCIExpress и двухъядерный проц, а у меня в рабочих машинах AGP, разница в работе и загрузки проца конечно отличаются в разы. На других видюхах пока нет возможности посмотреть программу.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Форма ответа