PDA

Просмотр полной версии : Изучаю Red5 с нуля =)


ALiEN_
13.11.2007, 18:55
Часть первая:

Возникла необходимость сделать простенький видеочат, тет-а-тет. Я когда то работал с FCS - ныне FMS, от Адобы поэтому решил что проблем с red5 у меня не возникнет. Ах, как же я ошибался =)

Итак, первое что я узнал, это то, что весь серверный скрипт пишется на Java, т.е. придется изучать новый для меня язык.

Впринципе я рассчитывал что это будет не сложно, т.к. ActionScript и JavaScript, Java - очень похожи...

Итак, первое что я нашел в интернете, это переведнная статья:
"Начало разработки с Red5" (http://yarovoy.com/2007/06/27/getting_started_with_red5_server/)


Следуя инструкциям, я выполнил все шаги по инсталляции эклипса, и самого red5. Единственное что я не сделал сразу, это не качал Flash плагин к эклипсу, т.к. хотелось на скорую руку опробовать сервер в действии написав что нибудь простое во FlashIDE, да и не хотелось разбираться с эклипсом и его плагинами.

Вобщем выполнив все действия по шагам, и переместив собранный пример на сервер, я понял что сервер не видит мою серверную часть программы ни в какую =(

Первая попытка:
NetConnection.Connect.InvalidApp?NetConnection.Connect.Closed

Затем:
NetConnection.Connect.Failed

Очень странно т.к. по идее код простой и все должно работать!

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

Берем пример от oflaDemo, лежащий в папке webapps, и тупо суем в эклипс, эклипс начинает материться что мол нет библиотек - все в красных крестах.

Я сначала выборочно смотрел какие библиотеки необходимы, но т.к. разобраться надо в сжатые сроки, добавляю ВСЕ библиотеки из папки lib в red5. Делается это так же как в предыдущем примере: Project ? Properties. Раздел Java Build Path, вкладка Libraries. Нажимаем Add External JARs и выбираем все библиотеки в директории [red5_HOME]/lib нажимаем OK. Так же добавляем библиотеку red5.jar, лежащую в директории установки red5.

Ура! Теперь эклипс видит библиотеки, а мы видим вместо скомпилированных классов, Application.class - код Applicayion.java. И никаких красных крестов =)

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

Итак, лезем в папку WEB-INF/src org.red5.server.webapp.oflaDemo и сразу делаем копию Application.java ( CopyOfApplication.java ). Это возможно пригодится, если я что-то накосячу своими кривыми руками. Ну что теперь? Попробую добить пример описаный в статье, для этого я копирую весь код из примера в статье, в наш Application.java. Копирую проект на сервер, рестартую сервак, и вуаля, флешка говорит что коннект успешен! ( либо не успешен, в зависимости от того какой параметр мы шлем, true или false ) ДА, это работает! Еще один маленький шаг вперед.

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

Я выдрал кусок кода из копии CopyOfApplication.java подправил Application.java, и теперь он выглядит так:


package org.red5.server.webapp.oflaDemo;

import org.red5.server.adapter.ApplicationAdapter;
import org.red5.server.api.IBandwidthConfigure;
import org.red5.server.api.IConnection;
import org.red5.server.api.IScope;
import org.red5.server.api.stream.IServerStream;
import org.red5.server.api.stream.IStreamCapableConnection;
import org.red5.server.api.stream.support.SimpleConnectionBWConfig;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.red5.server.api.IConnection;
import org.red5.server.adapter.ApplicationAdapter;

public class Application extends ApplicationAdapter
{


private IScope appScope;

private IServerStream serverStream;

/** {@inheritDoc} */
@Override
public boolean appStart ( IScope app )
{
appScope = app;
return true;
}


public boolean appConnect ( IConnection conn , Object[] params )
{

log.info ( "Red5First.appConnect " + conn.getClient ().getId () );

//boolean accept = (Boolean)params[0];


//if ( !accept ) rejectClient( "you passed false..." );


if ( conn instanceof IStreamCapableConnection )
{

IStreamCapableConnection streamConn = ( IStreamCapableConnection ) conn;

SimpleConnectionBWConfig bwConfig = new SimpleConnectionBWConfig ();

bwConfig.getChannelBandwidth () [IBandwidthConfigure.OVERALL_CHANNEL] = 1024 * 1024;

bwConfig.getChannelInitialBurst () [IBandwidthConfigure.OVERALL_CHANNEL] = 128 * 1024;

streamConn.setBandwidthConfigure ( bwConfig );
}

return super.appConnect ( conn, params );

}

private static final Log log = LogFactory.getLog( Application.class );

public void appStop ()
{
log.info ( "Red5First.appStop" );
}



public void appDisconnect ( IConnection conn , Object[] params )
{
log.info ( "Red5First.appDisconnect " + conn.getClient ().getId () );
}

}

Что к чему примерно понятно, поэтому ниже клинтская часть, которая тупо отправляет поток на сервер. Просьба не пинать ногами, это код который написан ан скорую руку, в Flash IDE. =)))

