Silverlight vs Flash: Video Codec Comparison*

Thursday, July 3rd, 2008

Статья о сравнении производительности видео кодеков от Silverlight и Flash.

В кратце, дела у Silverlight похуже чем у Flash, но сильных различий невидно.
При просмотре тестовых видео качество у Silverlight будет похуже — проскакивают непонятные квадратики.

Сложившаяся ситуация не может не радовать — конкуренция великая сила). В данный момент, по моему мнению, мы имеем двух противников адоб и майкрософт и этих противников совершенно разные политики достижения целей: адоб дает хорошие инструменты, майкрософт “скупает” разработчиков. Адобу творит чудеса в плане флешплеера (да и софта в целом), но ему нехватает мобильности и желания активно работать с флеш-сообшеством (покрайней мере отечественным). Майкрософт делает свои “обычные” порой тормознутые вещи, но ведет активную работу с сообществом программистов, привлекая и стимулируя(читай “подкупая” 🙂 ) их разными плюшками, конференциями, софтом. Причину почему этого не делает адоб я незнаю, то ли денег нехватает, то ли желания, то ли представители в странах СНГ не работаю как нужно (кстате может спросить об этому у Главы представительства Adobe Systems в России и СНГ, вроде как 2й год работает, должен знать ситуацию).

Вобщем берем попкор и смотрим за событиями дальше. Обещают, что будет интересно.

UPD: пример работы MS )

________________
*скопировано оригинальное название статьи )



Вся правда о Видео во Flex. Часть 6. Camera и Microphone.

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

Привет адоб!



Интересный ресурс о работе с Video и не только + немного дебага

Wednesday, October 24th, 2007

В недавнем разговоре 7thsky дал ссылку на интересный проект от
Stefan Richter. Дядька западает на работу с видео неподетски. На ресурсе миного всякой полезной всячины. например как используя пхп и флеш заставить проиграть видео с произвольной позиции не загружая его полностью, есть исходники, так же Steve Savage has now ported this to Coldfusion. Правда эти примеры только для AS2 (есть в архиве файл сохраненый как CS3, но там публикация выставлена все равно в AS2 и 7 плеер ( ).

Этот сайт целый клондайк для любителей и професионалов работы с видео ). Спасибо 7thsky!

UPD срочно в номер!: 7thsky говорит: “это просто тулза дает просмотривать паблик свойства компонент менять их, просматривать стили* и всякие мелочи, скоро будет метод инвокайшн и так далее.”

Я ее еще не смотрел, но обязательно посмотрю



Вся правда о Видео во Flex. Часть 5. NetStream, обработка напильником.

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 который показывает окружающему миру, что стрим еще думает.

Если есть какие-то еще “фичи” стрима, пишите, будем добавлять.
Если где-то написал не то говорите )

Продолжение серии может будет, а может и нет )

И немного десерта

читать и смотреть, сначало немного на русском, а потом и официальный сайт
с картинками



Вся правда о Видео во Flex. Часть 4. VideoDisplay – практическое применение, где мой шоколад?

Wednesday, October 10th, 2007

Почему же не получилось шоколада?

Причин в этом несколько.

1. Стабильность

Когда я был маленький, у нас вел программирование “злой дядя” Овсянник В.Н. , “злым” его считали за то, что он валил практически любую программу принесеную на ему на здачу (дз или курсач). Делал он это довольно просто – брал и вводил неадекватные данные (если нужно было ввести строку то пихал в нее этак символов 500, или нажимал клавиши кнопки не в той последовательности), и ПО юного программиста падало. Это было его первым действием и оно было на эффективно почти на все 100%. Естественно юные таланты отправлялись дорабатывать свою программу.

Таким способом я поступил со своим прототипом плеера. Получилось полная лажа.

Если у нас кроме плей и стоп, есть премотка, а еще не дай бог мы решили менять source у
VideoDisplay, то плеер наш “держится” аж 10-15 секунд усиленого клика ). Потом он уходит в ступор и уже не реагирует на кнопки и обратно уже не возвращается, о своем плохом состоянии он ничего никому не говорит. UPD: говорит, и возвращаеться! только ждать нужно ооооочень долго, в зависимости от наклацаного и коннекта у меня оказываеться просто не хвалило терпения дождаться, дождется ли пользователь? Помогает только F5.

2. Удобство для пользователя

Пользователь, сука, нервный.

Моделируем ситуацию 1:
Я пользователь зашел посмотреть видео. Есть небольшой плейлистик и не очень быстное соединение (или у пользователя или напрягли сервер). Я выбираю видео, жду, но тут я понимаю что рядов в списке именно то видео которое меня интересует больше, поэтому жму на нем. И мне хочется чтобы оно заиграло быстренько заиграло ну я начинаю пыцкать плей, потом думаю что нужно чтобы забуфирилось жму паузу, затем еще раз плей. тут на помощь приходит наш пункт 1 Стабильность и плеер падает) на очень долго задумывается, настолько что можно подумать что висит(.

Ситуация 2:
Я пользователь смотрю видео, но некоторые места мне не интересны я начинаю кликать по перемотке и если не дай бог какие-то тормоза (коннект, или машина слабая) и плеер не успевает мгновенно отреагировать то я кликаю еще раз что только усилывает тормоза, затем еще раз… а потом я решаю вернутся назад… вобщем кликаю много.
В при использовании VideoDislpay это вообще фатально ибо, у него не точный seek, что особенно заметно на очень маленьких роликах, он хранит всю(!) истории этих кликов (вернее команд перемодки). т.е. при перемотки он перематывает сначало на первый клик, раздупляется, мотает на второй, и т.д. А пользователь за время раздупления может сделать 5 кликов. И они все отобразятся. Выглядит просто это супер особенно если мотать на разные места, такая машина времени ), пользователь начинает нерничать и кликает еще и еще и плееру становится все хуже и хуже… Я пробовал – можно наклацать так что этот дергаться будет еще секунд 30 :D, а иногда оно просто уходит в ступор.

Вобще если учесть, что “пользователь, сука, нервный” то есть вероятность того, пользователь натрахавшись с удобствами (пусть даже если он сам дурак) просто закроет страницу и больше никода не придет посмотреть ваше видео. В принципе можно запретить все эти возможности если это всего несколько роликов и сайт специализируется на чем-то другом, а если это сайт специализирующийся на видео?

3. Удобство для разработчика

После того как я обернул VideoDisplay захотев шоколада, я захотел исправить ситуацию с неточностью у seek’a. Seek живет все в том же VideoPlayer, уже стало немного страшно. Но не теряя оптимизма я ринулся в бой. В VideoDisplay, плеер (VideoPlayer) объявлен как
[code lang=”actionscript”]
mx_internal var videoPlayer:VideoPlayer = null;
[/code]
вроде ниче страшного, дальше у VideoPlayer есть public метод seek – вообще замечательно, т.е. если сделать класс наследник от VideoDisplay и ему всесто VideoPlayer подсунуть наследника от VideoPlayer с оверайднутым seek’oм ситуация будет спасена. Но не тут то было публичный seek у VideoPlayer’а это иллюзия, фактическая перемотка происходит в приватном методе _seek который использует приватные переменные VideoPlayer’а причем одна из перменных является экземпляром класса VideoPlayerNetStream (наследник от NetStream), который объявлен в самом VideoPlayer.as, т.е. видимость этого класса начинается и заканчивается VideoPlayer’ом. Ну и за ними также тянуться все классы из mx.controls.videoclasses.*. Вобщем-то приплыли.

В результате получили чтобы доработать напильничном пару методов нужно копипастить все классы из mx.controls.videoclasses.* в свой пакетик, делать децельный рефакторинг (небольшой минут 15), потом брать свое приложение и менять в нем mx.controls.VideoDisplay на moy.mega.noviy.VideoDisplay и после этого мы готовы переписать требуемые методы.

Скажите не правдали удобно? на онанизм не похоже? Помоемому похоже.

Вобщем так и было вначале сделано, потом полезли всякие неприятности по стабильности плеера, это “приятная” очередь из seek’ов, уходы плеера в астрал если слишком много клацали по клавишам и т.д.

Сначало была мысль вылечить сам VideoPlayer, но посмотрев еще раз код, всего 3к строк (правда включая коментарии) + то что еще он супер универсальный

VideoPlayer is an easy to use wrapper for Video, NetConnection,
NetStream, etc. that makes playing FLV easy. It supports streaming
from Flash Communication Server (FCS) and http download of FLVs.

примая во внимание всего десяток таймеров, чужой полет чужой мысли, и то что конечный VideoDisplay все равно придется дорабатывать кувалдой-молотком-напильником было принято решение положить орган на эту ветку эволюции и начать свою ветку эволюции (или деградации).

Выводы

  • Не все то золото что блястит.
  • VideoDisplay тупиковая ветка развития. UPD: все еще можно исправить? Лучшее решение это ждать что адоб сам исправит ситуацию
  • Вывод VideoDisplay из тупика своими не поддается оценке времени в человекочасах и никому это особо не нужно при таких раскладах UPD: не все потеряно) Достаем бубен из кармана?
  • Возвращаемся к истокам (Video) и пытаемся родить свой работоспособный, пользователеустойчивый(с) аналог VideoDisplay учитывая, что
    • нам не нужно (пока) support streaming
      from Flash Communication Server (FCS)
    • Конструкция должна быть легкая и устойчивая в примении
    • Постаратся использовать чуть меньше таймеров 🙂
    • Нам не нужен хоровод из сиков
    • его внедрение в готовый код должно занять минимум усилий

Текущий результат

Имеем пока кучу потраченого в никуда времени и плеер который работает, если ничего не трогать.

В следующих сериях вы услышите увлекательные рассказы о NetStream и Video.

UPD: Мотыль Нарожняк подсказал новую ветку развития событий и еще раз показал, что не нужно суетится, а нужно изучать доки как можно внимательнее, [тут еще пара отмазок почему это произошло]).

Но всеравно NetStream”y достанется 😉




]]> rss о RIA от 33 Коровы
Забадать RSS!
]]>
~~~~~~