Archive for the ‘ActionScript 3.0’ Category
Tuesday, November 6th, 2007
Индусы жгут, других слов нету! )
Работал я с ними мало поэтому пока только поверхностные отжиги).
Чтобы получить список доступных устройств (вебкамер и микрофонов) нужно использовать свойство names у соответствующих классов
Camera.names : Array [read-only]
Microphone.names : Array [read-only]
Вроде все логично, но только до этого момента дальше чтобы получить конкретное устройство у класса Camera есть метод getCamera(), а у Microphone – getMicrophone() и выглядит это следующим образом:
public static function getMicrophone(index:int = 0):Microphone
public static function getCamera(name:String = null):Camera
Как-то странно подумал я: “в одном случае мы инт отдаем в другом стринг”.
С микрофоном решил проблемы быстро ), а вот с камерой уже стало интереснее.
В хелпе параметр name у getCamera() описан так :
name:String (default = null) — Specifies which camera to get, as determined from the array returned by the names property. For most applications, get the default camera by omitting this parameter.
Отдав это имя я получил огромный болт, вернее null, а не камеру. 8 раз проверил – все равно болт. В ходе эксперементов над разумом, попробывал отдать индекс камеры в виде строки, и оно заработало!
Внимание правильный ответ для решения этой проблемы:
var camera : Camera = Camera.getCamera(myIndex.toString());
//где myIndex - это порядковый номер камеры в массиве Camera.names
Привет адоб!
Posted in ActionScript 3.0, Camera, Flex, Microphone, Video | 3 Comments »
Wednesday, October 24th, 2007
В недавнем разговоре 7thsky дал ссылку на интересный проект от
Stefan Richter. Дядька западает на работу с видео неподетски. На ресурсе миного всякой полезной всячины. например как используя пхп и флеш заставить проиграть видео с произвольной позиции не загружая его полностью, есть исходники, так же Steve Savage has now ported this to Coldfusion. Правда эти примеры только для AS2 (есть в архиве файл сохраненый как CS3, но там публикация выставлена все равно в AS2 и 7 плеер ( ).
Этот сайт целый клондайк для любителей и професионалов работы с видео ). Спасибо 7thsky!
UPD срочно в номер!: 7thsky говорит: “это просто тулза дает просмотривать паблик свойства компонент менять их, просматривать стили* и всякие мелочи, скоро будет метод инвокайшн и так далее.”
Я ее еще не смотрел, но обязательно посмотрю
Posted in ActionScript 2.0, ActionScript 3.0, Video | 4 Comments »
Sunday, October 21st, 2007
В этой части мы поругаемся на NetStream.
Грубо говоря NetStream – это основа всей работы с видео/аудио. На мой взгляд основа чего-либо должна быть идеальна, ну или хотя бы близка к идеалу. А тут нам подогнали реально сырое(? или просто глюченое) решение.
В процессе решения нам понадобится всего пара-тройка напильников
Напильник номер один
NetStream – как есть просто не приспособлен для работы с видео. Если попытаться использовать пример их хелпа, то мы после запуска видео сразу же ловим эксепшин:
[code lang=”actionscript”]
Error #2044: Unhandled AsyncErrorEvent:. text=Error #2095: flash.net.NetStream was unable to invoke callback onMetaData. error=ReferenceError: Error #1069: Property onMetaData not found on flash.net.NetStream and there is no default value.
[/code]
Добрые индусы забыли добавить в NetStream метод onMetaData. Верне не один метод а всего два: onCuePoint, onMetaData, вобщем эти методы я подглядел в классе VideoPlayer, правда уже после того как я наловился эксепшинов ) еще там они объявляют метод onPlayStatus, но я не сильно старался понять зачем этот пустой метод нужен:).
И тут на выручку нам приходит напильник, просто наследуемся от NetStream и вставляем не хватающие методы, я просто стал диспатчить события с полученной инфой чтобы все выглядело однообразно:
[code lang=”actionscript”]
class VideoNetStream extends NetStream
{
public function VideoNetStream(connection:NetConnection)
{
super(connection);
}
public function onMetaData(info:Object, … rest):void
{
var evt : NetStatusEvent = new NetStatusEvent(“metaData”);
evt.info = info;
dispatchEvent(evt);
}
public function onCuePoint(info:Object, … rest):void
{
var evt : NetStatusEvent = new NetStatusEvent(“cuePoint”);
evt.info = info;
dispatchEvent(evt);
}
}
[/code]
Напильник номер два
В данной ситуации я даже незнаю кого обвинять, или адоб или создателей firefox (далее фф). Вобщем в ФФ флеш плеер не соображает когда ему скормили неверный урл. вернее 50/50 иногда есть событие что поток не найден а иногда нет, вот например на такой урл [code]http://qweqweqweqweqw[/code] фф не будет ругаться и будет пытаться молча найти его всю свою жизнь, естественно уходы в раздумия на долго не радуют пользователя и он убивает фф :'(.
ИЕ работает как часики ) сразу же ругается на неверный урл.
Напильником номер два мы переопределяем метод play у NetStream и вставляем таймер который отвечает за таймаут соединения(если стрим в течении например минуты не отвечает то мы сам диспатчим событие об ошибке). Код я не буду приводить ибо его нужно чистить и приводить в порядок, а кому нужно тот сам напишет)
Грабли номер три
Если в ситуации описанной выше у ФФ еще делать close() (даже после таймера) и заново подсунуть неверный урл, то ФФ просто падает (play(badUrl) -> close() -> play(newBadUrl));
В данной ситуации нужно еще переопределить метод close() вставив проверку на то как жилось стриму до этого.
и закусочный напильник
Учитывая асинхронность работы NetStream при “нервном пользователе” не успевает сделать close(). На приход в себя, как показывает практика, достаточно 500-1000 мс.
Что я сделал собрав эти грабли с напильниками
У меня получился класс VideoNetStream, который сам справляется с критическими ситуациями, в моем случае он просто игнорирует вызовы всех методов до тех пор пока сервер или не отдаст ответ или пока сам стрим не поймет что он не дождался. я сделал флаг isBusy который показывает окружающему миру, что стрим еще думает.
Если есть какие-то еще “фичи” стрима, пишите, будем добавлять.
Если где-то написал не то говорите )
Продолжение серии может будет, а может и нет )
И немного десерта
читать и смотреть, сначало немного на русском, а потом и официальный сайт
с картинками
Posted in ActionScript 3.0, Flex, mxml, Video | 10 Comments »
Thursday, October 18th, 2007
Вышла IDEA-7 c поддержкой Flex. И вышла 15 числа, явно день был полный ништяков
Пока особых подробностей рассказать не могу, ибо только поставил и щупаю.
Пока нащупал стандартные возможности). Фичи и не фичи пытаються обсудить тут
Поругивается на свои неймспейсы в мхмл.
Вобщем все быстро побрасили работу и давате щупать что нам дали )
Posted in ActionScript 3.0, Flex, Flex Builder 2, Flex Builder 3, IDEA, mxml | 4 Comments »
Monday, October 15th, 2007
Поставил флекс билдер 3 и решил пощупать AIR за самые интересные места, а именно за работу с файловой системой
Взял самый простой пример их хелпа по File метод browseForOpen
воткнул его в приложение
}
catch (error:Error)
{
trace(“Failed:”, error.message)
}
}
public function fileSelected(event:Event) : void
{
var stream : FileStream = new FileStream();
stream.open(File(event.target), FileMode.READ);
var fileData:String = stream.readUTFBytes(stream.bytesAvailable);
fileList.text = fileData;
}
]]>
и получил огромный болт – при нажатии на кнопку “Browse…” появляется окошко, в нем выбираешь файл но никакого события не происходит ни cancel ни select вообще ничего не происходит.
3 раза перечитал хелп, погуглил, нашел интересный блог от Benjamin Dobler – RichApps и там нашел описание мероприятия от адоба и его результатов (там есть весомый архив с различными примерами AIR приложений, в том числе и работы с файловой системой). Блог нужно читать всем внимательно 3 раза ибо интересно.
Так вот его пример работал, а мой нет разница был в том что моя переменная File был объявлена локально в функции и видимо на крысу по быстрому собралась мусорщиком %).
Правильный ответ в моей проблеме это объявить переменную как свойства класса и становиться замечательно!
}
catch (error:Error)
{
trace(“Failed:”, error.message)
}
}
public function fileSelected(event:Event) : void
{
var stream : FileStream = new FileStream();
stream.open(File(event.target), FileMode.READ);
var fileData:String = stream.readUTFBytes(stream.bytesAvailable);
fileList.text = fileData;
}
]]>
Posted in ActionScript 3.0, AIR, Flex, Flex Builder 3, mxml | 11 Comments »