Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Embarcadero RAD Studio XE5-XE8,10.x(Seattle, Berl

Автор: asutp2
Дата сообщения: 14.08.2015 00:12
Уважаемые, работал ли кто-нибудь с проигрыванием видео через TMediaPlayer / TMediaPlayerControl в FMX?

Суть моего вопроса - мне нужно выдернуть картинку (т.е. кадр) из видеофайла. Сам файл открывается и через TMediaPlayerControl нормально проигрывается.
Но если попробовать выполнить <TMediaPlayerControl>.MakeScreenshot, то возвращается полностью черный кадр. Если сделать <TMediaPlayerControl>.PaintTo, то тоже возвращается полностью черный кадр. И такая проблема со всеми видеофайлами.

Может кто подскажет, каким образом можно получить кадр из TMediaPlayerControl?
Автор: NeoAnomaly
Дата сообщения: 14.08.2015 08:17

Цитата:
Может кто подскажет, каким образом можно получить кадр из TMediaPlayerControl?

Именно из TMediaPlayerControl не получится снять скриншот, если не лезть во внутренности компонента(стандартных средств не предусмотрено, MakeScreenshot тянется ещё от TControl-a и предназначен для работы с окнами, а для воспроизведения видео используются overlay surfaces).
Автор: ZloyBrawler
Дата сообщения: 14.08.2015 08:29
asutp2
Как наводка.
Если есть возможность, то отключите overlay режим воспроизведения у компонента.
Возможно это он во всем виноват, но не факт что это можно отключить, а если отключться, то картинка видео будет рисоваться на поверхности самого компонента, а не минуя вывод в окно на аппаратном уровне дорисовываться в нужную область экрана (вроде подменяется некий цвет фона в окне на видео поток, возможно замечали когда принтскин плеера делаешь, вместо картинки черное окно в плеере, а если картинку вставить в пайнт и его разместить поверх плеера, то в паинте начинает крутиться видео).
Автор: SuPriTo
Дата сообщения: 14.08.2015 13:37
asutp2
ZloyBrawler
Что-о вы усложняете все.
Вот пример Пример

Код:
PaintBox1.Canvas.CopyRect(PaintBox1.ClientRect, TPanelAccess(Panel1).Canvas, Panel1.ClientRect);
Автор: asutp2
Дата сообщения: 14.08.2015 14:21
SuPriTo, за пример для VCL - спасибо

Одна беда, мне нужно сделать тоже самое в FMX, а вот там такой трюк не получается. Там видимо действительно отрисовка видео происходит в ином контексте и FMX не имеет доступа к отрисованному изображению (скриншоты возвращают один черный фон).
Что интересно, при работе с захватом видео с видеокамеры (через TCaptureDeviceManager) скриншоты генерируются без проблем. Но натравить захват на файл, а не камеру, не получается.

Из всех предлагаемых решений нашел пока одно - программно делать скриншоты рабочего стола и уже оттуда вырезать скриншот моего видео (это работает). Но здесь нюанс - вдруг юзер переключится на другое приложение и тогда картинка видео опять будет невидна.
Автор: ZloyBrawler
Дата сообщения: 14.08.2015 14:27
SuPriTo
Перечитайте еще ра,з что я написал и забудьте про делфи в этот момент.

Вы рядовой юзер. Смотрите фильм в видео плеере, плеер выводит видео в overley. Вы на клаве тыкаете клавищу принтскрин. Открываете MS Paint, вставляете из буфера картинку в редактор. Если в буфер попала картинка плеера с черным экраном, а не видеорядом, то идем дальше. Размещаете окно редактора над видеоплеером с полным или небольшим перекрытием. И хопа, у вас в окне MS Paint показывается видео насквозь так сказать.
А это батенька overley. Не все плееры сейчас используют его, но TMediaPlayerControl вполне может быть и юзает. Если это так, то сколько не копируй область куда выводится выводится видео, там пустота, так как рисование видео идет не на этой поверхности, а аппаратно за кадром.
Автор: SuPriTo
Дата сообщения: 14.08.2015 15:27
asutp2
FMX есть bitmap - мне с ними надо разбираться, поэтому не получится у меня сделать.
Но думаю, если разобраться с копированием нужного bitmap, то все получится.
Автор: asutp2
Дата сообщения: 14.08.2015 16:01
Что самое прикольное, в FMX уже есть готовое средство копирования скриншота, оно кроссплатформенное и работает не только в виндах, но и на маке, и на андроиде.

Проблему в виндах можно решить отключением ускорения DirectDraw - тогда отрисовка идет через GDI и скриншоты у TMediaPlayerControl получаются правильные. Но тут опять нюанс - программно в своей программе отключить пока не знаю как, а если отключать через dxdiag, тогда отключается у всех приложений, что тоже не есть гуд))

Автор: NeoAnomaly
Дата сообщения: 14.08.2015 16:57
asutp2 уж лучше тогда залезть во внутренности компонента и подключить в цепочку фильтров свои для захвата изображения.

