вторник, января 27, 2009

Неубиваемый звук в режиме Start. AS3

На такие грабли наткнулся:

Приложение загружает один и тот же SWF в разные контейнеры, каждый из которых проигрывает загруженный клип и имеет автономное управление звуком. В таймлайне SWF стартуется звук в режиме Start.

Контейнеры добавляются (mx:AddChild) в разных стэйтах (mx:State). Соответственно, при переключении стэйтов, я отслеживаю события addedToStage/removedFromStage для остановки/запуска клипа и включения/выключения звука (компоненты при смене стэйтов удаляются из списка отображаемых объектов, а не из памяти). Если не останавливать клипы, они всё равно воспроизводятся, даже если их нет в списке отображаемых объектов, а так же и их звук, что, понятное дело, совсем не хорошо.

Так вот. При старте звука в режиме Start в одном контейнере, в другом этот звук уже не начнет воспроизводиться заново, а будет продолжать играться. Регулировка громкости так же будет влиять только на него. В остальных режимах, дело ясное, всё работает независимо.

Остановка таймлайн-звука для конкретного клипа в AS3 не предусмотрена.
Есть возможность отключить все звуки приложения при помощи SoundMixer.stopAll();. Как вариант, такой подход в принципе, приемлем, но остановить все звуки приложения - это значит исключить ситуацию, когда, к примеру, требуется остановить звук лишь одного компонента.

вторник, января 20, 2009

Последние флэшеры покидают РБК СОФТ. Прощальные заметки, итоги

Всем уже известно, как кризис обошелся с РБК. Последние несколько месяцев, мы с любопытством наблюдали, как тонет этот гигант. Наверное, было не так уж плохо, когда, около 2х лет назад, РБК СОФТ и несколько других IT-компаний были отделены и собраны в холдинг Армада. Поэтому, кризис до нас добрался не так быстро. Но он добрался до нас.

Об этом конечно все знали. Осенью начались сильные перемены на верхах, ушли многие из руководства. Еще не кончился 2008-й год, а РБК СОФТ провел жесткие сокращения во всех своих подразделениях. В частности, не особо церемонясь, попрощался со своим отделом дизайна департамента интернет проектов. От прекрасной команды топовых дизайнеров осталось два-три человека. Я плохо понимаю, да и не очень хочется, что явилось причиной такого шага. Простые оправдания - кризис, убыточность, нерентабельность и т.п. Про сокращение зарплат вообще молчу, хотя, как говорят, 15% - не так уж и много.

Сокращения так же коснулись и отдела мультимедиа-презентаций, который я, собственно, представлял до конца прошлого года. После сокращения части флэшеров и специалистов по 3D- и видео-анимации, нас осталось только двое.

Начало 2009 года принесло новые сокращения. И вот, вчера было объявлено решение о сокращении флэшеров. Мой напарник уходит уже через одну-две недели. Мне дали больше времени - около месяца.

Конечно, жаль расставаться с устоявшимся образом жизни, после 3-х лет стабильной работы. Не могу сказать, что в РБК СОФТ было плохо. За время, которое я здесь работал, я приобрел огромный опыт и знания, хороших друзей, наработал приличный портфель. Работа, которой я занимался, во многом требовала творческого подхода. Несмотря на большие объемы и часто жесткие сроки, было достаточно времени на обучение и развитие. Хотя, не скажу конечно, что компания выделяла большие средства на повышение квалификации - это делалось со скрипом.