var nc:NetConnection;

var camera:Camera;

var microphone:Microphone;

var stream:NetStream;


function createCamera() {


camera = Camera.getCamera ();

microphone = Microphone.getMicrophone ();


if ( camera != null )
{

var widthCam = 640;

var heightCam = 480;


camera.setMode ( widthCam, heightCam, 30 );

camera.setQuality ( 0, 80 );


widthCam = camera.width;

heightCam = camera.height;


var video = new Video ( widthCam, heightCam );

video.width = 160;

video.height = 120;


video.attachCamera ( camera );

addChild ( video );

}

}

function createStream ():void
{

stream = new NetStream ( nc );

stream.addEventListener ( NetStatusEvent.NET_STATUS, netStatus );

stream.attachCamera ( camera );

stream.attachAudio ( microphone );


stream.publish ( "myId", "live" );

}

function createConnect ()
{

nc = new NetConnection ();

nc.objectEncoding = ObjectEncoding.AMF3;

nc.addEventListener ( NetStatusEvent.NET_STATUS, netStatus );

nc.connect ( "rtmp://localhost/oflaDemo" );

}

function netStatus ( event:NetStatusEvent ):void
{

trace ( event.info.code );

if ( event.info.code == "NetConnection.Connect.Rejected" )
{

// trace reject message

trace ( event.info.application );

}

if ( event.info.code == "NetConnection.Connect.Success" )
{

trace ( event.info.application );

createStream ();

}

}


createCamera ();

createConnect ();



Итак, stream.publish ( "myId", "live" ); - позволяет задать имя потока и тип потока налету ("record", "append", "live"). Наш сервер это хавает, создает в папке streams файл с именем myId.

Все, пол дела сделано, и это оказалось не так уж и сложно =)) Но это я не вникал в java, а просто тупо скопировал пример.

Да, кстати еще такое дело - примеры которые валяются в red5 для клиентской стороны все написаны на АС2.0, и используют кучу библиотек, написанных опять же на 2.0. Я пишу клиентскую часть на АС3, потому что мне так удобнее.

Как же забрать поток?

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


var nc:NetConnection;


function createVideo ()
{


var stream:NetStream = new NetStream ( nc );

stream.addEventListener ( NetStatusEvent.NET_STATUS, netStatus );

//stream.client = new CustomClient();

var video:Video = new Video();

video.attachNetStream ( stream );

stream.play ( "myId", -1 );

addChild ( video );

}

function createConnect ()
{

nc = new NetConnection ();

nc.objectEncoding = ObjectEncoding.AMF3;

nc.addEventListener ( NetStatusEvent.NET_STATUS, netStatus );

nc.connect ( "rtmp://localhost/oflaDemo" );

}