Может есть что то на подобии таких флагов http://docwiki.embarcadero.com/Libraries/XE8/en/FMX.Types.GlobalUseDirect2D для directshow (хотя это и мало вероятно)
Автор: SuPriTo
Дата сообщения: 14.08.2015 17:52
asutp2
Задайте свой вопрос _http://fire-monkey.ru/
Автор: stanzdor
Дата сообщения: 14.08.2015 20:31
так понимаю у меня проблема в том же русле:
нужно на каждом кадре видеопотока (камера\файл) отрисовывать своё изображение.
на камере ещё что-то можно, но вот с видео файлом вообще тяжко.
одного кросплатформенного решения может и вовсе нет.
пока что под винду делаю отдельный модуль через директ как давно знаю,
а вот для андроида может кто реализовывал рендеринг для видеофайлов?
так как вообще опыта нет тут..
Автор: Sulphide
Дата сообщения: 14.08.2015 21:06

Цитата:
так понимаю у меня проблема в том же русле:
нужно на каждом кадре видеопотока (камера\файл) отрисовывать своё изображение.
на камере ещё что-то можно, но вот с видео файлом вообще тяжко.
одного кросплатформенного решения может и вовсе нет.
пока что под винду делаю отдельный модуль через директ как давно знаю,  
а вот для андроида может кто реализовывал рендеринг для видеофайлов?
так как вообще опыта нет тут..