Подводя итоги своей работы в РБК СОФТ, хочется сказать, что пересмотреть результаты своей деятельности приятно:

  • Мультимедиа-презентации.
    Свою первую презентацию (не считая пары мультимедийных каталогов), я сделал еще в 2002-м для OTIS, будучи аутсорсером команды разработчиков eTeam. Позже, уже в стенах РБК СОФТ, презентация дорабатывалась и переделывалась без меня.

    Большая часть презентаций была разработана на основе движка, который я разработал еще в начале 2006-го. Одна из первых работ на этом движке - Мультимедийная презентация Fiat (самая первая - для компании "Начало" - говорящее название).

    Если говорить о работах, которыми я горжусь - это презентации Мультимедиа-презентация Лукойл, Мультимедийная презентация для «CeBIT 2007», Росстат. Предварительные итоги ВСХП по полной программе, ALM-Development, Комитет Рекламы Правительства Москвы. Еще был очень интересный проект - презентация самого департамента презентаций, с каталогом работ.

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

  • Моя первая презентация на Flex. По сути, это интерактивная карта. Здесь, это on-line версия карты (к сожалению, клиент выложил не все материалы, поэтому много фотографий отсутствует). Изначально, это была мультимедиа-презентация на CD, которую, по просьбе клиента выложили в Интернет.
    Это был не первый опыт Flex-разработки, но мой первый коммерческий проект на Flex.

  • Игры и открытки. Я провел много приятных часов над их разработкой. Вот некоторые из них: Игра для ПНП «Здоровье», "Ледовое шоу маленьких поросят", ХЦ мышератор (первые две игры были созданы на базе физического движка моей разработки под flash 7-8, Мышератор - на Fisix под flash 9). Были и с раздеванием (жаль хостинг прикрыли), и просто заставки.

    Почти все игры на Детском Портале Москвы - наша работа. Есть хорошие, есть не очень. Не так давно, я разработал движок для кроссвордов, на базе которого работают Кроссворды. Они есть так же и на Молодежном портале Москвы.
    Для этого же портала, я разработал мультиплеерные игры Шашки и Го с использованием Flex и SmartFox. Опыт разработки мультиплеерных игр был получен при разработке игрового проекта (не буду называть, из коммерческих соображений) который, увы, так же был погублен кризисом и не был окончательно доделан и опубликован.

  • Банеры - до сих пор висит на сайте банер с шахматами, который я сделал в 2006 году. Тогда были золотые времена, когда хватало времени заморочиться на банер с 3D-эффектами.
    Могу с гордостью сказать, что вращающуюся монетку в логотипе сайта Сбербанка cделал я (не смотря на то, что смотрится она там, конечно, несколько абсурдно).

  • Работы по различному интерактиву, такие как ротатор рекламы на ТВ3, интерактивные карты с редактором в CMS (к сожалению, модуль карты для Raiffeisen еще не опубликован).

  • Flash-сайтами мы занимались крайне редко, ввиду специфики департамента мультимедиа-презентаций.
    Самая первая моя работа в РБК СОФТ, был сайт компании Steelar. Мне любезно предложили доделать flash-анимацию главной страницы и сделать форму заявки (нудная работа, от которой тогда все флэшеры открещивались), чем я и занялся с энтузиазмом, и в итоге, прикрутил даже печать формы из flash.

    Полностью флэшовый сайт для компании Базовый Элемент. Сейчас здесь уже совсем другой сайт. Но еще не так давно, это был сайт, полностью сделаный на flash 6, посаженный на CMS, с возможностью редактирования контента и deep-linking.

    Еще один сайт - VI, создававшийся в эпоху flash 8. Здесь я по полной оторвался, используя фильтры, включая DisplacementMap. Сейчас этот сайт на поддержке других разработчиков, но кардинальных изменений нет. С сожалением отмечаю, что это сайт выглядит несколько недоделанным. Виной тому были политические и материальные причины.

    Один из последних проектов - главная страница Детский портал Москвы. Гордиться этой работой пока не могу. Великолепный дизайн и громадная работа по разработке убиты кризисом и сроками. Несмотря на обширные работы по оптимизации, заставка забивает процессор по полной, а всё по одной причине - она не должна масштабироваться. Но она это делает, а следовательно включается сглаживание.
    Но доработка была отложена до лучших времен. Надеюсь, что эти времена настанут.

Забавно... Пост плавно преобразовался в нечто похожее на резюме или портфолио. Конечно это далеко не все работы, которые были сделаны в стенах РБК СОФТ. Кроме того, еще столько же было сделано на фрилансе, но об этом сейчас речь не идет.

