Чтобы добавлять сообщения и комментарии, .

@yzh44yzh:
yzh44yzh

Уверенный лидер по числу багопроблем. Большинство тасков по суппорту текущей версии flashcoms связаны с Red5. То там чего-то не работает, то чего-то не сохраняется, то чего-то не удаляется.

@yzh44yzh:
yzh44yzh

насчет Red5 я бы не совсем прав. Это версия 0.9 пишет говно, а 1.0 вполне неплохо записывает

@yzh44yzh:
yzh44yzh

Немного повозился с записью аудиоподкастов. Ну качество получается не ахти, оба доступных кодека при максимальных настройках rate/bandwidth выдают говнецо.

Хоть так:
mic.codec = SoundCodec.NELLYMOSER;
mic.rate = 44;

хоть эдак:
mic.codec = SoundCodec.SPEEX;
mic.setSilenceLevel(0);
mic.encodeQuality = 10;

Но если на erlyvideo получается просто говнецо, то на Red5 получается говно полное и неюзабельное. Например, запускаешь запись, считаешь от одного до десяти, останавливаешь, воспроизводишь, и в случае с Red5 получаешь:
несколько секунд тишины (NetStream.seek выдает 0), один-два-три-четыре-семь-восемь, стоп.
"пять-шесть" теряется, "девять-десять" теряется. В 10 случаях из 10 стабильный результат — тишина в начале, и выпадение данных в середине и в конце.

Тот же самый клиентский код с erlyvideo выдает совсем другой результат — слышишь ровно то, что записывал. Никакой тишины, никакой потери данных. Только звук корявый, глухой, с шумами. Но это уже вопрос к кодеку и к микрофону.

@yzh44yzh:
yzh44yzh

В 1.0 RC1 нижеописанного бага нет, был в ветке 0.9

@yzh44yzh:
yzh44yzh

Это, не побоюсь этого слова, пиздец.

Имеем такой баг:
1) коннектся клиент A
2) коннектится клиент B
3) клиент B публикует видео, клиент A подписывается
4) клиент B закрывает браузер

на Red5 срабатывает
public void appDisconnect(IConnection conn)
, как и надо, но внезапно
String clientID = conn.getClient().getId();
возвращает клиента A

то бишь, Red5 даже не может разобраться, какой именно из двух юзеров дисконнектится. Ну жесть.

Ладно, попробуем обновить версию Red5, можно пофикшено. Обновляет сорцы, make, и оно не билдится ) Поправил код, сбилдилось, и не запускается )

ну полезу искать бинарный релиз, может он будет работать.

Чуваки НИКОГДА НЕ ЮЗАЙТЕ Red5 :)

@yzh44yzh:
yzh44yzh

AMF сериализация на Red5 глючная, иногда теряет значения в полях объектов и пишет туда null

Есть три варианта выхода:
— баг репорт авторам и ждать
— пофиксить самим и распространять свою сборку red5
— отказаться от использования red5

мы выбираем 3й вариант )

@yzh44yzh:
yzh44yzh

большая ошибка. Никогда его не юзайте.

Одно и то же red5 приложение на нескольких разных хостах. И везде — разные баги. На каждом хосте свои уникальные проблемы, которых нет на других хостах.

Надо ли говорить, что ничего не удается повторить локально (

@yzh44yzh:
yzh44yzh

Вообще это хорошо, что есть Red5. Он выпрямляет кривые руки разработчикам, заставляет быть все время начеку, оптимизировать производительность и т.д. В итоге код получается лучше, и потом хорошо работает под Wowza :)

@yzh44yzh:
yzh44yzh

есть, допустим _items типа ConcurrentHashMap
_items.remove(id);
log.info("after removing item {} contains: {}", id, _items.contains(id));

на Red5
after removing item 1 contains: true
на Wowza
after removing item 1 contains: false

то бишь, на Red5 почему-то элемент не хочет удаляться из ConcurrentHashMap

