powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Интерфейс на основе DirectX
15 сообщений из 15, страница 1 из 1
Интерфейс на основе DirectX
    #39816688
LeoAm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Хотелось бы услышать Ваше мнение по решению нижеописанной задачи.

Исходные данные
Имеется интерфейс программы:
- TImage - Фоновая картинка
- TLabel - Текстовая информация
- TButton - Кнопки управления

Вопрос
Есть ли возможность использовать вместо статической картинки видео ролик?

Если использовать форму программы для отображения DirectX (использую интерфейс IID_IVideoWindow), то перетираются кнопки и текстовая информация.
Если через DirectX брать каждый фрейм и рисовать через GDI - то тормозит и прерывается ролик.

Буду признателен за совет или похожие решения.
...
Рейтинг: 0 / 0
Интерфейс на основе DirectX
    #39816849
errorsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeoAm,

1) поиграться с регионами — но это не даст альфа прозрачности
2) FireMonkey
3) возможно как-то не оптимально рисование происходит? Попробуйте использовать TEsImageLayout из https://github.com/errorcalc/FreeEsVclComponents
...
Рейтинг: 0 / 0
Интерфейс на основе DirectX
    #39816856
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Видео на одно окно рендерить а интерфейс на другое, прозрачное, расположенное поверх окна с видео.
...
Рейтинг: 0 / 0
Интерфейс на основе DirectX
    #39817515
LeoAm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за советы

errorsoft,

Как я понял, Ваши советы касаются прорисовки изображения, а не ролика в целом.
На счет FireMonkey - не работал ранее. Посмотрю что он может предложить...

rgreat,

Ваш совет относительно двух окон я уже реализовывал.
Окно делал прозрачным используя TransparentColor. Получается все почти идеально... но есть нюанс! Компоненты ТLabel выглядят искаженно! Картинку прилагаю
...
Рейтинг: 0 / 0
Интерфейс на основе DirectX
    #39817609
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeoAm,
Какого размера кадр видео и какая частота?
...
Рейтинг: 0 / 0
Интерфейс на основе DirectX
    #39817731
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeoAmОкно делал прозрачным используя TransparentColor. Получается все почти идеально... но есть нюанс! Компоненты ТLabel выглядят искаженно! Попробуй в настройках винды отключить сглаживание шрифтов, оно в такой схеме нормально работать не может.
...
Рейтинг: 0 / 0
Интерфейс на основе DirectX
    #39817824
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeoAm
Если использовать форму программы для отображения DirectX (использую интерфейс IID_IVideoWindow), то перетираются кнопки и текстовая информация.

Вот рендеринг не через IID_IVideoWindow, а через IVMRWindowlessControl. Кнопка видна, TLabel не виден, TStaticText виден, но цвет шрифта почему-то не меняется (может стилю Виндовс соответствует).
...
Рейтинг: 0 / 0
Интерфейс на основе DirectX
    #39817825
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62,
...
Рейтинг: 0 / 0
Интерфейс на основе DirectX
    #39817827
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но некрасиво)
...
Рейтинг: 0 / 0
Интерфейс на основе DirectX
    #39817867
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62,

другие контролы нужны, которые в альфа канал нормально умеют.
...
Рейтинг: 0 / 0
Интерфейс на основе DirectX
    #39817897
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или ручками рисовать.
...
Рейтинг: 0 / 0
Интерфейс на основе DirectX
    #39817910
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне вообще трудно представить чтобы отрисовка через GDI тормозила.
FullHD bitmap на соответствующем по размеру экране с самой дешевой видеокартой рисуется ~10 мс, без нее ~2 раза дольше.
Чтобы видео не успевало отрисовываться, у него bitrate должен быть раз в 50 больше. Не уверен, что в природе существуют записывающие устройства с такими параметрами.
...
Рейтинг: 0 / 0
Интерфейс на основе DirectX
    #39826009
LeoAm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
s62,

Спасибо за отзыв.
Не имею опыта работы с этим интерфейсом. Если Ваш проект не представляет ценности, можете поделиться?
...
Рейтинг: 0 / 0
Интерфейс на основе DirectX
    #39826285
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeoAm,

Ну, граф строится так же, как и в случае с IVideoWindow.

Только вместо кода для IVideoWindow, что-то вот примерно такое (из учебно-практического :) примера, тут еще текст накладывался, смотрел, как это делается)
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
var
  GraphBuilder: IGraphBuilder; //сам граф
  MediaControl: IMediaControl; //управление графом
//  MediaEvent: IMediaEvent; //обработчик событий
  MediaPosition: IMediaPosition; //позиция проигрывания
  BasicAudio: IBasicAudio; //управление звуком
  AudioRenderer : IBaseFilter;
  VideoRenderer: IBaseFilter;
  VideoPreview: IBaseFilter;

  RenderConfig:  IVMRFilterConfig;
  WindowslessControl: IVMRWindowlessControl;

  SrcRect, DestRect: TRect;
  X, Y, Z, T: integer;



Код: pascal
1.
2.
3.
4.
5.
procedure TMainForm.TryFunc(aResult: HResult; Msg: string);
begin
  if aResult <> S_OK
  then raise Exception.Create(Msg);
end;




Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
   // создаем объект для фильтра вывода видео FVideoRender он же будет микшировать
   // наше видео с изображением текста
    TryFunc(CoCreateInstance(CLSID_VideoMixingRenderer, nil, CLSCTX_INPROC,
      IID_IBaseFilter, VideoPreview), 'Не удается создать VMR');

    //добавляем его в граф
    TryFunc(GraphBuilder.AddFilter(VideoPreview, 'Video Renderer'),
      'Не удается add Video preview');

    TryFunc(VideoPreview.QueryInterface(IID_IVMRFilterConfig, RenderConfig),
      'Не удается get RenderConfig');

    TryFunc(RenderConfig.SetRenderingMode(VMRMode_Windowless),
      'Не удается setrenderingmode');

    TryFunc(RenderConfig.SetNumberOfStreams(1), 'Не удалось задать кол-во потоков');

//    TryFunc(VideoPreview.QueryInterface(IID_IVMRMixerBitmap, ScreenBitmap),
//      'Не удалось получить битмап для наложения картинки');

    TryFunc(GraphBuilder.RenderFile(PChar(FileName), nil),
      'ошибка рендеринга файла');

    TryFunc(VideoPreview.QueryInterface(IVMRWindowlessControl, WindowslessControl),
      'Не удается get WindowlessControl');

    TryFunc(WindowslessControl.SetVideoClippingWindow(pnlTop.Handle),
      'Не удается SetVideoClippingWindow');

  //
    WindowslessControl.GetNativeVideoSize(X, Y, Z, T);
    SrcRect.Left := 0;
    SrcRect.Top := 0;
    SrcRect.Right := X;
    SRcRect.Bottom := Y;
    DestRect := pnlTop.ClientRect;
    TryFunc(WindowslessControl.SetVideoPosition(@SrcRect, @DestRect),
      'Не удается SetVideoPosition');


Вывод сообщений тут - для меня самого, в процессе разработки.

Ещё
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TMainForm.pnlTopResize(Sender: TObject);
begin
  if FPlaying then
  begin
    DestRect := pnlTop.ClientRect;
    WindowslessControl.SetVideoPosition(@SrcRect, @DestRect);
  end;
end;
...
Рейтинг: 0 / 0
Интерфейс на основе DirectX
    #39826454
LeoAm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
s62,

Спасибо за пример, все заработало, кнопка действительно не исчезает. Так что теперь проблема как оставить видимыми TLabel, TImage... в общем наследников от TGraphicControl
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Интерфейс на основе DirectX
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]