Жизнь продолжается, ухожу в свободное плавание. Что будет дальше - время покажет...

Было и хорошее и плохое, и интересные проекты и не интересные, и удачи и провалы. Главное - прекрасные люди, с которыми я работал в команде. Кто-то сейчас еще в стенах РБК-СОФТ, кто-то давно ушел или попал под сокращение. Нам еще предстоит много работать вместе, но сейчас хочу сказать им всем огромное спасибо. Несмотря на развал, все кризисы и прочий негатив, в памяти остались только самые хорошие воспоминания.

Я на воротах

понедельник, января 19, 2009

Сохраняем звук с микрофона на сервер

Сегодня на повестке дня стоит вопрос - как записать звук и сохранить его на сервер при помощи Flash. Задача с первого взгляда простая, попробуем-ка с ней разобраться.
Не забываем, что снять звук напрямую в Flash Player нельзя: Flash-разработка: Прокол с микрофоном.

Для начала, поглядим, что скажет наши самые близкие помощники - Adobe Flex 3 Help и Adobe® Flex™ 3 Language Reference:

Главная статья о работе со звуком. Тут мы проваливаемся в Capturing sound input и смотрим, как получить звук с микрофона и что, собственно, можно сделать с этим звуком.

Итак, Microphone - класс, который нам позволит записать звук с нашего микрофона.
При использовании микрофона, необходимо, чтобы размер окна нашего приложения был не менее 215 x 138. Иначе ничего не выйдет - Flash Player должен вывести из соображений безопасности окно подтверждения использования микрофона (а как бы здорово было бы скрыть это окошко и подслушивать, что там говорят юзеры про наш сайт :). Кстати, умные люди додумались, как это сделать). Класс позволяет выбрать и активировать при помощи метода getMicrophone нужный микрофон, настроить характеристики записи.

  • Accessing a microphone - читаем и копипастим, как активировать микрофон.
  • Routing microphone audio to local speakers - возможность транслировать звук на колонки юзера. Это наверное для того, чтобы лучше себя слышать в наушниках или сделать эдакий "громкоговоритель" :). Скорее всего, эта функция нужна для того, чтобы юзер мог убедиться собственными ушами, что его микрофон работает.
  • Altering microphone audio - вкратце о том, как поменять громкость и частоту.
  • Detecting microphone activity - рассказывает о таком полезном свойстве, как отключение приема звука через интервал времени silenceTimeout, если его уровень activityLevel менее silenceLevel. Это экономит производительность и трафик, в общем - очень правильный подход. При отключении микрофона после тайм-аута и его включении при появлении звука, генерируется событие ActivityEvent.ACTIVITY, что и помогает нам включать и выключать запись звука. Нужно также учесть, что микрофон включается не сразу, а после некоторой задержки - это плата за экономию трафика - если установить порог тишины, то микрофон отключаться не будет, но зато и задержка исчезнет.
  • Sending audio to and from a media server - то что нам и нужно. Говорят, что нет ничего проще - приаттачить объект нашего микрофона к NetStream и передавать данные прямо на сервер типа Flash Media Server.

Вот, собственно и вся теория. Переходим к практике. Для начала, пошуршим по Гуглу на предмет нашего вопроса.

Как я понимаю, нас интересуют серверы, которые обеспечивают потоковую передачу данных по средством протокола RTMP или Real Time Messaging Protocol.

Вот информация о медиа-серверах:

Итак, рассмотрем претендентов на использование в качестве сервера:

Flash Media Server:
Семейство продуктов Flash Media Server - лидирующее решение для задач обработки потокового видео, рилтайм-коммуникаций. В общем, как всегда у Adobe всё безупречно и дорого. Лучше смотреть таблицу сравнения редакций сервера. Для нашей задачи, вполне достаточно версии Flash Media Streaming Server, ценой в пределах $1k (если не ошибаюсь, платить надо каждый год).
Есть и такие мнения: Не так уж и хорош Flash Media Server. Передача данных с FMS на веб-сервер.
Опыта разработки крупномасштабных on-line систем у меня нет, поэтому делаю пока основанный только на воспринятой информации, чисто субъективный вывод - использовать FMS для записи звука - качественная стрельба по воробьям из ракетного комплекса.

