PDA

Просмотр полной версии : Серверный скриншот SWF-файла


Хемуль
09.02.2008, 15:35
Вопрос, вроде, в этом разделе ещё не поднимался...
Задача волнует многих в сети, но более-менее приемлемого решения пока не нашёл. А заключается она в том, что нужно на сервере получить высококачественный JPEG (quality 80) на стороне сервера, снятый с какого-либо обьекта во Flash'e на стороне клиента. Обьект, который нужно заснять, представляет собой контейнер с обьектами, которые может разбрасывать пользователь. Самое распространённое решение:
[BitmapData -> JPEGEncoder -> ByteArray -> пересылка на сервер с помощью, к примеру, AMF]
В принципе неплохо, но есть два больших недостатка - сильно загружается процессор и канал при сохранении картинок большого размера (близкого к 3000х3000). В принципе, можно передавать на сервер XML с положениями всех обьектов, которые разбросал по сцене пользователь, но тогда на серверной стороне нужно восстановить сцену, подождать, пока загрузятся всеобьекты и каким-то образом снять скриншот с неё. В сети существуют различные решения для этого, но почти все они по сути используют ActiveX-компонент, который, как я понимаю, доступен только под Windows. Известно ли какое-либо решение для Linux-платформ? Узнавал в сторону AIR, но он не поддерживаем Linux...

fljot
09.02.2008, 16:03
а как, пардон, происходит "восстановление сцены" в общих чертах?:confused:

Хемуль
09.02.2008, 19:33
К примеру, на клиентской стороне пользователь кладёт на сцену обьекты, которые представляют собой загружаемые извне SWF-файлы. На сервер передаются данные о координатах этих обьектов на сцене. На серверной стороне существует другая флешка, которая принимает эти данные и размещает аналогичные обьекты в тех же координатах.

†‡Paladin‡†
09.02.2008, 19:38
Я хочу заметить. что ни флэш, ни мониторы разрешения 3000*3000 не тянут. И вы как считаете - если на сервере из восстановленной сцены делать скриншот, то процессор загружаться небудет? Я сильно сомниваюсь.

Хемуль
09.02.2008, 20:00
2 †‡Paladin‡†:

> ни флэш, ни мониторы разрешения 3000*3000 не тянут

Я передаю на сервер JPG-файл, снятый с DisplayObject'а размером около 2400х1700 пикселей. Разрешение монитора значения не имеет. Флеш данными такого обьёма оперировать может.

> И вы как считаете - если на сервере из восстановленной сцены делать скриншот, то процессор загружаться небудет?

Будет, но если это делать не средствами Флеша, то результат может выйти не таким плачевным, как вам кажется.

†‡Paladin‡†
09.02.2008, 20:25
а 3000 на 3000 уже неможет. в любом случае вам надо будет запускать swf на сервере и снимать скриншоты, при том, что можно легко это забодяжить на c++, загруженный swf будет занимать память и отнимать ресурсы сам по себе. Лично мне непонятно почему нельзя повесить этот геморрой на машину клиента. кроме нескольких секунд работы проца и исходящего трафика он ниче не теряет. Танцы с бубном излишни.

Хемуль
10.02.2008, 03:53
кроме нескольких секунд работы проца и исходящего трафика он ниче не теряет
Правда? А несколько десятков секунд не хотите? А если таких картинки 3? Решение на стороне клиента для таких обьёмов данных не подходит.

†‡Paladin‡†
10.02.2008, 04:21
Правда? А несколько десятков секунд не хотите? А если таких картинки 3? Решение на стороне клиента для таких обьёмов данных не подходит.
Ну если у ваших клиентов таз марки целерон 533, то конечно будет долго. А если картинки 3, так вообще можно веревку с мылом при входе выдавать. На самом деле это все попахивает задротством и я чую тут изначально неправильный подход к решению задачи. А так можно и клиентам машины положить и себе на сервере ддос устроить. Выбор не велик.

Хемуль
11.02.2008, 02:54
2 †‡Paladin‡†:
Время покажет. ^_^
На ваше чутьё я бы не полагался... У наших клиентов комьютеры не настолько слабые, а вот у клиентов наших клиентов - Бог знает. Я сегодня попробую устроить бенчмарк на разных компьютерах. Может потом выложу результаты...

alexcon314
11.02.2008, 09:11
>>Узнавал в сторону AIR, но он не поддерживаем Linux...
т.е. для вас не принципиально в браузере флэш или в оболочке?

†‡Paladin‡†
11.02.2008, 18:59
2 †‡Paladin‡†:
Я сегодня попробую устроить бенчмарк на разных компьютерах. Может потом выложу результаты...
Это надо было сделать еще до создания темы >_>