С этим вообще геморрой тот еще... Если нужно кроссплатформенное решение, то надо смотреть в сторону ffmpeg, НО аппаратный декодер для каждой платформы должен будет иметь свою реализацию и ковырять придется уже сам ffmpeg. Можно оставить софтовый декодер получать YUV кадр, не конвертированный в RGB (если конвертировать, то будет дикая просадка по процессору) и рендерить этот кадр шейдерами. Шейдеры впринципе все можно найти в инете, но надо вникнуть в суть как устроены YUV форматы.
если кадр необходимо еще хоть как-то обрабатывать искажать или преобразовывать то
(если для винды) о есть несколько путей:
1) софтовый декодер + аппаратный рендер (кадр из памяти перекидывать в текстуру в видеопамять и работать дальше уже с ним, перекидывание занимает время, терпимо, больше жрет декодер все равно), рендерить шейдерами.
2) nvcuvid декодер (только для карт nvidia 2-3 последних поколений), кадр декодируется целиком кудой во vram и дальше работа идет с ним именно во vram, ничего никуда кидать не надо. по времени отлично. Есть значительные ограничения.
3) для винды DXVA2-copyback режим (смотреть в lav-filters и lav-ffmpeg. Кадр декодируется аппаратным декодером видеокарты на DX поверхность, далее используется opengl interop расширение для переброски из DX в OpenGL текстуру.

Впринципе первый пункт работает для всех платформ.

зы я еще раз повторю - это все если надо производить над каждым кадром какие-то изменения. Если просто показать, то думаю тут полегче все, но опять же реализация под каждую платформу будет своя. С битмапами даже не думайте работать, не хватит процессора.
зыы еще забыл сказать что FMX очень плохо дружит с GL, не смотря на то что хедеры OpenGL.pas и OpenGLext.pas вылизаны до блеска, например нельзя выводить контекст GL в TPanel как в vcl, напрмер, т.к. HWND есть только у FMX окна, но не его компонентов. Как с DX - не знаю, скорее всего тоже плохо.
зыы ну и еще раз повторюсь, я не понимаю для чего и для кого писалась FMX... я еще понимаю если бы она на всех платформах использовала GL с низкоуровневым доступом. А так это заранее ущербная штука, нужная лишь для того чтобы выводить контролы. Все сейчас стремятся ближе к железу а эмбаркадеро, наоборот как можно дальше от него и добавляя новые тормоза, при этом начисто отрубая все плюсы конкретной платформы, что GL, что DX...
Автор: asutp2
Дата сообщения: 15.08.2015 00:09
Sulphide, как я с тобой согласен
Кстати на ffmpeg я тоже набрел, теоретически этой библиотекой и нужно пользоваться в FMX, но не хватает $999 для его покупки
Автор: stanzdor
Дата сообщения: 15.08.2015 04:12
бля, как всё сложно..
я с первой FMX ждал это.
как в тележурнале про орешек, который нам поможет расколоть эмбра..
ебал я в рот эту их кросплатформенность..
Автор: Sulphide
Дата сообщения: 15.08.2015 05:56

Цитата:
Кстати на ffmpeg я тоже набрел, теоретически этой библиотекой и нужно пользоваться в FMX, но не хватает $999 для его покупки

Ну ffmpeg-то сам по себе бесплатен, конечно, а вот (на сколько понял китайский) delphi ffmpeg vcl components - у него да касарь стоят исходники... при должном "подходе" с ним можно вполне работать под маком и виндой. Есть еще один компонент, не помню уж как называется, там в триалке какие-то дикие утечки сделаны, тоесть там триалку-то не особо поиспользуешь, даже "вылеченную"... Впринципе на хабре были статьие как самому пилить проигрыватель под dllки ffmpeg, заголовочные файлы бесплатно можно скачать с того же delphi ffmpeg vcl...

Добавлено:

Цитата:
ебал я в рот эту их кросплатформенность..

вся кроссплатформенность у них сводится к тому, чтобы под разными платформами выводить 3d кнопочки с различными "красивыми" анимациями и различные tlistview... на более серьезных вещах вся кроссплатформенность заканчивается и fmx начинает вставлять палки в колеса.. а попросту мешать.
Автор: G787
Дата сообщения: 15.08.2015 16:25
Новость Embarcadero объявила о покупке Raize Components

Теперь наконец-то появятся новые контролы вместо унылых старых ... ну и что-то там ещё наверное ...
Автор: ZloyBrawler
Дата сообщения: 15.08.2015 16:52
G787
зоопарк пополнится новыми животными...
Автор: vez
Дата сообщения: 15.08.2015 17:42

Цитата:
зоопарк пополнится новыми животными...

Самое большое животное скоро - ХЕ9 будет. Все развлечёмся!
Автор: Eternal_Shield
Дата сообщения: 15.08.2015 19:14
G787

Цитата:
Теперь наконец-то появятся новые контролы

Вместо того, чтобы тратить деньги на разработчиков, они скупают Г-конторы с их Г-компонентами.


Это мне напоминает один диалог:
-Вечно ты куда-нибудь вступаешь, Фёдор, то в г*вно, то в партию.
-Куда хочу, туда и ступаю.
Автор: ZloyBrawler
Дата сообщения: 15.08.2015 20:34
Eternal_Shield
Ничерта вы не шарите в идеологии программирования на Delphi.
Звучит она так, "Накидай родной мой на формочку побольше хЕровый красивых кнопочек и в продакшн!!!". В Delphi среде разработчиков, компоненты визуальные, наше все! Заказчику нравится и похеру, что там в недрах этих окошечек, есть ли там нормально задокументированный код, какими сущностями там оперирует программа и т.д. ...
Автор: Eternal_Shield
Дата сообщения: 15.08.2015 20:42
ZloyBrawler

Цитата:
Ничерта вы не шарите в идеологии программирования на Delphi.

Та ваще, лес лесом. 40 лет без урожая, 20 лет без водокачки


Цитата:
"Накидай родной мой на формочку побольше хЕровый красивых кнопочек и в продакшн!!!"

Так в том то и беда, что рейзовские компоненты шлак в плане дизайна. Уж лучше TMS!


Цитата:
В Delphi среде разработчиков, компоненты визуальные, наше все!

Ой, не у всех. У нас в гиганстких (SQLDetective, ClearSQL и т.д.) проектах рендеринг визуальщины (LMD) реализован в СОБЫТИЯХ самих компонентов! 100500 компонентнов и у каждого свой OnDraw! Тонны копи-паста с минорными изменениями... а вы говорите компоненты....


Цитата:
Заказчику нравится и похеру

Абсолютно верно, бизнесу пох как там всё, главное колесо крутится и оно, более-менее, круглое.
Автор: protoror
Дата сообщения: 16.08.2015 23:35
Eternal_Shield
не гоните нормальные компоненты, framecontrol есть и то хорошо
Автор: reenoip
Дата сообщения: 17.08.2015 04:08
Б***ь, лучше бы они LMD купили, а то я уже полгода жду ломанные LMD для XE8, но найти никак и нигде не могу
Автор: ChSerg
Дата сообщения: 17.08.2015 05:42
reenoip
А LMD 2015.3 не собирается под XE8 ?
Автор: reenoip
Дата сообщения: 18.08.2015 09:48
ChSerg, попробую, если узнаю, где его ломанный для XE8 взять
Автор: ChSerg
Дата сообщения: 19.08.2015 13:42
reenoip
В копилке в исходниках не он, разве?
Автор: reenoip
Дата сообщения: 19.08.2015 19:55
ChSerg, он, но...
Автор: Vo1T
Дата сообщения: 20.08.2015 12:56
Gabr дописал еще одну главу в своей книжке Parallel Programming with OmniThreadLibrary

Documented TOmniMessageQueue.
Documented TOmniTwoWayChannel.
Documented TOmniValueContainer.
Documented TOmniCounter.
Documented TGp4AlignedInt and TGp8AlignedInt.
Documented TOmniRecordWrapper.
Documented IOmniAutoDestroyObject.
Documented IOmniEnvironment.
Documented examples.
Автор: SuPriTo
Дата сообщения: 20.08.2015 14:16
Vo1T
Можно книжку выложить?
Автор: Vo1T
Дата сообщения: 20.08.2015 14:38
[more]http_ rghost.ru/66HcdXk5Z[/more]

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129

Предыдущая тема: Отмена встречи в Outlook из Excel VBA


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.