Ну да, я, конечно, криворукий. Но wowza мне это прощает, а red5 нет :(
Теперь нужно сидеть и напряженно медитировать, пока не придет догадка, что с этим делать :)

@yzh44yzh:
yzh44yzh

Допустим у вас на медиа-сервере лежит несколько разных приложений, не имеющих отношения друг к другу. Допустим в одном из них ошибка, и оно не запускается.

Red5 загружает все эти приложения на старте, и если одно не запустилось, то все не запустятся. FMS и Wowza загружают приложения по требованию (при коннекте первого клиента). Ошибка в одном приложении никак не влияет на работу других.

@yzh44yzh:
yzh44yzh

итоги возни с RTMPClient в виде статьи в блоге yzh44yzh.com

кажись, последняя статья в этом году )

@yzh44yzh:
yzh44yzh

Эх, хотело было мощно заюзать org.red5.server.net.rtmp.RTMPClient чтобы сделать бот-клиента, и с его помощью можно отлаживать функционал на сервере, дабы избежать для оной отладки запука 2-3 флэш клиентов и долгих кликаний по кнопкам в них в каждой фазе отладки.

Однако оный RTMPClient не стабильный, переодически не коннектится, а когда коннектится, не всегда нормально общается с сервером. То чего-то не пришлет, то чего-то не примет. Отладка легче не стало.

А жаль, ибо тут можно было бы мощные интеграционные тесты замутить.

Либо залезть в сорцы, разобраться и пофиксить. Либо сделать бот-клиента на флэше для тех же целей. Либо забить на все это и отлаживать многими кликами. Думаю.

@yzh44yzh:
yzh44yzh

Немного статистики по объему кода:

red5: 518 классов, 86596 строк кода
erlyvideo: 199 файлов (erl и hrl), 40393 строк кода.

Они, конечно, не идентичны по возможностям. У erlyvideo возможности больше ) Но можно утверждать, что для реализации одинакового функционала на Erlang нужно в 2 раза меньше кода, чем на Java.

@yzh44yzh:
yzh44yzh

Юнит-тесты выявили баг в работе с reference tables для строк. У себя пофиксил. Послать им баг-репорт, что ли? С патчем.

Однако уже 2 часа ночи. Пора спать. Завтра пошлю )

@yzh44yzh:
yzh44yzh

Red5 умеет сериализовать только java bean классы :(
BeanMap beanMap = new BeanMap(object);

Мысль о том, что amf сериализация будет привязана к java bean меня удручает. Нафига лишние зависимости?
К тому же у меня нифига не получается, вылезает java.lang.NoClassDefFoundError :)

Что ж, придется копаться в spicefactory, там это дело как-то похитрее сделано.

@yzh44yzh:
yzh44yzh

С логгингом на red5 разобрался. И разобрался, как его абстрагировать. Пришлось обернуть Red5LoggerFactory в еще один класс, и уже его передавать в red5-независимый модуль. Поскольку фабрика выдает логгеров типа org.slf4j.Logger, то оный модуль теперь может спокойно создавать себе логгеров.

Но вот теперь заморочка с Wowza. Вы уже догадались, что там тоже свой кастомный логгинг :) WMSLoggerFactory и WMSLogger :) И оный логгер является наследником org.apache.log4j.Logger.

И вот теперь мне надо думать, как бы свести к общему типу эти фабрики и логгеры, чтобы и из Red5 модуля и из Wowza модуля передать в red-wowza-независимый модуль какую-нибудь такую фабрику, что б там работала :)

Пока пытаюсь запустить в Wowza модуле org.slf4j.LoggerFactory и org.slf4j.Logger. Они вроде бы и работают, но в консоль выводят что-то загадочное и непонятное. Это потому, что у вовзы есть свой log4j.properties, весьма навороченый. И мне сейчас надо разобраться, как бы переопределить эти настройки в своем приложении.

@yzh44yzh:
yzh44yzh