Хемуль
13.02.2008, 12:56
2 alexcon314:
Да. Под Windows я бы написал серверное консольное приложение на Delphi или C++, которое запускает флешку в ActiveX-компоненте, восстанавливает сцену с нужными размерами, созданную пользователь, снимает с канвы компонента битовое изображение, кодирует в JPEG и сохраняет.

Это надо было сделать еще до создания темы >_>
Правда? ^_^ LoL
Я работаю с Flash-платформой не первый год и прекрасно знаю, на что оно способно, а на что - нет. Собственно, результаты говорят о том, что я был прав.

P4 1.8GHz 1.00 Gb RAM
==============
11s - quality:60 | dpi:150 | format:A5
35s - quality:60 | dpi:300 | format:A5
9s - quality:70 | dpi:150 | format:A5
33s - quality:70 | dpi:300 | format:A5
9s - quality:80 | dpi:150 | format:A5
34s - quality:80 | dpi:300 | format:A5
5s - quality:60 | dpi:150 | format:A6
17s - quality:60 | dpi:300 | format:A6
5s - quality:70 | dpi:150 | format:A6
17s - quality:70 | dpi:300 | format:A6
5s - quality:80 | dpi:150 | format:A6
17s - quality:80 | dpi:300 | format:A6

AMD Athlon XP 2100+ (1.73 GHz) 512 MB
==============
5s - quality:60 | dpi:150 | format:A5
17s - quality:60 | dpi:300 | format:A5
5s - quality:70 | dpi:150 | format:A5
18s - quality:70 | dpi:300 | format:A5
5s - quality:80 | dpi:150 | format:A5
16s - quality:80 | dpi:300 | format:A5
2s - quality:60 | dpi:150 | format:A6
8s - quality:60 | dpi:300 | format:A6
3s - quality:70 | dpi:150 | format:A6
11s - quality:70 | dpi:300 | format:A6
3s - quality:80 | dpi:150 | format:A6
8s - quality:80 | dpi:300 | format:A6

Core2 1.6GHz 1Gb DDRII
==============
5s - quality:60 | dpi:150 | format:A5
16s - quality:60 | dpi:300 | format:A5
3s - quality:70 | dpi:150 | format:A5
11s - quality:70 | dpi:300 | format:A5
3s - quality:80 | dpi:150 | format:A5
12s - quality:80 | dpi:300 | format:A5
2s - quality:60 | dpi:150 | format:A6
6s - quality:60 | dpi:300 | format:A6
2s - quality:70 | dpi:150 | format:A6
12s - quality:70 | dpi:300 | format:A6
2s - quality:80 | dpi:150 | format:A6
6s - quality:80 | dpi:300 | format:A6

AMD 2.41GHz 1Gb
==============
3s - quality:60 | dpi:150 | format:A6
8s - quality:60 | dpi:300 | format:A6
4s - quality:70 | dpi:150 | format:A6
8s - quality:70 | dpi:300 | format:A6
2s - quality:80 | dpi:150 | format:A6
8s - quality:80 | dpi:300 | format:A6
4s - quality:60 | dpi:150 | format:A5
15s - quality:60 | dpi:300 | format:A5
5s - quality:70 | dpi:150 | format:A5
15s - quality:70 | dpi:300 | format:A5
4s - quality:80 | dpi:150 | format:A5
17s - quality:80 | dpi:300 | format:A5

P4 1.8GHz 512 RAM
==============
9s - quality:60 | dpi:150 | format:A5
26s - quality:60 | dpi:300 | format:A5
7s - quality:70 | dpi:150 | format:A5
28s - quality:70 | dpi:300 | format:A5
7s - quality:80 | dpi:150 | format:A5
27s - quality:80 | dpi:300 | format:A5
4s - quality:60 | dpi:150 | format:A6
14s - quality:60 | dpi:300 | format:A6
4s - quality:70 | dpi:150 | format:A6
14s - quality:70 | dpi:300 | format:A6
4s - quality:80 | dpi:150 | format:A6
14s - quality:80 | dpi:300 | format:A6

alexcon314
13.02.2008, 13:59
>> Под Windows я бы написал серверное консольное приложение на Delphi или C++, которое запускает флешку в ActiveX-компоненте, восстанавливает сцену с нужными размерами, созданную пользователь, снимает с канвы компонента битовое изображение, кодирует в JPEG и сохраняет.

это новое слово в технологии, имхо. возможно, это кто-то уже делал, не в курсе.
меня интересует вопрос о локальном сохранении графической информации из флэша. но сам подход и здесь видится в том же духе: СТОРОННЕЕ приложение снимает графику с выводом в файл..

короче говоря, вы видите какие-либо альтернативы?

