Вот и подошла к концу неделя нонстоп дайва в серверсайд генерацию swf роликов. Результат…
Предыстория
Для одного из моих проектов потребовалось реализовать серверсайд генерацию SWF роликов.
Не смотря на то что тема избита и для ее реализции полно готовых инструментов, в поиске оптимального решения поставленной задачи я умудрился наткнутся на две волчьи ямы, медвежий капкан и сарай граблей.
Общая постановка задачи:
- Есть флеш ролик в fla/swf форматах, без скриптинга, созданный флеш аниматором
- Нужно разобрать ролик на запчасти и предать его во флекс приложение для дальнейшей покадровой визуализации / редактирования
- после рдактирования ролик нужно сохранить и автоматически превратить в 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–ок.
Эпилог:
В процессе решения далось близко (и не очень) познакомился со следующими инструментами:
- swfmill
- swfc (swftools)
- swfprint (adobe flex SDK)
- ming
swfmill
Оказался лучшим кандидатом, с условием будет переписан xslt
swfc
бедноват функционалом
swfprint / swfprint
Явно сырые. Я не сомневаюсь, что в flex SDK можно найти все необходимые библиотеки для сборки SWF и на их основе написать компилер swfml. Но времени на это нет похоже ни у кого.
ming
Достойная библиотека, но к сожалению не удалось ее нормально скомпилировать.
И что? Обратная генерация(сборка) только через ming? Есть ли путь сделать(записать,создать) swf средствами flex?
Минг?
В жопу минг!
Да, можно собирать байт код прямо во флексе…