Delphi MediaPlayer настроить размер

У меня есть простая форма, которая загружает и воспроизводит видео с помощью медиаплеера и компонентов управления медиаплеером. Есть ли способ изменить размер воспроизводимого видео с помощью полосы прокрутки или чего-то подобного в RAD Studio XE6.


person dearn44    schedule 22.09.2014    source источник
comment
Какая платформа? И изменить размер с помощью полосы прокрутки. Я никогда не сталкивался с этим интерфейсом раньше. Вы уверены, что это то, что вы имели в виду? И вы изо всех сил пытаетесь использовать полосы прокрутки? Или найти, как изменить размер? Я бы предположил последнее, и в этом случае разговор о полосах прокрутки отвлекает.   -  person David Heffernan    schedule 22.09.2014


Ответы (2)


Изменение размера обычно выполняется путем изменения размера формы, на которой размещено окно просмотра, а не с помощью полос прокрутки. Попробуйте поместить медиаплеер в большую форму или панель с якорями со всех четырех сторон, чтобы он расширялся и сжимался по мере того, как вы регулируете углы формы.

person David Schwartz    schedule 22.09.2014
comment
Хорошо, давайте забудем о полосах прокрутки, я просто сказал это в надежде нарисовать лучшую картину. Допустим, я воспроизводю видео размером 340x180 и хочу увеличить его вдвое или увеличить в 2 раза, чтобы новые размеры видео были 680x360. Я не могу найти аналогичный вариант в документации embarcadero. - person dearn44; 23.09.2014
comment
Поместите его на панель, установите для него значение «Выровнять с клиентом», затем установите размеры панели. Я не знаю, позволит ли это вам масштабировать его иначе, чем пропорционально или нет, но вам легко протестировать его в среде IDE. Просто измените высоту и/или ширину панели и посмотрите, что произойдет. Дайте нам знать. - person David Schwartz; 24.09.2014
comment
Я не уверен, сделал ли я все, как должен был, но поведение видео выглядит следующим образом. Если я изменю размер панели и сделаю ее меньше исходного размера видео, то видео будет следовать. Если я снова увеличу панель, видео останется прежним. - person dearn44; 24.09.2014

Вы можете реализовать функции типа ZoomIn или ZoomOut, настроив свойство DisplayRect:

http://docwiki.embarcadero.com/Libraries/XE6/en/Vcl.MPlayer.TMediaPlayer.DisplayRect

Сначала вы, вероятно, захотите установить для DisplayRect размер элемента управления/компонента, который вы выбрали в качестве цели рендеринга, используя свойство Display:

http://docwiki.embarcadero.com/Libraries/XE6/en/Vcl.MPlayer.TMediaPlayer.Display

Чтобы избежать неравномерного растягивания, я рекомендую вам добавить необходимый код, чтобы иметь возможность вычислять правильные размеры DisplayRect при сохранении соотношения сторон.

Если вы хотите, вы можете сделать DisplayRect даже больше, чем ваш контроль рендеринга. Делая это, вы действительно достигаете эффекта ZoomIn.

Обратите внимание, что это только растягивает видеоконтент, поэтому вы можете столкнуться с потерей качества, потому что TMediaPlayer не использует для этого никаких специальных фильтров, как это делают многие коммерческие медиаплееры.

РЕДАКТИРОВАТЬ: у меня нет опыта использования TMediaPlayer на платформе FireMonkey, но после просмотра документации кажется, что все немного изменилось.

Например, в FMX есть специальный компонент TMediaPlayerControll, который необходим для рендеринга видео.

http://docwiki.embarcadero.com/Libraries/XE7/en/FMX.Media.TMediaPlayerControl

Но, глядя на документацию, я не могу найти никаких специальных свойств или методов для управления размером видео. Поэтому я предполагаю, что для реализации функций ZoomIn или ZoomOut будет использоваться тот же подход, что и для обычных компонентов FireMonkex.

person SilverWarior    schedule 23.09.2014
comment
Я заметил, что родителем в этом примере является компонент vcl, когда я использую FireMonkey. Может ли это быть причиной появления ошибки свойства DisplayRect не существует? - person dearn44; 23.09.2014
comment
Вы не упомянули, что работаете на платформе FireMonkey. Я обновил свой ответ. - person SilverWarior; 23.09.2014
comment
Действительно, я должен был упомянуть, что не использовал VCL. Не могли бы вы привести пример, поскольку я очень новичок в использовании Delphi и RAD Studio. - person dearn44; 23.09.2014
comment
Я попытаюсь сделать это, когда вернусь домой, так как у меня нет доступа к моему компьютеру для разработки. А пока посмотрите пример FMX.MediaPlayerHD, который поставляется с Delphi и находится в папке с примерами, чтобы получить более подробную информацию об этом. Если вы не установили Samples вместе с Delphi, вы можете получить этот конкретный пример по адресу: docwiki.embarcadero.com/CodeExamples/XE6/en/ - person SilverWarior; 23.09.2014
comment
Конечно, прежде чем спросить, я проверил папку с примерами. Также пытался применить некоторые эффекты, такие как инвертировать или увеличить из палитры инструментов, но безрезультатно. - person dearn44; 23.09.2014
comment
После того, как я ударился головой в течение часа, единственный способ растянуть видеовыход при использовании TMediaPlayer на платформе FireMonkey, который я нашел, — это поместить TMediaPlayerControl на панель, а затем масштабировать эту панель, чтобы растянуть ее контекст до нужного размера. Но это немного громоздкое решение, так как вам может потребоваться динамически изменить положение панелей, чтобы желаемая часть всегда была видна. - person SilverWarior; 24.09.2014
comment
Пожалуйста, проверьте мой комментарий к ответу Дэвида. Также я немного запутался, должен ли я принять ответ или было бы лучше, если бы вы отредактировали его, сказав, что это невозможно? - person dearn44; 24.09.2014
comment
Я только что подумал о другой возможности, используя ffplay для воспроизведения видео. Он имеет возможность масштабировать его в зависимости от размера окна, дело в том, что он воспроизводит видео во внешнем окне, а не внутри основной формы. - person dearn44; 24.09.2014
comment
@dearn44 Dearn44 Что касается принятия ответа: я прошу вас немного подождать. У меня еще есть несколько идей, которые я хотел бы попробовать. Что касается использования ffplay: насколько я знаю, ffplay всегда создает свое собственное окно и не поддерживает рендеринг в существующих окнах. Я могу ошибаться в этом. - person SilverWarior; 24.09.2014