Wowza: Относительно свежий, годичной давности, сервер. Не бесплатный, но все же на много дешевле (Wowza Media Server Pro...имеет более гуманную лицензионную модель) чем FMS медиа-сервер. Русскоязычной информации по серверу не так много, а документации, предоставленной на сайте, вполне достаточно.
Полезная информация: RTMP транспорт для Flashphone.ru теперь обеспечивается Wowza Media Server.

RED5: Самый популярный опенсорсный медиа-сервис. Информации про него - море, хотя на сайтах проекта черт ногу сломит. Есть довольно кривая документация в PDF.
Начать можно, хотя бы вот - со статьи "Начало разработки с Red5". Вот еще статейка, которая поможет нам начать: Изучаю Red5 с нуля =). Тут же имеется ссылка на доки.
Полезная информация: Red5 на Википедии, RED5 на ohloh, Red5 Plugin для Eclipse IDE - beta 1, red5-recorder.

Кстати, любопытный факт. SmartFox Server так же позволяет работать с потоковыми видео и аудио. Отвечает за это дело, некий модуль, именуемый RedBOX, который базируется, как вы уже догадались, на Red5 project. Модуль этот, само собой, бесплатный, так что, при желании, можно организовать видео-аудио общение игроков в процессе онлайн-игры. И с документацией тоже всё в порядке. Что тут говорить - молодцы, здорово подсуетились.

haXeVideo: Многопоточный сервер, осуществляющий управление FLV-видеопотоками. Это совсем свежий, конечно же бесплатный, сервер, полностью написанный на haXe, легкий, не требовательный к производительности сервера, и очень масштабируемый. Вот Официальный релиз haxeVideo 1.0. Собственно, никаких видимых сложностей для использования сервера нет - это можно наблюдать в небольшом туторе Пробуем haxeVideo. Как видно из примера, серверная часть не потребовала ни сложного конфигурирования, ни программирования. Однако, мы наблюдали появление FLV-видео, а вот как насчет, к примеру MP3? Поиски привели к какой-то почтовой переписке, но я так с ней и не разобрался. Вообще, информации пока мало, но это не значит, что сервер haXeVideo не является достойным решением.

Mammoth - The Open Source Flash Streaming Server.
Собственно релиз от Роста Встречайте Open Source Flash Media Server — Mammoth раскрывает основные моменты. Кроме того, жаркая дискуссия в этом посте может здорово помочь в выборе медиа-серверов и раскрыть их сильные и слабые стороны.

А вот к примеру, интересно посмотреть, как реализуется простой PHP-streaming.
Есть способ с исходниками, 'Streaming' flv video via PHP, take two. Правда он работает не на запись видео а на воспроизведение. Совсем старый... Но посмотрите, внизу есть пара апдейтов конца 2007-го. Попробуем качнуть. Действительно, здесь довольно замысловатый, но аккуратный PHP код и два fla (под FP7 и FP8) с проигрывателями всего этого безобразия.

Kaltura. Это целая опенсорсная видео-платформа (как нам рассказывает OSFlash). Она позволяет интегрировать в любой сайт множество интерактивных медийных наворотов с полной поддержкой онлайн-видео. Говорят, можно легко инсталлировать модули на такие веб-платформы как MediaWiki, WordPress, Drupal, Joomla и тд. И на ней сидят такие сайты как MySpace, YouTube, Flickr, ccMixter, Jamendo, и даже The New York Public Library.
Сайт тоже очень качественный, что даже странно для опенсорсной платформы.
Kaltura посвящен раздел Википедии на русском.
KalturaServer отвечает за управление контентом и правами, хранени, доставку, обработку, видео- и аудио- кодирование и прочее.
Клиентская часть (Flex), KalturaCVF, Kaltura Collaborative Video Framework, представляется тремя уровнями:

  • Core - ядро (управление видео, событиями, метаданными и т.д.).
  • KalturaPresentationLayer - уровень визуализации (набор библиотек управления стилями, скинами, связыванием данных и т.п.).
  • KalturaWidgets - богатый набор Flex-приложений, который, действительно впечатляет.