function netStatus ( event:NetStatusEvent ):void
{

trace ( event.info.code );

if ( event.info.code == "NetConnection.Connect.Rejected" )
{

// trace reject message

trace ( event.info.application );

}

if ( event.info.code == "NetConnection.Connect.Success" )
{

trace ( event.info.application );

createVideo ();

}

}


На последок, ссылка на доки по red5 (http://dl.fancycode.com/red5/api/index.html?overview-tree.html)

Ну вот собственно дело сдвинулось с мертвой точки. Я немного разобрался в эклипсе, немного в яве. В следущий раз напишу как я делал соединение сокетами локального сервера проверки id и сервером red5 ( надеюсь это возможно ).

alexcon314
13.11.2007, 21:42
спасибо за пост и тему, ALiEN. тоже интересуюсь red5. слушай, а ты сервак этот на чем поднял? на винде или на линуксе?

ALiEN_
13.11.2007, 21:42
Часть вторая:

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

Для начала я пошел в гугл и просто поискал примеры "java socket пример", и т.д. ковырялся надо сказать долго, потому что все время всплывали ошибки =) в итоге подключив несколько библиотек,

import java.applet.*;
import java.awt.*;
import java.net.*;
import java.io.*;


я написал простую функцию, которая коннектится к серверу, шлет запрос, получает ответ и возвращает нам true или false.


private boolean getSession ( String user_id )
{

try {


String data = "user_id=" + user_id + "\n";


Socket sock = new Socket ();

sock.connect ( new InetSocketAddress ( "devel3.mlan", 11717 ), 500);


PrintWriter out = new PrintWriter(sock.getOutputStream(), true);

out.print(data);

out.flush();


BufferedReader in = new BufferedReader ( new InputStreamReader ( sock.getInputStream () ) );

while (!in.ready () ) {}

String read = in.readLine();


out.close();
in.close();


String falseString = "NOTFOUND";

if ( read.equals (falseString) )
{

return false;

}

else
{

return true;

}



} catch (Exception e) {

return false;

}



}



Хочется сказать несколько слов о яве. По сравнению с синтаксисом ActionScript, Java, ближе к С =)

Например обозначить функцию на яве можно так:

private boolean getSession ( String user_id )

а в АС так:

private function getSession ( String user_id ) : boolean

Так же и имена переменных:

java

String data = "user_id=" + user_id + "\n";

AS

var data:String = "user_id=" + user_id + "\n";


Как оказалось - ничего сложного.



Немного поправил основную функцию, которая теперь принимает параметром id нашей флешки.



public boolean appConnect ( IConnection conn , Object[] params )
{

//log.info ( "Red5First.appConnect " + conn.getClient ().getId () );


if ( getSession ( ( String ) params[0] ) == false )
{

rejectClient( "NOTFOUND" );

return super.appConnect ( conn, params );


}

else
{


if ( conn instanceof IStreamCapableConnection )
{

IStreamCapableConnection streamConn = ( IStreamCapableConnection ) conn;

SimpleConnectionBWConfig bwConfig = new SimpleConnectionBWConfig ();

bwConfig.getChannelBandwidth () [IBandwidthConfigure.OVERALL_CHANNEL] = 1024 * 1024;

bwConfig.getChannelInitialBurst () [IBandwidthConfigure.OVERALL_CHANNEL] = 128 * 1024;

streamConn.setBandwidthConfigure ( bwConfig );
}


return super.appConnect ( conn, params );

}

}




Соответственно и клиентская часть притерпела изменения:


function createConnect ()
{

nc = new NetConnection ();

nc.objectEncoding = ObjectEncoding.AMF3;

nc.addEventListener ( NetStatusEvent.NET_STATUS, netStatus );

nc.connect ( "rtmp://localhost/oflaDemo", "333");

}


Самое интересное, что все это работает! =) а как страшно было начинать!! =)))

ALiEN_
13.11.2007, 21:52
спасибо за пост и тему, ALiEN. тоже интересуюсь red5. слушай, а ты сервак этот на чем поднял? на винде или на линуксе?