Хемуль
13.02.2008, 17:14
>> Под Windows я бы написал серверное консольное приложение на Delphi или C++, которое запускает флешку в ActiveX-компоненте, восстанавливает сцену с нужными размерами, созданную пользователь, снимает с канвы компонента битовое изображение, кодирует в JPEG и сохраняет.

это новое слово в технологии, имхо. возможно, это кто-то уже делал, не в курсе.
меня интересует вопрос о локальном сохранении графической информации из флэша. но сам подход и здесь видится в том же духе: СТОРОННЕЕ приложение снимает графику с выводом в файл..

короче говоря, вы видите какие-либо альтернативы?

Нет, не новое. ^_^ Делали, делали. Много есть решений для Windows. Все по сути платные.
Локальное сохранение? Просто методами Флеша или Флекса нельзя, потому что файлы писать из таких приложений нельзя. Можно, наверное на AIR или с Zinc'ом. А стороннее приложение я написал уже на Delphi. Глючит немного, но скриншоты делает.

alexcon314
13.02.2008, 17:31
>> Можно, наверное на AIR или с Zinc'ом. А стороннее приложение я написал уже на Delphi. Глючит немного, но скриншоты делает.

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

Хемуль
13.02.2008, 18:53
2 alexcon314:

Ну, под Windows флешки обычно отрисовываются ActiveX-компонентом. Этот ActiveX-компонент никто не мешает использовать в приложении. ^_^ В него можно легко загрузить флешку.

†‡Paladin‡†
13.02.2008, 20:07
Правда? ^_^ LoL
Я работаю с Flash-платформой не первый год и прекрасно знаю, на что оно способно, а на что - нет. Собственно, результаты говорят о том, что я был прав.

Правда. А я еще в 43м году командиром танка был и немецкую дивизию единолично в окружении взял. Правда Правда xD

Хемуль
13.02.2008, 20:49
2 †‡Paladin‡†:
Не стоит иронизировать. ^_^
К тому же вы как-то избирательно читаете сообщение. Я привёл результаты бенчмарка.

†‡Paladin‡†
13.02.2008, 23:53
2 †‡Paladin‡†:
Не стоит иронизировать. ^_^
К тому же вы как-то избирательно читаете сообщение. Я привёл результаты бенчмарка.
Да результаты не утешительные, но в связи с новыми обстоятельствами (десктопное приложение) вариант прикрутки внешней либы на си очень, очень грамотен (ну или делфи как вариант).

NikR
15.02.2008, 14:42
Я бы покопал в сторону svg файлов. Кроме того в инете есть векторизатор jpg.

Хемуль
17.02.2008, 00:47
Я бы покопал в сторону svg файлов. Кроме того в инете есть векторизатор jpg.
Зачем? Задача ведь в другом.

LinuxVideo
17.02.2008, 03:25
Рисовалку визиток/календариков делаешь? Эх, такой проект ушел у меня из под носа...

А снять скриншот легко. Открываешь в браузере свою флешку, дожидаешься отрисовки (хоть по таймеру, хоть флешка сама подаст сигнал), потом export-ом снимаешь скриншот, подрезаешь, convert-ом или еще чем-то сохраняешь в свой любимый jpeg... Разрешение любое, хоть 10000х10000, только бы сам флеш потянул, да памяти хватило. А память кушается сильно. Если на сервере нету иксов, то можно запустить их эмуляцию, например, xvnc. Дабы браузер знал, где ему рисовать свои окна, то в скрипте запуска установи переменную DISPLAY (заглавными буквами), присвой ей номер экрана, с которого потом будешь хватать... Так хватать можно чего угодно, хоть флеш, хоть скриншоты сайтов, хоть чего.

Хемуль
17.02.2008, 03:59
2 LinuxVideo:
Угу, что-то вроде такой рисовалки. ^_^
Решение с броузером гуляет по сети, но я не стал на него обращать внимание. Запускать броузер всего лишь для скриншота - это действительно сильно жестоко для сервера.
К тому же в своей программе наиболее грамотно можно дождаться загрузки всех ресурсов во флешку, а потом "пнуть" программу из флешки.

LinuxVideo
17.02.2008, 15:24
> Запускать броузер всего лишь для скриншота - это действительно сильно жестоко для сервера.

Ну не так уж и жестоко... А у тебя есть выбор?


> К тому же в своей программе наиболее грамотно можно дождаться загрузки всех ресурсов во флешку, а потом "пнуть" программу из флешки.

Так и пни. Открой сокет до сервера, скрипт выполнит скриншот в нужный момент.

Хемуль
17.02.2008, 20:57
2 LinuxVideo:
Да. Выбор есть. Такой, как я писал выше.

LinuxVideo
19.02.2008, 14:45
Мне интересно, как это запускать собрались?

Хемуль
21.02.2008, 13:03
2 LinuxVideo:
Что? Флешку? ActiveX-компонентом.