Вся правда о Видео во Flex. Часть 5. NetStream, обработка напильником.
October 21, 2007 – 5:53 pmВ этой части мы поругаемся на NetStream.
Грубо говоря NetStream - это основа всей работы с видео/аудио. На мой взгляд основа чего-либо должна быть идеальна, ну или хотя бы близка к идеалу. А тут нам подогнали реально сырое(? или просто глюченое) решение.
В процессе решения нам понадобится всего пара-тройка напильников
Напильник номер один
NetStream - как есть просто не приспособлен для работы с видео. Если попытаться использовать пример их хелпа, то мы после запуска видео сразу же ловим эксепшин:
-
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.
-
Добрые индусы забыли добавить в NetStream метод onMetaData. Верне не один метод а всего два: onCuePoint, onMetaData, вобщем эти методы я подглядел в классе VideoPlayer, правда уже после того как я наловился эксепшинов ) еще там они объявляют метод onPlayStatus, но я не сильно старался понять зачем этот пустой метод нужен:).
И тут на выручку нам приходит напильник, просто наследуемся от NetStream и вставляем не хватающие методы, я просто стал диспатчить события с полученной инфой чтобы все выглядело однообразно:
-
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);
-
}
-
}
Напильник номер два
В данной ситуации я даже незнаю кого обвинять, или адоб или создателей firefox (далее фф). Вобщем в ФФ флеш плеер не соображает когда ему скормили неверный урл. вернее 50/50 иногда есть событие что поток не найден а иногда нет, вот например на такой урл
фф не будет ругаться и будет пытаться молча найти его всю свою жизнь, естественно уходы в раздумия на долго не радуют пользователя и он убивает фф :’(.
ИЕ работает как часики ) сразу же ругается на неверный урл.
Напильником номер два мы переопределяем метод play у NetStream и вставляем таймер который отвечает за таймаут соединения(если стрим в течении например минуты не отвечает то мы сам диспатчим событие об ошибке). Код я не буду приводить ибо его нужно чистить и приводить в порядок, а кому нужно тот сам напишет)
Грабли номер три
Если в ситуации описанной выше у ФФ еще делать close() (даже после таймера) и заново подсунуть неверный урл, то ФФ просто падает (play(badUrl) -> close() -> play(newBadUrl));
В данной ситуации нужно еще переопределить метод close() вставив проверку на то как жилось стриму до этого.
и закусочный напильник
Учитывая асинхронность работы NetStream при “нервном пользователе” не успевает сделать close(). На приход в себя, как показывает практика, достаточно 500-1000 мс.
Что я сделал собрав эти грабли с напильниками
У меня получился класс VideoNetStream, который сам справляется с критическими ситуациями, в моем случае он просто игнорирует вызовы всех методов до тех пор пока сервер или не отдаст ответ или пока сам стрим не поймет что он не дождался. я сделал флаг isBusy который показывает окружающему миру, что стрим еще думает.
Если есть какие-то еще “фичи” стрима, пишите, будем добавлять.
Если где-то написал не то говорите )
Продолжение серии может будет, а может и нет )
И немного десерта
читать и смотреть, сначало немного на русском, а потом и официальный сайт
с картинками

8 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