Отвечаю, сервак у меня поднят локальный для тестов под MAC OS, и тестовый внешний под SUSE.

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

alexcon314
13.11.2007, 22:21
не всопмню сразу где видел ссылку на док. по ред5. качнул. мож.пригодится кому, решил выложить.

flashphoneteam
14.11.2007, 19:07
Вообще-то в Red5 можно писать webapps на целой куче языков от javascript до jython... Только надо это уметь делать :)

amd333
16.09.2008, 23:24
Вообще-то в Red5 можно писать webapps на целой куче языков от javascript до jython... Только надо это уметь делать :)
а еще там написано что можно в принципе для любого языка интерпритатор написать :), но интерпритатор не есть компилятор...

darksranger
09.10.2008, 18:40
вопросик

а если будет много пользователей, будет ли стабилен red5 ? или лучше брать FMS

AlexCooper
14.11.2008, 16:13
ну почему же у меня постоянно не получаеться((((
Error #2044: Unhandled AsyncErrorEvent:. text=Error #2095: flash.net.NetConnection was unable to invoke callback onBWDone. error=ReferenceError: Error #1069: Property onBWDone not found on flash.net.NetConnection and there is no default value.
at Untitled_fla::MainTimeline/createConnect()
at Untitled_fla::MainTimeline/Untitled_fla::frame1()
NetConnection.Connect.Success
null
NetStream.Publish.Start

я ас3 пишу в Макромедии кс3 профессионал?!

я уже четверо суток юзаю различное ПО, готовые исходки, гугл и всё напрасно. просто ппц, что я насколько слаб((

Подскажите подалуйста, я просто сойду с ума...

И какое ПО нужно для разработки?
У меня стоит:
Red5 v2.1
Adobe Flash CS3 Proffesional edition
Adobe Flex Builder 3
Eclipse Platform v3.4.1 Build id: M20080911-1700
NetBeans IDE 5.5 Build 200612070100

lumumba
24.11.2008, 14:27
а если будет много пользователей, будет ли стабилен red5 ? или лучше брать FMS
со стабильностью есть проблемы
версия 0.63 тянет более менее 200 юзеров
а вот 0.7 частенько просто выпинывает клиентов

terbooter
24.11.2008, 15:02
со стабильностью есть проблемы
версия 0.63 тянет более менее 200 юзеров
а вот 0.7 частенько просто выпинывает клиентов
У нас нет проблем. Никого не выпинывает

Yark
26.11.2008, 13:21
Тоже пришлось взяться за изучение RED5 и сразу вылезла масса проблем.
Пока я пробовал менять код приложения oflaDemo ещё как-то дело двигалось, но пришло время дать приложению своё имя. И вот на этом всё остановилось.

Что я сделал: взял чистые сорцы от oflaDemo и в файлах
red5-web.properties
red5-web.xml
web.xml

изменил везде имя oflaDemo на своё (скажем, myFirst)

удалил все *.class

в сорцах .java изменил везде oflaDemo на то же имя. Во всех .java файлах изменил
package org.red5.server.webapp.oflaDemo;
на
package org.red5.server.webapp.myFirst;

и скомпилировал.

появилась папка

webapps\myFirst\bin\org\red5\server\webapp\myFirst\

и в ней классы, которые ранее были

webapps\oflaDemo\bin\org\red5\server\webapp\oflaDemo\

ошибок не выявлено (точнее они были, но после подключения к проекту red5.jar commons-logging-1.1.jar и spring-core.2.0.6.jar всё прошло).

при попытке подключения стандартной флешкой к rtmp://localhost/myFirst

получаю ошибку


description = No scope "myFirst" on this server.
code = NetConnection.Connect.InvalidApp

Подскажите, что это и почему?
Использую red5 версии 0.6 под Windows, тот, который инсталлер в комплекте с jetty.
Ставил "на посмотреть" 0.8 версию. Там появился какой-то installer приложений и до инсталляции они не работали, может тут тоже какая-то нужна инсталляция?

PS после перекомпиляции приложения приходится перезапускать сервис red5 это так у всех? Может есть какой-то другой способ?

terbooter
28.11.2008, 08:38
У нас нет проблем. Никого не выпинывает
Накаркал, блин.
На одном из сайтов (red5 0.7) стала проявляться вот эта бага
http://jira.red5.org/browse/APPSERVER-168

neven
13.12.2008, 01:37
это что - меня седня начальство озадачило - мне надо пустить мультикаст поток с dvb карточки на окошко на сайте - типа онлайн телевидиние организовать.
я конечно упал на мороз, сказав что ничего не обещаю, но сам заинтересовался - можно ли использовать FMS или red5 для видеозахвата с устройства и мультикаст трансляции во флешки?
P.S. я вообще не сталкивался ниразу с разработкой связаной с видео во флеш и этими серверами, но у меня еще задача видеочат наваять скоро объявится, так что полюбому прийдется, спасибо за грамотные мануалы :)

SiTh
21.12.2008, 17:14
По поводу реализации на Red5 - рекомендую почитать тему (http://mediaservers.ru/index.php?showtopic=17).
Если тебя это не остановит, вот (http://jira.red5.org/confluence/display/docs/Users+Reference+Manual) мануал неплохой.

Girevik
30.01.2009, 16:10
У меня такой вопрос по Red5 - нужно сделать клиентскую часть на Java - есть ли какие-то примеры этого?? хотелось бы полностью файлик класса или что-то подобное..

Добавлено через 10 минут
и еще вопрос по серверу Red5 - он может работать с потоковым видео/аудио??

imdogma
27.11.2009, 17:50
Подскажите, умеет ли ред5 ловить события на стороне сервера ? Тоесть в момент окончания одного ролика он допустим вызывает некую клиентскую функцию (например, чтобы дать понять плееру, что на сервере сменился ролик)? В фмс делалось это довольно легко, но не по карману мне он :(

Eolin
09.01.2010, 19:30
Может Red5 помочь мне в создании радио? Радио должно работать с Shoutcast потоком.. Очень нужна помощь :)

maxlapshin
10.01.2010, 18:27
это что - меня седня начальство озадачило - мне надо пустить мультикаст поток с dvb карточки на окошко на сайте - типа онлайн телевидиние организовать.
я конечно упал на мороз, сказав что ничего не обещаю, но сам заинтересовался - можно ли использовать FMS или red5 для видеозахвата с устройства и мультикаст трансляции во флешки?
P.S. я вообще не сталкивался ниразу с разработкой связаной с видео во флеш и этими серверами, но у меня еще задача видеочат наваять скоро объявится, так что полюбому прийдется, спасибо за грамотные мануалы :)

Технически в вовзе есть механизмы для решения этой задачи, но деталей не знаю. С помощью http://erlyvideo.org/ эта задача решается уже сейчас в продакшне: http://relabs.ru/archives/388

Добавлено через 1 минуту
Подскажите, умеет ли ред5 ловить события на стороне сервера ? Тоесть в момент окончания одного ролика он допустим вызывает некую клиентскую функцию (например, чтобы дать понять плееру, что на сервере сменился ролик)? В фмс делалось это довольно легко, но не по карману мне он :(

А расскажите, как это делается в fms. Дело в том, что я сейчас разрабатываю альтернативный сервер: erlyvideo, мне интересно было бы как задизайнить клиентское API так, что бы подобные вещи были удобными программистам.

JesterAntik
29.09.2010, 15:35
Пытаюсь запустить Red5. Если в корне имеется red5.jar(после компиляции), то сервер ругается, что дублируются какие-то классы.
Если удаляю jar, то выдает эксепшн
Exception in thread "main" java.lang.ClassNotFoundException: org.red5.server.Launcher
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:334)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at org.red5.server.Bootstrap.bootStrap(Bootstrap.java:132)
at org.red5.server.Bootstrap.main(Bootstrap.java:50)

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