Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Интерфейс на основе DirectX  [new]
LeoAm
Member

Откуда:
Сообщений: 20
Здравствуйте.

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

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

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

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

Буду признателен за совет или похожие решения.
22 май 19, 17:41    [21891070]     Ответить | Цитировать Сообщить модератору
 Re: Интерфейс на основе DirectX  [new]
errorsoft
Member

Откуда: Санкт-Петербург
Сообщений: 175
LeoAm,

1) поиграться с регионами — но это не даст альфа прозрачности
2) FireMonkey
3) возможно как-то не оптимально рисование происходит? Попробуйте использовать TEsImageLayout из https://github.com/errorcalc/FreeEsVclComponents
23 май 19, 01:58    [21891394]     Ответить | Цитировать Сообщить модератору
 Re: Интерфейс на основе DirectX  [new]
rgreat
Member

Откуда:
Сообщений: 5454
Видео на одно окно рендерить а интерфейс на другое, прозрачное, расположенное поверх окна с видео.
23 май 19, 03:12    [21891401]     Ответить | Цитировать Сообщить модератору
 Re: Интерфейс на основе DirectX  [new]
LeoAm
Member

Откуда:
Сообщений: 20
Спасибо за советы

errorsoft,

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

rgreat,

Ваш совет относительно двух окон я уже реализовывал.
Окно делал прозрачным используя TransparentColor. Получается все почти идеально... но есть нюанс! Компоненты ТLabel выглядят искаженно! Картинку прилагаю

К сообщению приложен файл. Размер - 88Kb
24 май 19, 10:02    [21892772]     Ответить | Цитировать Сообщить модератору
 Re: Интерфейс на основе DirectX  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 10989
LeoAm,
Какого размера кадр видео и какая частота?
24 май 19, 11:13    [21892917]     Ответить | Цитировать Сообщить модератору
 Re: Интерфейс на основе DirectX  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 10989
LeoAm
Окно делал прозрачным используя TransparentColor. Получается все почти идеально... но есть нюанс! Компоненты ТLabel выглядят искаженно!
Попробуй в настройках винды отключить сглаживание шрифтов, оно в такой схеме нормально работать не может.
24 май 19, 13:09    [21893076]     Ответить | Цитировать Сообщить модератору
 Re: Интерфейс на основе DirectX  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1010
LeoAm

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

Вот рендеринг не через IID_IVideoWindow, а через IVMRWindowlessControl. Кнопка видна, TLabel не виден, TStaticText виден, но цвет шрифта почему-то не меняется (может стилю Виндовс соответствует).

К сообщению приложен файл. Размер - 47Kb
24 май 19, 15:11    [21893208]     Ответить | Цитировать Сообщить модератору
 Re: Интерфейс на основе DirectX  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1010
s62,

К сообщению приложен файл. Размер - 120Kb
24 май 19, 15:12    [21893209]     Ответить | Цитировать Сообщить модератору
 Re: Интерфейс на основе DirectX  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1010
Но некрасиво)
24 май 19, 15:13    [21893211]     Ответить | Цитировать Сообщить модератору
 Re: Интерфейс на основе DirectX  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3403
s62,

другие контролы нужны, которые в альфа канал нормально умеют.
24 май 19, 16:09    [21893269]     Ответить | Цитировать Сообщить модератору
 Re: Интерфейс на основе DirectX  [new]
rgreat
Member

Откуда:
Сообщений: 5454
Или ручками рисовать.
24 май 19, 16:36    [21893304]     Ответить | Цитировать Сообщить модератору
 Re: Интерфейс на основе DirectX  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 10989
Мне вообще трудно представить чтобы отрисовка через GDI тормозила.
FullHD bitmap на соответствующем по размеру экране с самой дешевой видеокартой рисуется ~10 мс, без нее ~2 раза дольше.
Чтобы видео не успевало отрисовываться, у него bitrate должен быть раз в 50 больше. Не уверен, что в природе существуют записывающие устройства с такими параметрами.
24 май 19, 16:50    [21893320]     Ответить | Цитировать Сообщить модератору
 Re: Интерфейс на основе DirectX  [new]
LeoAm
Member

Откуда:
Сообщений: 20
s62,

Спасибо за отзыв.
Не имею опыта работы с этим интерфейсом. Если Ваш проект не представляет ценности, можете поделиться?
13 июн 19, 10:41    [21907734]     Ответить | Цитировать Сообщить модератору
 Re: Интерфейс на основе DirectX  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1010
LeoAm,

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

Только вместо кода для IVideoWindow, что-то вот примерно такое (из учебно-практического :) примера, тут еще текст накладывался, смотрел, как это делается)
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;


procedure TMainForm.TryFunc(aResult: HResult; Msg: string);
begin
  if aResult <> S_OK
  then raise Exception.Create(Msg);
end;



   // создаем объект для фильтра вывода видео 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');

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

Ещё
procedure TMainForm.pnlTopResize(Sender: TObject);
begin
  if FPlaying then
  begin
    DestRect := pnlTop.ClientRect;
    WindowslessControl.SetVideoPosition(@SrcRect, @DestRect);
  end;
end;
13 июн 19, 17:40    [21908139]     Ответить | Цитировать Сообщить модератору
 Re: Интерфейс на основе DirectX  [new]
LeoAm
Member

Откуда:
Сообщений: 20
s62,

Спасибо за пример, все заработало, кнопка действительно не исчезает. Так что теперь проблема как оставить видимыми TLabel, TImage... в общем наследников от TGraphicControl
14 июн 19, 10:28    [21908422]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить