Вся правда о Видео во Flex. Часть 5. NetStream, обработка напильником.
October 21, 2007 – 5:53 pmВ этой части мы поругаемся на 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 который показывает окружающему миру, что стрим еще думает.
Если есть какие-то еще “фичи” стрима, пишите, будем добавлять.
Если где-то написал не то говорите )
Продолжение серии может будет, а может и нет )
И немного десерта
читать и смотреть, сначало немного на русском, а потом и официальный сайт
с картинками
10 Responses to “Вся правда о Видео во Flex. Часть 5. NetStream, обработка напильником.”
Да уж… тяжко:)
Решил тут сварганить видео-плеер с нуля, без флексовых компонентов. Смысл прост: video, к нему аттачится NetStream, кнопка Play/Pause, перемотка. Создаем событие onEnterFrame и перемещаем бегунок перемотки в зависимости от текущего момента. Теперь происходит коллапс – на 22-24 секунде видео стопорится и все (ошибок нет). Куда плыть дальше – не знаю:)
Кстати, если убрать функцию перемещения бегунка в onEnterFrame – все играет до конца.
By Андрей Горбатов on Oct 22, 2007
Вешай на таймер этак 100-200мс, и проверь видео на котором тестируешь, бывает длинна прописанная в тегах просто не совпадает с реальной длинной.
By Ilja on Oct 22, 2007
это я компилировал через FlashDevelop. Засунул проект в билдер – все работает.
By Андрей Горбатов on Oct 22, 2007
Насчет напильника номер один: Слава их индускому богу что не засунули onMetaData, onCuePoint, onPlayStatus в класс NetStream, для этого если читать хелп, у класса NetStream и NetConnection есть свойство client [Object] (которое по умолчанию равно самому конекшну и стриму) в котором по логике вещей и должны быть определенны данные методы.
var ns:NetStream = new NetStream (nc);
var streamClient:StreamClient ();
ns.client = streamClient;
streamClient.addEventListener (
StreamEvent.META_DATA, metaDataHandler);
streamClient.addEventListener (
StreamEvent.METHOD_INVOKE, onMethodInvoke);
и так далее
By 7thsky on Oct 22, 2007
Тогда объясни мне еще тогда зачем они сделали такой финт, где практическое применение?
By Ilja on Oct 22, 2007
Для работы с ФМС, например
By 7thsky on Oct 22, 2007
а конкретнее пример можно?
By Ilja on Oct 22, 2007
могу 🙂 в скайпе или гуглтоке
skype: bit.com.at.mobile
gTalk: 7thsky.ru@gmail.com
By 7thsky on Oct 22, 2007
А чего так скрытно? я тоже хочу знать.
Почитал блог. Не могу понять как написать рабочий видео плэер на флексе. какие все же компоненты использовать или писать снуля???
спасибо
By RA Optimus on May 25, 2010
С этих пор много воды утекло. Адоб выпустил OSMF (Open Source Media Framework) http://opensource.adobe.com/wiki/display/osmf/Open+Source+Media+Framework;jsessionid=0EFA5C7FB9ED8BED3BE077BB82F9F31D Я его не пробовал но вероятно все стало более прозрачно
By Ilja on May 26, 2010