Интересно, на сколько всё это понятно и бесплатно. Короче, надо смотреть, тут море информации. В русскоязычном интернете я кроме новостей и анонсов ничего толком не нашел. Может быть не там искал?

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

* * *

Понемножку просматриваю ресурсы по медиа-серверам. Читая про Red5, выяснил, что писать звук с клиента в формате MP3 он не умеет, по причине того, что Flash player поддерживает только аудио-формат NellyMoser, а сервер всего лишь снимает входящий поток. Утилит под Linux для транскодирования NellyMoser по-видимому нет.
При таком раскладе, haxeVideo вполне равноценно Red5 в плане записи mp3.
Однако, часто упоминается некий проект ffmpeg, и как про него говорят, он поддерживает FLV. Кроме того, есть упоминание о разработке потокового сервера ffserver. И проекты, где использовался.

Еще информация по записи звука Red5: Flash Media Server and Red5 Resources.

* * *

Добрался до конвертации flv -> mp3. По этой теме есть следующие идеи: Converting audio FLV file to MP3?, где предлагается конвертировать NellyMoser в WAV, а затем уж в MP3, что не вызывает проблем. А решается это при помощи следующего инструмента: nellynomore. Работает ли это или нет - не могу сказать. Скоро узнаем.

* * *

Информация о установке RED5 на FreeBSD:
http://osflash.org/red5/suse (говорят, что вроде работает)
http://www.opennet.ru/openforum/vsluhforumID1/77112.html
http://portsmon.freebsd.org/portoverview.py?category=www&portname=red5

* * *

haxeVideo и FreeBSD:
http://haxe.ru/node/151#comments

* * *

rubyizumi
RTMP Server(MP4/H.264) for Flash video/audio streaming written in Ruby

воскресенье, января 18, 2009

Как сохранить из Flash изображение II

Продолжаем совершенствование технологий, и подбираем новый метод сохранения изображений на сервер.
Последний раз мы это делали здесь: Как сохранить из Flash изображение в формате JPG. Посмотрим, насколько с той поры наука шагнула вперед.

Шуршим по гуглу и отвергаем посты, старше 2007-го года.

Итак, ссылок море, но все сводится к одному простому решению:
Using the AS3 Jpeg Encoder от Henry Jones.
Более коротко это описано здесь: Saving JPEGs with Flash,
довольно развернуто здесь: Save JPG JPEG PNG BMP Image Action Script 3.
Тут flash используется для конвертации и загрузки изображений на сервер: Using AS3 to Upload and Encode Images.
А вот здесь, даже разработали класс AS3 ImageSaver Class v1.0, который сохраняет изображения на сервер. Можно пользоваться.

Смысл прост - снимается BitmapData с интересующего нас клипа, кодируется в JPEG/PNG, что дает ButeArray, который затем и отправляется на сервер.

Но почему, все они используют Adobe AS3 Corelib классы, а в частности com.adobe.images.JPGEncoder? Ведь FlexSDK уже давно имеет mx.graphics.codec.JPEGEncoder и mx.graphics.codec.PNGEncoder. Попробуем разобраться.

Если с классами SDK всё понятно - все они в документации Flex SDK, то для исследования Corelib ознакомимся с документацией. Здесь множество других интересных классов, но в данный момент нас не интересующих. Возможно, какая-то часть этих классов была включена в SDK позже. Других объяснений я не нахожу.
Другое подозрение: в этой статье New Flash 10 Class: SavingBitmap так же используются эти классы, и автор делает упор, что нужен Flash Player 10. Но вот небольшой обзор Класс ImageSnapshot (Flex SDK 3), в котором никаких подобных требований не оглашается. В общем, разберемся в процессе разработки - благо, поменять кодеки можно в любой момент. (Позже выясняется, спасибо BlooDHounD - что б я без него делал :), что CoreLib пользуют, "из-за отсутвия в нём флекса").

