Генерация SWF на стороне сервера

Вот и подошла к концу неделя нонстоп дайва в серверсайд генерацию swf роликов. Результат…

Предыстория

Для одного из моих проектов потребовалось реализовать серверсайд генерацию SWF роликов.

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

Общая постановка задачи:

  1. Есть флеш ролик в fla/swf форматах, без скриптинга, созданный флеш аниматором
  2. Нужно разобрать ролик на запчасти и предать его во флекс приложение для дальнейшей покадровой визуализации / редактирования
  3. после рдактирования ролик нужно сохранить и автоматически превратить в standalone swf

Еси с первыми двумя задачами проблем не возникло совсем:

  • Парсим при помощи jsfl исходник swf в XML
  • Тут же во время парсинга расставляем атрибуты на экспорт
  • Экспортим ролик как библиотеку
  • Подгружаем полученный xml + swf во флекс
  • Редактируем ролик (с параллельной правкой xml)
  • Сейвим

Генерация свежих swf ок отняла у меня неожиданно больше времени чем предполагалось.
Потребности упорно не хотели совмещаться с возможностями.

Краткий лог событий:

Пятница

Выкачал с svn flex SDK, дабы опробовать мистический SwfPrint (инструмент для ревреса SWF в XML)
Утилита оказались совсем в другом месте нежели в описании (TODO добавить ссылку). В конечном итоге ее удалось найти и даже запустить. Результат получился похожий на генерируемый swfmill–ом.

Вечером уже в поезде, в исходном коде в комментариях нахожу референсы на некий swfc инструмент компилирующий все это добро обратно. Радуюсь все уже написано адобом и нужно изобретать велосипед.

Суббота

Сплю все сутки (отсыпаюсь за прошедшую неделю)

Воскресеннье

Продолжаю спать…

Вечером проснулся от голода.

Попытался найти тот самый swfc. В исходниках flex SDK пусто! В гугле пусто!
Не понял шутки… Зачем я тогда спокойно спал столько времени?

Начиню рыть SDK на премет хоть чего–нибудь!

Ура! Вот он SwfParse! A я уж думал кодеры адоба пошутили!

Таки пошутили черти.

SwfParse явно не дописан. Какие–то не задействованные ключи не прописанные методы.
Быстро поправить/запустить не удается…

отбой, светает… через пару часов ехать в офис.

Понедельник

Адобовские парсеры похоже безнадега. Берем в зубы старый добрый swfmill.

Реверсим swf ролик темплейта ( в 2 мегабайта страшного xml в перемешку с base64);
Дабы сделать ему инъекцию проведенных во флексе исправлений

Как от со скрипом…
Парсинг xml отреверсенного swf задача не тривиальная. А все благодаря обилию тегов выполняющих одну функцию но имеющих разные суффиксы (в зависимости от версии флеша и доступных фич). Так например PlaceObject может быть и PlaceObject2 и PlaceObect3. И это все при отсутствии этой спецификации (позже я её в очередной раз нашел и в очередной раз добавил в букмарки).

Плюс неразбериха с атрибутами replace=”0|1″ morph=”0|1″ (так и не понял что такое морф)

На прасинг и инъекции ушел весь день и большая часть ночи…
Но вроде все ок мувики меняются, анимируются…

И тут, ближе к утру до меня начинает доходить:

SWFML в low-level нотаци НЕ ПОДДЕРЖИВАЕТ ИМПОРТ ВНЕШНИХ ФАЙЛОВ.
(это же всего лишь интерпретация свф ролика, откуда там импорт)

Светает… В офис подтягивается мой любимый QA Engineer и начинает грузить багфиксом по совершенно другому проекту…

Вторник так и не наступил, зато был один большой 36 часовой понедельник.

Среда

8 часов сна это непозволительная роскошь!

Если swfmill в low level не дает инклюдить файлы – будем генерить их с нуля в simple нотации,
благо примеров полно.

… Твою мать …

В simple нотации есть иморт, но функционал обрезан до непреличия, а мне нужно анимировать матрицы трансформаций и цвета…

Пробую поковырять swmill–овский XSLT для simple нотации.
Почему–то грустно…

Светает… нужно поспать часик другой

Четверг

Припоминаю что у меня завалялись в лаборатории свеже–скомпиленные ming и swftools
По докам swfc (swtools) сложилось впечатление что у него всего 4 команды… Маловато.

Ming порадовал своим довольно внушительным апи. Переписываю серверный обработчик XML под ming.

… Твою мать …

Опять грабли. На моем тестовом сервере минг напрочь отказался инклюдить файлы, ссылаясь на отсутствующий класс / библиотеку. Скомпилировать по новой с необходимыми классами не удается…

Возвращаемся к swmill и его simple xslt…

А все не так страшно как показалось с первого взгляда…

Уже с документацией по swfml на руках можно доработать simple до необохдимого уровня.

Видимо когда человек долго не спит – мозг замедляет работу и все вокруг происходит очень быстро–
Не успел я дописать новый xslt и оттестировать его на проекте как выскочило утро пятницы.

Но! Уже все работает! Почти….

Кстати попутно собрал под textmate bundle с компиляцией в swfmill

Нужно вздремнуть, а то этот небритый мужик с красными глазами в зеркале начинает от меня шарахаться…

Пятница

Наконец–то удалось настроить нормальную сборку swf инклюдом изображений и swf–ок.

Эпилог:

В процессе решения далось близко (и не очень) познакомился со следующими инструментами:

  1. swfmill
  2. swfc (swftools)
  3. swfprint (adobe flex SDK)
  4. ming

swfmill

Оказался лучшим кандидатом, с условием будет переписан xslt

swfc

бедноват функционалом

swfprint / swfprint

Явно сырые. Я не сомневаюсь, что в flex SDK можно найти все необходимые библиотеки для сборки SWF и на их основе написать компилер swfml. Но времени на это нет похоже ни у кого.

ming

Достойная библиотека, но к сожалению не удалось ее нормально скомпилировать.

2 Responses to “Генерация SWF на стороне сервера”


  • И что? Обратная генерация(сборка) только через ming? Есть ли путь сделать(записать,создать) swf средствами flex?

  • Минг?
    В жопу минг!

    Да, можно собирать байт код прямо во флексе…

Leave a Reply