Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Delphi |
![]() ![]() |
LeoAm Member Откуда: Сообщений: 20 |
Здравствуйте. Хотелось бы услышать Ваше мнение по решению нижеописанной задачи. Исходные данные Имеется интерфейс программы: - TImage - Фоновая картинка - TLabel - Текстовая информация - TButton - Кнопки управления Вопрос Есть ли возможность использовать вместо статической картинки видео ролик? Если использовать форму программы для отображения DirectX (использую интерфейс IID_IVideoWindow), то перетираются кнопки и текстовая информация. Если через DirectX брать каждый фрейм и рисовать через GDI - то тормозит и прерывается ролик. Буду признателен за совет или похожие решения. |
22 май 19, 17:41 [21891070] Ответить | Цитировать Сообщить модератору |
errorsoft Member Откуда: Санкт-Петербург Сообщений: 175 |
LeoAm, 1) поиграться с регионами — но это не даст альфа прозрачности 2) FireMonkey 3) возможно как-то не оптимально рисование происходит? Попробуйте использовать TEsImageLayout из https://github.com/errorcalc/FreeEsVclComponents |
23 май 19, 01:58 [21891394] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6460 |
Видео на одно окно рендерить а интерфейс на другое, прозрачное, расположенное поверх окна с видео. |
23 май 19, 03:12 [21891401] Ответить | Цитировать Сообщить модератору |
LeoAm Member Откуда: Сообщений: 20 |
Спасибо за советы errorsoft, Как я понял, Ваши советы касаются прорисовки изображения, а не ролика в целом. На счет FireMonkey - не работал ранее. Посмотрю что он может предложить... rgreat, Ваш совет относительно двух окон я уже реализовывал. Окно делал прозрачным используя TransparentColor. Получается все почти идеально... но есть нюанс! Компоненты ТLabel выглядят искаженно! Картинку прилагаю К сообщению приложен файл. Размер - 88Kb |
24 май 19, 10:02 [21892772] Ответить | Цитировать Сообщить модератору |
Соколинский Борис Member Откуда: Москва Сообщений: 13881 |
LeoAm, Какого размера кадр видео и какая частота? |
24 май 19, 11:13 [21892917] Ответить | Цитировать Сообщить модератору |
Соколинский Борис Member Откуда: Москва Сообщений: 13881 |
|
||
24 май 19, 13:09 [21893076] Ответить | Цитировать Сообщить модератору |
s62 Member Откуда: Жуковский Сообщений: 1220 |
Вот рендеринг не через IID_IVideoWindow, а через IVMRWindowlessControl. Кнопка видна, TLabel не виден, TStaticText виден, но цвет шрифта почему-то не меняется (может стилю Виндовс соответствует). К сообщению приложен файл. Размер - 47Kb |
||
24 май 19, 15:11 [21893208] Ответить | Цитировать Сообщить модератору |
s62 Member Откуда: Жуковский Сообщений: 1220 |
s62, К сообщению приложен файл. Размер - 120Kb |
24 май 19, 15:12 [21893209] Ответить | Цитировать Сообщить модератору |
s62 Member Откуда: Жуковский Сообщений: 1220 |
Но некрасиво) |
24 май 19, 15:13 [21893211] Ответить | Цитировать Сообщить модератору |
makhaon Member Откуда: A galaxy far far away Сообщений: 3770 |
s62, другие контролы нужны, которые в альфа канал нормально умеют. |
24 май 19, 16:09 [21893269] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6460 |
Или ручками рисовать. |
24 май 19, 16:36 [21893304] Ответить | Цитировать Сообщить модератору |
Соколинский Борис Member Откуда: Москва Сообщений: 13881 |
Мне вообще трудно представить чтобы отрисовка через GDI тормозила. FullHD bitmap на соответствующем по размеру экране с самой дешевой видеокартой рисуется ~10 мс, без нее ~2 раза дольше. Чтобы видео не успевало отрисовываться, у него bitrate должен быть раз в 50 больше. Не уверен, что в природе существуют записывающие устройства с такими параметрами. |
24 май 19, 16:50 [21893320] Ответить | Цитировать Сообщить модератору |
LeoAm Member Откуда: Сообщений: 20 |
s62, Спасибо за отзыв. Не имею опыта работы с этим интерфейсом. Если Ваш проект не представляет ценности, можете поделиться? |
13 июн 19, 10:41 [21907734] Ответить | Цитировать Сообщить модератору |
s62 Member Откуда: Жуковский Сообщений: 1220 |
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] Ответить | Цитировать Сообщить модератору |
LeoAm Member Откуда: Сообщений: 20 |
s62, Спасибо за пример, все заработало, кнопка действительно не исчезает. Так что теперь проблема как оставить видимыми TLabel, TImage... в общем наследников от TGraphicControl |
14 июн 19, 10:28 [21908422] Ответить | Цитировать Сообщить модератору |
Все форумы / Delphi | ![]() |