Кстати, Еще одна статья "as3corelib Tutorial:How to Use JPEGEncoder and PNGEncoder Class in Flex" с демкой дает нам возможность сравнить кодирование при помощи кодеков Corelib и Adobe.

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

Итак, берем за основу один из примеров, и пробуем.

* * *

Получить BitmapData и закодировать его нужным кодеком (от Flex SDK) - дело пяти минут. А вот сохранить изображение - это уже задача не простая.

Я начал с примера Using AS3 to Upload and Encode Images и на 4-м пункте, столкнулся с неким классом, именуемым UploadPostHelper. Ссылка вывела на еще один пост о сохранении из flash изображений на сервер: how to impress your friends by taking an image snapshot of a flash movie and automatically uploading the jpg to a server in three easy steps. Оказалось, что это очень полезный класс, который позволяет заключить в один запрос, помимо данных с изображением, набор передаваемых через POST переменных в виде пар Имя=Значение.

В моем случае, такой необходимости нет, всё что мне нужно, я буду передавать через GET. Но на будущее, запомним UploadPostHelper - это очень полезный инструмент. В целях упрощения, я беру код, относящийся к сохранению из Save JPG JPEG PNG BMP Image Action Script 3. Он довольно избыточен, но рабочий (скачал и проверил на своем хосте), и основные моменты можно вполне позаимствовать.

* * *

Код работает отлично, проблем не возникало, за исключением PHP, который при ошибке возвращает не пару "имя/значение" а простую строку, что вызывало ошибку. Но это было при отладке, так что когда я заменил эту строку на пару типа "status=Error", всё встало на свое место.

пятница, января 09, 2009

Что можно сделать с классом из подгружаемой SWF-библиотеки

А вот меня давно интересовал такой вопрос: можно ли подменить/модифицировать класс из подгруженного SWF, который был ассоциирован (или не был ассоциирован но определен по умолчанию) с клипом по средством "Export for ActionScript"?
Если не ошибаюсь, в ActionScript 2 такая возможность была.

Цель моей задачи такова: в некотором таймлайне подгружаемого SWF периодически появляется клип. При его появлении, с ним необходимо проделать какие-то действия.
В обычных условиях, с этим клипом ассоциируется класс (лежащий по соседству с FLA), в конструкторе которого и производятся эти действия.
Но вся прелесть-то в том, чтобы не было никаких скриптов ни в таймлайне, ни рядом с FLA. А всё что нужно делало бы загружающее этот SWF приложение - добавляло необходимый функционал подгруженному клипу.

Перерыл хелп и гугл - безрезультатно... Может быть не там искал. В итоге, модифицировать класс внешней библиотеки во время исполнения (бестолковое свойство prototype не в счет), либо подменить его не получилось, и ничего подходящего найти не смог.

Пока пойду обычным путем - класс клипа в конструкторе будет кидать событие с бабблингом: "Как получать сообщения от внедряемых/подгружаемых SWF. AS3".

* * *

