Хоть так:
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 выдает совсем другой результат — слышишь ровно то, что записывал. Никакой тишины, никакой потери данных. Только звук корявый, глухой, с шумами. Но это уже вопрос к кодеку и к микрофону.
Имеем такой баг:
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 :)
Есть три варианта выхода:
— баг репорт авторам и ждать
— пофиксить самим и распространять свою сборку red5
— отказаться от использования red5
мы выбираем 3й вариант )
Одно и то же red5 приложение на нескольких разных хостах. И везде — разные баги. На каждом хосте свои уникальные проблемы, которых нет на других хостах.
Надо ли говорить, что ничего не удается повторить локально (
_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 нет :(
Теперь нужно сидеть и напряженно медитировать, пока не придет догадка, что с этим делать :)
Red5 загружает все эти приложения на старте, и если одно не запустилось, то все не запустятся. FMS и Wowza загружают приложения по требованию (при коннекте первого клиента). Ошибка в одном приложении никак не влияет на работу других.
Однако оный RTMPClient не стабильный, переодически не коннектится, а когда коннектится, не всегда нормально общается с сервером. То чего-то не пришлет, то чего-то не примет. Отладка легче не стало.
А жаль, ибо тут можно было бы мощные интеграционные тесты замутить.
Либо залезть в сорцы, разобраться и пофиксить. Либо сделать бот-клиента на флэше для тех же целей. Либо забить на все это и отлаживать многими кликами. Думаю.
red5: 518 классов, 86596 строк кода
erlyvideo: 199 файлов (erl и hrl), 40393 строк кода.
Они, конечно, не идентичны по возможностям. У erlyvideo возможности больше ) Но можно утверждать, что для реализации одинакового функционала на Erlang нужно в 2 раза меньше кода, чем на Java.
Однако уже 2 часа ночи. Пора спать. Завтра пошлю )
BeanMap beanMap = new BeanMap(object);
Мысль о том, что amf сериализация будет привязана к java bean меня удручает. Нафига лишние зависимости?
К тому же у меня нифига не получается, вылезает java.lang.NoClassDefFoundError :)
Что ж, придется копаться в spicefactory, там это дело как-то похитрее сделано.
Но вот теперь заморочка с Wowza. Вы уже догадались, что там тоже свой кастомный логгинг :) WMSLoggerFactory и WMSLogger :) И оный логгер является наследником org.apache.log4j.Logger.
И вот теперь мне надо думать, как бы свести к общему типу эти фабрики и логгеры, чтобы и из Red5 модуля и из Wowza модуля передать в red-wowza-независимый модуль какую-нибудь такую фабрику, что б там работала :)
Пока пытаюсь запустить в Wowza модуле org.slf4j.LoggerFactory и org.slf4j.Logger. Они вроде бы и работают, но в консоль выводят что-то загадочное и непонятное. Это потому, что у вовзы есть свой log4j.properties, весьма навороченый. И мне сейчас надо разобраться, как бы переопределить эти настройки в своем приложении.
Это только начало, ибо получилось через Red5LoggerFactory, а надо чтобы получилось без зависимостей от red5, ибо нужно чтобы оно и под wowza работало. (log4j не удалось заставить работать)
Вот не понимаю этого дикого энтузиазма с создании каких-то жутко проект-специфичных логингов. Ну чего б не использовать log4j ?
red5.org перечитал уже, наверное, раз 20. Вроде все так и сделал, но нет ни вывода в консоль, ни лог файл не появляется :(
Осталась одна надежда на examples, там в одном приложении логгинг есть и вроде даже работает.
Я, наверное, идиот, но никак не могу заставить работать логгинг. Эту хрень Осталась одна надежда на examples, там в одном приложении логгинг есть и вроде даже работает.
С сериализацией объектов нифига не разобрался. По исходникам то же вроде бы не Rocket Science, но hex-редактор показывает кое-где какие-то непонятные байты, которые я не могу интерпретировать, ни по спеке, ни по исходникам.
К тому же типизированый объект почему-то записался как name1:name2:value1:value2, а не типизированый записался нормально name1:value1:name2:value2
Поищу еще какую-нибудь открытую реализацию. BlazeDS, хотя бы. Может там понятнее будет :)
— запуск сервера самый быстрый у wowza, медленне у red5, самый медленный у fms (правда это включая запуск админ-сервера)
— коннект приложения к wowza и red5 примерно одинаково быстрый, к fms чутка медленне, заметно на глаз
Red5 неправ, так не хорошо.
rtmp://domain/app/room1/room2/room3/ тоже не будет работать на fms.
nc.call("HandlerClass.methodName", responder, param1, param2);
Все бы ничего, так даже и лучше. Но этот способ несовместим с FMS. Оные методы можно реализовать на red5 иначе, чтобы они вызывались с клиента обычным способом:
nc.call("methodName", responder, param1, param2);
Для этого их нужно всего лишь определить в главном классе, который ApplicationAdapter. Но вот это в документации не описано. Догадайся сам.
То ли тут есть злой умысел, дескать, специально заставим вас написать клиента так, чтобы он не работал с FMS. То ли оно случайно так получилось. Но получилось нехорошо.
Команда Red5 в этом отношении не исключение.
private static Logger log = Red5LoggerFactory.getLogger(MyClassName.class);
Ну конечно, ясен перец, без Red5LoggerFactory никак не обойтись! А то, что у меня большая часть кода приложения общая и для Red5 и для Wowza, и не должна быть абстрагирована от них обоих, это фигня, это мои личные проблемы.
В итоге предыдущий разработчик смело пихал там везде System.out.println. И я его понимаю. И, похоже, оно так и останется. Если я в разумное время не разберусь, как заставить Red5 работать с slf4j
<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 сконфигурирован в режиме, удобном для разработки, а не для продакшн. Но что-то я не припомню, чтобы об этом было написано где-нибудь в документации. И чтобы где-то в документации было написано, как его лучше сконфигурировать для продакшн. Может, плохо смотрел.
И у него внутрях есть такая штука:
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 ничего нет. Хотя особо внимательные могут дописать соотвествующие параметры.
Если бы Red5 не был таким хилым, я бы с удовольствием под него писал.
Wowza требует рута при установке, ставиться в жестко заданый каталог, который нельзя поменять, требует рута при запуске.
Вывод: вавзу делали виндузятники в своем типичном виндузятском стиле.
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 функции, с помощью которых я сам должен вынять из пришедших данных то, что мне надо. Наверное это дает лучшую производительность. Но вот восторга у меня не вызывает.
Остается одна польза — исходники. Можно лазить в них с целью удовлетворения любопытства.
В общем, FAIL.
Делаем свой велосипед дальше.
Вопрос только, потянет ли он по производительности. Так что нужно сделать толковые стресс-тесты и поглядеть. А для стресс-тестов можно делать ботов-клиентов на базе класса RTMPClient, который есть в составе Red5.
Да, стриминг видео он тянет хуже. Но мы его освободим от этой заботы :)
svn checkout red5.googlecode.com
без проблем добавил серверную часть на red5 к этой своей штуке:
code.google.com
1. Ctrl+Shift+F9, чтобы скомпилировать модуль
2. Ant-скрипт, чтобы запаковать jar и закинуть его в webapps
3. Из консоли запустить Red5
4. Запустить swf-клиент
5. Втыкать в логи в консоли
6. Из консоли остановить Red5
Это п..ц, и не могу придумать ничего лучше :(
Run Configuration для этого модуля IDEA не создает (вероятно потому, что в классе нет точки входа — функции main)
Вероятно имеет смысл запихать компиляцию в ant, чтобы хотя бы первые два пункта выполнялись в одно действие.
Возвращаясь к документации red5. Она немного помогает, да. Но совсем немного. Раздел Installation просто отсуствует, а есть раздел build red5. Но ведь надо еще догадаться, что его обязательно нужно билдить.
В общем, без подсказок товарищей, уже прошедших через это, я бы сам не справился :(
Логика такого подхода к демкам меня ускользает. Подозреваю, тут и не было никакой логики, а было просто случайное стечение обстоятельств. В общем, из коробки они не работают. Плясать с бубном нет особого желания, поздно уже.
Завтра буду общаться с нашим Red5-гуру на предмет ликбеза в этой теме :)