Дома на пустом проекте с логином получилось, хоть и не сразу. На работе никак не получалось, хотя вроде бы делал все тоже самое. Ну завтра продолжу.

Это только начало, ибо получилось через Red5LoggerFactory, а надо чтобы получилось без зависимостей от red5, ибо нужно чтобы оно и под wowza работало. (log4j не удалось заставить работать)

Вот не понимаю этого дикого энтузиазма с создании каких-то жутко проект-специфичных логингов. Ну чего б не использовать log4j ?

@yzh44yzh:
yzh44yzh

Я, наверное, идиот, но никак не могу заставить работать логгинг. Эту хрень red5.org перечитал уже, наверное, раз 20. Вроде все так и сделал, но нет ни вывода в консоль, ни лог файл не появляется :(

Осталась одна надежда на examples, там в одном приложении логгинг есть и вроде даже работает.

@yzh44yzh:
yzh44yzh

С сериализацией простых типов разобрался, тут исходники более-менее понятны моему скудному уму. Правда все размазано по нескольким классам и пакетам, но отследить можно.

С сериализацией объектов нифига не разобрался. По исходникам то же вроде бы не Rocket Science, но hex-редактор показывает кое-где какие-то непонятные байты, которые я не могу интерпретировать, ни по спеке, ни по исходникам.

К тому же типизированый объект почему-то записался как name1:name2:value1:value2, а не типизированый записался нормально name1:value1:name2:value2

Поищу еще какую-нибудь открытую реализацию. BlazeDS, хотя бы. Может там понятнее будет :)

@yzh44yzh:
yzh44yzh

по мере тестирования одного и того же приложения на трех медиасерверах заметил:
— запуск сервера самый быстрый у wowza, медленне у red5, самый медленный у fms (правда это включая запуск админ-сервера)
— коннект приложения к wowza и red5 примерно одинаково быстрый, к fms чутка медленне, заметно на глаз

@yzh44yzh:
yzh44yzh

Red5 на старте загружает и запускает все приложения, что у него есть. Wowza запускает приложение, только когда к нему коннектится клиент (как и FMS).

Red5 неправ, так не хорошо.

@yzh44yzh:
yzh44yzh

и если уж речь зашла о несовместимостях, которые добавляет red5, то вот это:
rtmp://domain/app/room1/room2/room3/ тоже не будет работать на fms.

@yzh44yzh:
yzh44yzh

Документация описывает, как задавать методы, вызываемые с клиента. Методы эти предлагается запихивать в отдельные классы (хендлеры) и с клиента вызывать их так:
nc.call("HandlerClass.methodName", responder, param1, param2);

Все бы ничего, так даже и лучше. Но этот способ несовместим с FMS. Оные методы можно реализовать на red5 иначе, чтобы они вызывались с клиента обычным способом:
nc.call("methodName", responder, param1, param2);
Для этого их нужно всего лишь определить в главном классе, который ApplicationAdapter. Но вот это в документации не описано. Догадайся сам.

То ли тут есть злой умысел, дескать, специально заставим вас написать клиента так, чтобы он не работал с FMS. То ли оно случайно так получилось. Но получилось нехорошо.

@yzh44yzh:
yzh44yzh

Одна из прелестей джава мира это то, что существует 100500 способов организовать логинг, и каждый уважающий себя прогер считает своей обязанностью добавить свой собственный, самый лучший и самый гибкий.

Команда Red5 в этом отношении не исключение.
private static Logger log = Red5LoggerFactory.getLogger(MyClassName.class);

Ну конечно, ясен перец, без Red5LoggerFactory никак не обойтись! А то, что у меня большая часть кода приложения общая и для Red5 и для Wowza, и не должна быть абстрагирована от них обоих, это фигня, это мои личные проблемы.

В итоге предыдущий разработчик смело пихал там везде System.out.println. И я его понимаю. И, похоже, оно так и останется. Если я в разумное время не разберусь, как заставить Red5 работать с slf4j

@yzh44yzh:
yzh44yzh

еще любопытная вещь:
<bean class="org.apache.catalina.connector.Connector">
<!-- Blocking I/O -->
<constructor-arg type="java.lang.String" value="org.apache.coyote.http11.Http11Protocol" />
<!-- Non-blocking I/O -->
<!--
<constructor-arg type="java.lang.String" value="org.apache.coyote.http11.Http11NioProtocol" />
-->
Я, конечно, в спрингах не силен, про всякие IO да NIO слыхал только краем уха, но сдается мне, по дефолту в red5 все настроено так, чтобы было хуже. А для умных оставлена возможность сделать так, чтобы было лучше.

Это такой заговор, что ли?

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

@yzh44yzh:
yzh44yzh

внезапно обратил внимание, что для запуска сервера помимо red5.sh еще имеется red5-highperf.sh
И у него внутрях есть такая штука:
export JAVA_OPTS="-Xrs -Xms512M -Xmx1024M -Xss128K -XX:NewSize=256m -XX:SurvivorRatio=16 -XX:MinHeapFreeRatio=20 -XX:+AggressiveHeap -XX:+ExplicitGCInvokesConcurrent -XX:+UseConcMarkSweepGC -Dsun.rmi.dgc.client.gcInterval=990000 -Dsun.rmi.dgc.server.gcInterval=990000 -Djava.net.preferIPv4Stack=true -Xverify:none"

Любопытно-любопытно. Стало быть, по дефолту Red5 запускается в режиме low perfomance, а особо внимательные могут запустить high perfomance :) Интересный подход. Что ж, нагрузочные тесты у меня еще остались, надо будет поглядеть, как они сработают с high perfomance настройками :)

Для виндузятников, увы, есть только red5.bat, и там для high perfomance ничего нет. Хотя особо внимательные могут дописать соотвествующие параметры.

@yzh44yzh:
yzh44yzh

По уровню и удобству API Red5 идет заметно впереди. Wowza, видимо, отказалась от удобства в угоду производительности. Или Wowza вообще не старались развивать API для серверной логики, ибо посчитали возможность создания кастомной бизнес логики вторичной, а главное — это видеостриминг.

Если бы Red5 не был таким хилым, я бы с удовольствием под него писал.

@yzh44yzh:
yzh44yzh

Red5 не требует рута при установке, ставится в любое место (если это можно назвать установкой), не требует рута при запуске.
Wowza требует рута при установке, ставиться в жестко заданый каталог, который нельзя поменять, требует рута при запуске.
Вывод: вавзу делали виндузятники в своем типичном виндузятском стиле.

@yzh44yzh:
yzh44yzh

AMF сериализация на вовзе довольно странная. На Red5 я просто пишу метод, который буду вызывать с клиента, и просто указываю в нем типы параметров, какие захочу

void methodToCallFromClient(String param1, MyCustomClass param2)

десериализация проходит где-то внурях, а в мой метод сразу приходят готовые объекты нужного мне типа.

На вовзе это как-то не так.
// receiving an object from the client
public void c2sParamsObject(IClient client, RequestFunction function, AMFDataList params)
{
AMFDataObj param1 = (AMFDataObj)getParam(params, PARAM1);

// direct method for getting object properties
String val1 = param1.getString("val1");
int val2 = param1.getInt("val2");
boolean val3 = param1.getBoolean("val3");
Date val4 = param1.getDate("val4");
}
то бишь, мне даются некие API функции, с помощью которых я сам должен вынять из пришедших данных то, что мне надо. Наверное это дает лучшую производительность. Но вот восторга у меня не вызывает.

@yzh44yzh:
yzh44yzh

Стало быть, как стриминг сервер он не годится, как аппликэйшн сервер тоже не годится. Разве что изначально планируете, что у вас не будет больше 50 одновременных соединений.

Остается одна польза — исходники. Можно лазить в них с целью удовлетворения любопытства.

@yzh44yzh:
yzh44yzh

Конечно, может у меня просто кривые руки, и я плохо реализовал логику (хотя сколько там той логики). С другой стороны, велосипед я делал теми же кривыми руками, а он нормально работает.

@yzh44yzh:
yzh44yzh

Ну вот, есть результаты стресс теста. На 50 клиентах red5 и мой велосипед показывают примерно равную нагрузку, но не все сообщения доходят до клиентов, часть теряется. 100 клиентов red5 просто не держит — сыплются в лог исключения, часть клиентов тупо не коннектится, часть коннектится, но не получает сообщений.

В общем, FAIL.

Делаем свой велосипед дальше.

@yzh44yzh:
yzh44yzh

Чем больше в нем копаюсь, тем больше вижу, что он вполне подходит на роль сервера приложений. Вот и вход по http он поддерживает, можно делать ajax клиентов.

Вопрос только, потянет ли он по производительности. Так что нужно сделать толковые стресс-тесты и поглядеть. А для стресс-тестов можно делать ботов-клиентов на базе класса RTMPClient, который есть в составе Red5.

Да, стриминг видео он тянет хуже. Но мы его освободим от этой заботы :)

@yzh44yzh:
yzh44yzh

оказывается довольно прост, если начинать не с документации, а с примеров, кои берутся здесь:
svn checkout red5.googlecode.com
без проблем добавил серверную часть на red5 к этой своей штуке:
code.google.com

@yzh44yzh:
yzh44yzh

Я знаю, почему у red5 нет нормальной документации для пользователей. Она ему не нужна. У него есть e xample apps, это лучше, чем документация :)

@yzh44yzh:
yzh44yzh

Вроде как код пишется, но цикл отладки слишком длинный.
1. Ctrl+Shift+F9, чтобы скомпилировать модуль
2. Ant-скрипт, чтобы запаковать jar и закинуть его в webapps
3. Из консоли запустить Red5
4. Запустить swf-клиент
5. Втыкать в логи в консоли
6. Из консоли остановить Red5
Это п..ц, и не могу придумать ничего лучше :(

Run Configuration для этого модуля IDEA не создает (вероятно потому, что в классе нет точки входа — функции main)
Вероятно имеет смысл запихать компиляцию в ant, чтобы хотя бы первые два пункта выполнялись в одно действие.

@yzh44yzh:
yzh44yzh

не подхватывает новые апп на лету, нужен рестарт. Это совсем не тру.

@yzh44yzh:
yzh44yzh

Ну вот, запустил таки. Небольшой подлянкой оказалось то, что $RED5_HOME должен быть /opt/red5/dist, а не /opt/red5, как я сделал сразу. Ну и запускается он из /opt/red5/dist/red5.sh Без всяких томкатов.

Возвращаясь к документации red5. Она немного помогает, да. Но совсем немного. Раздел Installation просто отсуствует, а есть раздел build red5. Но ведь надо еще догадаться, что его обязательно нужно билдить.

В общем, без подсказок товарищей, уже прошедших через это, я бы сам не справился :(

@yzh44yzh:
yzh44yzh

Вот вы думаете, как он устанавливается? Скачал, распаковал, посмотрел доки, запустил? Нифига, не так.
svn checkout red5.googlecode.com
make
Поди догадайся :)

@yzh44yzh:
yzh44yzh

Ну что ж, Red5 вроде бы как работает. Правда егойные демки запустить чего-то не удалось. Клиентская часть этих демок зачем-то лежит в red5/webapps/root. Нафиг они там нужны? Ну скопировал их на веб сервер. А вот серверной части нет :) Есть серверная часть только для одной демки, лежить в red5/doc/exemples (что вполне естественно). Но она не работает, бросает в консоль исключения.

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

Завтра буду общаться с нашим Red5-гуру на предмет ликбеза в этой теме :)