Огромное спасибо BlooDHounD (см. комментарии). Его совет действительно работает.
Опробовал два метода:

  1. Класс, в подгружаемом SWF, задается в поле "Class" диалога "Linkage properties" для нашего клипа:
    classes.intrinsic.AssetCreationDispatcher
    При этом, никаких файлов классов поблизости с FLA создавать не требуется - класс создается "по умолчанию" (intrinsic - я назвал пакет этим словом, т.к. представленный метод мне отдаленно напомнил одноименный механизм в ActionScript 2.0).
    Затем, в загружающем приложении, я определяю класс classes.intrinsic.AssetCreationDispatcher но уже реальный, с необходимым кодом в AS-файле (в моем случае, это извещение приложения о создании клипа).
    Приложение загружает SWF, и при каждом появлении клипа в таймлайне ловит события от создающегося клипа, что показывает trace(
    ObjectUtil.getClassInfo(event.target).name)
    :
    classes.intrinsic::AssetCreationDispatcher
  2. Класс, в подгружаемом SWF, задается в поле "Base class" диалога "Linkage properties" для нашего клипа:
    classes.intrinsic.AssetCreationDispatcher
    Поле "Class" содержит имя класса "TestClip1".
    Создаю также другой клип с именем класса "TestClip2", и тем же "Base class".
    Приложение загружает SWF, и при каждом появлении вышеперечисленных клипов в таймлайне, в ловит события от создающегося клипа. Trace показывает уже:
    TestClip1
    TestClip2

Еще одна приятная возможность, которую дает нам такой прием:
Мы можем определить в классе-заглушке клипа загружаемого SWF ряд пустых методов (можно сказать интерфейс), а в рабочем классе загружающего приложения - этот же набор методов со всем необходимым кодом. В таймлайне наших клипов мы можем вызывать эти методы в любом месте, где только захотим, и они будут отрабатываться нашим главным приложением в соответствии с его кодом.
Конечно, для случая №1, все-таки нужно будет создать соответствующий AS-файл, иначе компилятор не пропустит вызовы неопределенных методов. Однако, для случая №2, создавать методы-заглушки даже не потребуется - компилятор пропускает такие вызовы. Ошибка времени исполнения будет генерироваться только в случае автономного выполнения загружаемого SWF. Но при выполнении его, будучи загруженным в приложение (которое, конечно, реализует весь набор методов), всё работает корректно.

Кроме того, важно, чтобы "совмещаемые" классы имели полностью эквивалентные имена, пакеты и цепочки вложенности пакетов. Иначе, они будут расцениваться как разные классы и не будут "совмещаться". И, конечно, загрузка производится в ApplicationDomain.currentDomain.
Еще одно важное замечание. Версия класса, которая включается в приложение, должна быть задействована каким-либо образом в коде приложения, иначе класс при компиляции не будет включен в приложение. Для этого, я сделал статический метод register(), который вызываю при инициализации приложения. Этот метод может ничего не делать - важно, что при наличии его вызова, класс будет внедрен в приложение при компиляции.

Еще одна достопримечательность этого метода: различные приложения, загружающие подготовленные таким способом SWF, могут реализовывать заготовленные в нем интерфейсы по-своему.

Еще раз спасибо BlooDHounD :). Вот что интересно - ведь такой подход имеет место быть не случайно, иначе, наверняка бы было предусмотренно какое-нибудь исключение, сообщающее о конфликте имен классов. Скорее всего, эта возможность даже имеет какое-нибудь название. Объяснение работоспособности этого подхода объясняется в документации к LoaderContext.applicationDomain (возможно объяснение есть где-то еще):
"Loader's own ApplicationDomain.
You use this application domain when using ApplicationDomain.currentDomain. When the load is complete, parent and child can use each other's classes directly. If the child attempts to define a class with the same name as a class already defined by the parent, the parent class is used and the child class is ignored.
" Другими словами, если существует конфликт имен классов, класс из загружаемого контента игнорируется.

* * *

Любопытная бага (предвидел, что будет что-то неладное). Оказывается слово intrinsic во Flex всё еще является ключевым (хотя в ActionScript 2.0 Migration про него написано, что его удалили) и выделяется жирным шрифтом. Любопытно, что автокомплит никак не хочет нормально работать с пакетами, обозванными этим именем, а в import-ах вообще начинает творится бардак. Лучше от него избавиться - может оно и к лучшему - тут подойдет что-нибудь типа classes.templates.
Кстати, порой приходится долго ломать голову над тем, как назвать тот или иной пакет/класс/метод/переменную. Иногда, размышляя над какой-нибудь сущностью (и вкапываясь в Lingvo), можно убить больше часа. Но оно стоит того.