Archive

Archive for the ‘Red5’ Category

Co nowego w Red5 0.9?

June 16th, 2009 2 comments

Kilka dni temu świat ujrzał Red5 w wersji 0.8. W zasadzie Red5 0.8 nie wnosi nic nowego – uporządkowano jednak kod i dodano instalator aplikacji. Red5 0.8 to były ważne zmiany dla programistów a nie dla użytkowników.

Dopiero Red5 0.9 to będzie coś!!! Popatrzyłem na komentarz programistów w systemie kontroli wersji i znalazłem tam:

Jak widać programiści Red5 pracują pełną parą. Zachęciło mnie to do zaktualizowania projekt jakubiak-red5 – budowanie Red5 z maven2. Utworzyłem gałąź 0.8.0. Utworzyłem repozytorium maven. Posprzątałem trochę kod.

Uważam, że wersja 0.9 Red5 będzie przełomowa. Dotychczas Red5 zostawał w tyle za Wowza i FMS. Nowa wersja i potęga Xuggle wypchną ten serwer daleko przed konkurencje – przynajmniej w dziedzinie przetwarzania strumieni wideo.

Categories: Red5 Tags:

Red5 + JPA + Maven2

May 13th, 2009 6 comments

Zapraszam do artykułu w którym opisze jak przy pomocy Maven2 zbudować aplikację dla serwera Red5 korzystającą z technologii Spring, JPA, Hibernate oraz bazy PostgreSQL. Nie będę posługiwał się żadnym IDE, użyje tylko edytora tekstu VIM oraz poleceń powłoki Bash. Całość uruchomię na wirtualnym komputerze z FreeBSD.

Zadanie aplikacji, korzystającej z tych wszystkich technologii będzie bardzo proste. Będzie to program klasy “Hello World”. Aplikacja będzie sprawdzać, czy Internauta ma uprawnienia do publikowania materiałów wideo na serwerze Red5. Sprawdzanie będzie odbywać się na postawie adresu IP nadawcy. Dozwolone adresy IP będą zapisane w bazie danych PostgreSQL. A najfajniejsze jest to, że już tą aplikację napisałem, opublikowałem i opiszę gotowca.

Na serwerze mam już zainstalowane:

  • Java 1.6 (Diablo JDK)
  • Maven 2.0.9
  • PostgreSQL 8.3

Aby rozpocząć, pobieramy aplikację korzystając z SVN:

svn checkout http://jakubiak-red5.googlecode.com/svn/trunk/ jakubiak-red5-read-only

 

W ten sposób ściągamy źródła projektu jakubiak-red5 wraz z przykładową aplikacją. Projekt jakubiak-red5 jest dowiązany do źródeł projektu Red5 przy pomocy svn:externals. Tak więc, pobierając mój projekt, zostaną pobrane kody źródłowe serwera Red5. Nastał czas na pierwszą kompilację. Dzięki pracy włoskiego programisty Marcello Teodorii aplikacja powinna zbudować się bez przeszkód.

cd jakubiak-red5-read-only/jakubiak-red5-pom/
mvn clean install

 

W tym momencie maven zacznie pobierać z Internetu biblioteki konieczne do zbudowania aplikacji. Może to chwile potrwać. Kolejną chwilę będziemy musieli poczekać na kompilacje 700 klasy Javy. Na koniec, ucieszymy się sukcesem. (Jak widać, ja byłem cierpliwy bo czekałem 16 minut, jednak gdy zależności są już pobrane z Internetu to aplikacja buduje się szybko.)

Następnie zakładamy bazę danych PostgreSQL i użytkownika dla niej. Jako hasło podajemy “demojpa”.

createuser -h localhost -U pgsql -S -D -R -P demojpa
createdb -h localhost -U pgsql -O demojpa demojpa

 

Założenie bazy danych na tym etapie jest wymagane, gdyż właśnie ta baza będzie użyta do testowania aplikacji. Aplikacja będzie się testować podczas kompilacji. Więc kompilujemy:

cd ../jakubiak-red5-demo-jpa/
mvn clean install

 

Powinniśmy cierpliwie oczekiwać sukcesu.

Nasza aplikacja została zbudowana. Wynikiem pracy jest plik war. Ten plik war możemy wgrać na serwer Apache Tomcat. Ja korzystam z najnowszej stabilnej wersji – 6.0.18.

cd ../..
wget "http://ftp.tpnet.pl/vol/d1/apache/tomcat/tomcat-6/v6.0.18/bin/apache-tomcat-6.0.18.tar.gz"
tar xvfz apache-tomcat-6.0.18.tar.gz
cp jakubiak-red5-read-only/jakubiak-red5-demo-jpa/target/tomcat/webapps/jakubiak-red5-demo-jpa-war.war apache-tomcat-6.0.18/webapps/

 

Zaganiamy koteczka Toma do roboty. MiauJ

cd apache-tomcat-6.0.18/
./bin/startup.sh
tail -f logs/catalina.out

 

W logach serwera wypatrujemy sukcesu.

Nadszedł czas na testy użytkownika. Uruchamiamy przeglądarkę:

http://ADRES-IP-SERWERA:8080/jakubiak-red5-demo-jpa-war/publisher.swf

 

Wczytana zostanie standardowa aplikacja demonstracyjna, dostarczana z serwerem Red5. W polu “Location” wpisujemy:

rtmp://ADRES-IP-SERWERA/demojpa

 

RTMP to protokół komunikacyjny używany w Flashu. “demojpa” to nazwa naszej aplikacji. Połączenie do serwera zostanie nawiązane.

W zakładkach “Settings” wybieramy kamerę webową oraz dźwięk. Testujemy publikowanie wideo. Nie powinno działać, gdyż nie wpisaliśmy jeszcze swojego adresu IP do listy uprawnionych adresów w naszej aplikacji.

W logach serwera znajdziemy przyczynę.

Adres IP, z którego zamierzamy publikować, trzeba dopisać do bazy danych.

psql -h localhost -U demojpa
INSERT INTO hostallow VALUES ( '192.168.0.114' );

 

Wracamy do przeglądarki WWW. Teraz możemy już rozpocząć publikację i podziwiać efekt naszej pracy.

Gdy mamy już działającą aplikację, to możemy w niej pogrzebać, po to by coś zepsuć lub ją zrozumieć. Ja nie będę nic psuł, ale postaram się opisać najważniejsze elementy.

find . -type f | egrep -v .svn
./src/test/java/eu/jakubiak/red5/demo/jpa/StreamPublishSecurityTest.java
./src/main/java/eu/jakubiak/red5/demo/jpa/entities/HostAllow.java
./src/main/java/eu/jakubiak/red5/demo/jpa/DemojpaApplicationAdapter.java
./src/main/java/eu/jakubiak/red5/demo/jpa/StreamPublishSecurity.java
./src/main/resources/META-INF/persistence.xml
./src/main/resources/red5-services.xml
./src/main/resources/logback.xml
./src/main/resources/red5-core.xml
./src/main/resources/red5-common.xml
./src/main/resources/beanRefContext.xml
./src/main/resources/defaultContext.xml
./src/main/resources/red5-web.xml
./src/main/resources/jdbc.properties
./src/main/webapp/META-INF/MANIFEST.MF
./src/main/webapp/WEB-INF/demojpa-servlet.xml
./src/main/webapp/WEB-INF/web.xml
./src/main/webapp/publisher.swf
./pom.xml
			

 

Po kolei, StreamPublishSecurityTest – jest to klasa która służy do przetestowanie wrażliwego kodu w naszej aplikacji. HostAllow jest to klasa reprezentująca encję JPA, koresponduje ona z tabelką która zostanie utworzona w bazie danych. DemojpaApplicationAdapter definiuje aplikację Red5, w tej klasie włączamy naszą politykę bezpieczeństwa podczas publikowania wideo. StreamPublishSecurity to klasa którą robi czarną robotę – właśnie tu sprawdzane jest, czy Internauta może publikować.

Dalej: persistence.xml to plik potrzebny dla JPA. Najprościej mówiąc, definiujemy w nim, które klasy mają być mapowane na tabele w bazie danych. red5-services.xml to bardzo ważny plik, w którym konfigurujemy ziarna springa wykorzystywane w naszej aplikacji. Znalazły się tam też informacje o bazie danych. Gdyby nasza aplikacja posiadała jakieś usługi zdalne, to właśnie tam warto było by je opisać.

logback.xml to konfiguracja dzienników aplikacji. red5-core.xml, red5-common.xml, beanRefContext.xml i defaultContext.xml to konfiguracja Springa dla serwera Red5. Gdy chcemy coś ulepszyć w Red5 to właśnie tam powinniśmy się włamać. red5-web.xml to plik w który możemy zmienić nazwę naszej aplikacji “demojpa” używaną podczas połączenia RTMP.

jdbc.properties to parametry połączenia do bazy danych. demojpa-servlet.xml w tym pliku trzymał bym konfiguracje kontrolerów widocznych w protokole HTTP (akurat nie ma takich). web.xml to najważniejszy dla archiwum war plik w którym opisujemy składniki aplikacji internetowej. Z publisher.swf już wcześniej się spotkaliśmy. pom.xml to magiczny plik dla Mavena, który opisuje jak zbudować całą aplikację i jakie ma ona zależności.

Prawda, że fajne? 

Categories: Red5 Tags:

Xuggle + Red5 = Hello World

January 29th, 2009 No comments

Udało się, uruchomiłem przykład klasy Hello World dla tandemu Xuggle i Red5.

Jak to działa? W przeglądarce internetowej uruchamiam aplikację która publikuję obraz z kamery internetowej mojego laptopa. Publikowany obraz przetwarzany jest na serwerze Red5 przy użyciu Xuggle. Internauci w swoich przeglądarkach mogą widzieć przetworzony przez serwer, opublikowany przeze mnie obraz. Nastała nowa era w multimedialnych aplikacjach internetowych!

 

Możliwości wydają mi się niesamowite. Na przykład marzy mi się wideo konferencja gdzie a uczestnicy widzą siebie tak, jakby byli przy jednym stole. Albo serwer rozpoznaje twarz Internauty i na tej podstawie wita się z nim: “Dzień dobry Pani”, “Witam szanownego Pana”, “Mordo ty moja”. Albo strona biura turystycznego, wchodzimy na stronę, uruchamia się kamera naszego laptopa i po chwili widzimy siebie bujającego się w hamaku rozwieszonym między palmami na wspaniałej plaży.

Z całą pewnością, perspektywa hamaku jest przyjemniejsza niż perspektywa pracy przy komputerze. Wracam jednak do konkretów. Co się dzieje na serwerze? Serwer – Red5 – otrzymuje od Internauty film. Ten film to strumień danych. Może zawierać obraz, muzykę lub inne dane. Strumień wideo jest skompresowany. Serwer musi go rozpakować, tak aby z obrazu wideo otrzymać kolejne klatki (to robota dla Xuggle i FFmpeg). Przypomina to trochę starą taśmę filmową, na której wciąż jeszcze kręci się filmy w Hollywood.

Wynikiem dekompresji filmu jest lista zdjęć. To co serwer z nimi zrobi zależy od wyobraźni twórców witryny internetowej. Następnie serwer kompresuje listę zdjęć – tworząc z niech nowy film – nowy strumień danych. Serwer może zapisać wynik swoje pracy lub też może go udostępnić do pobierania na żywo.

Oczywiście, w podobny sposób możemy też przetwarzać dźwięk. Na przykład do rozmowy dwojga ludzi na czacie możemy dodać ich ulubioną muzykę, lub odgłosy tła takie jak szum ludzi w kawiarni.

Jak widać, serwer ma sporo pracy: dekompresja i kompresja strumieni audio i wideo, przetwarzanie obrazu lub dźwięku. Podczas moich testów obciążenie laptopa sięgało 10%. Jednak serwer robi coś nowego, coś czego Internauci się nie spodziewają. Coś, co może być kluczem do sukcesu. Uważam, że dla efektu warto będzie grzać serwery.

W następnym artykule opiszę jak uruchomić aplikację Xuggle Hello World na serwerze Red5.

Categories: Red5 Tags:

Red5 – instalacja panelu administratora

January 28th, 2009 4 comments

W największym skrócie Red5 to serwer internetowych aplikacji multimedialnych. Aktualnie przeżywa on okres intensywnego rozwoju. Właśnie udało mi się uruchomić panel administratora, a ponieważ nie jest to sprawa trywialna więc opiszę ją tu by dobrze zapamiętać.

A więc najnowszą wersje Red5 0.8RC2 pobieram ze strony Xuggle. Instaluję zgodnie z instrukcją, czyli rozpakowuję i ustawiam zmienną środowiskową RED5_HOME. Następnie uruchomiam aplikację Installer: http://localhost:5080/installer/, instaluję aplikację admin i restartuję Red5. Następnie, jak to opisano na forum, rejestruję się: http://localhost:5080/admin/register.html. Po rejestracji ponownie restartuję Red5. Teraz już mogę się zalogować: http://localhost:5080/demos/adminPanel.html

W panelu administratora mogę przejrzeć listę włączonych aplikacji, zobaczyć aktualnie podłączonych klientów, sprawdzić transfer.

A teraz wracam do nauki tematu Xuggle – Red5.

Categories: Java, Red5 Tags:

Xuggle

January 26th, 2009 3 comments

Dziś, z zawodową ciekawością zacząłem przyglądać się projektowi Xuggle.

Xuggle umożliwia kodowanie, dekodowanie i obróbkę wideo w czasie rzeczywistym!!! Xuggle może być kluczem do połączenia potęgi biblioteki FFmpeg z potęgą Javy. Korzystając z Xuggle uda się napisać odtwarzacz filmów wideo w Javie i dodatkowo wyposażyć go w funkcje do edycji video. Wyczytałem (i mam zamiar to przetestować), że Xuggle współpracuje z serwerem Red5. Red5 + Xuggle otwiera świat możliwości w dziedzinie aplikacji video – internetowych. Będę w tym temacie.

Categories: Java, Red5 Tags:

Testowanie zdalnych metod w Flex

March 14th, 2008 No comments
Moim zadaniem jest przetestowanie działania zdalnych metod Java uruchamianych w Flex, np.:
netConnection.call( "calculatorService.add", new Responder( onAdd ), 2, 2 );
Do tworzenia testów jednostkowych w Flex zalecana jest biblioteka FlexUnit. Wkładając ten kod do FlexUnit, zauważmy, że nie radzi on sobie z metodami asynchronicznymi – chyba że je specjalnie zaznaczymy:
netConnection.call( "calculatorService.add", new Responder( addAsync(onAdd,5000) ), 2, 2 );
Jednak to jeszcze nie działa. Metoda addAsync dostosowana jest do pracy z zdarzeniami. Próbując uruchomić ten kod otrzymam błąd: TypeError: Error #1034: Type Coercion failed: cannot convert "4" to flash.events.Event. Poradziłem sobie z tym w następujący sposób:
netConnection.call("calculatorService.add", new Responder( myAddAsync( testSum ) ), 2, 2 );

public function testSum(a:Number):void {
  assertEquals(4,a);
}

// 
public function myAddAsync(f:Function):Function {
  // wyciąga dane z eventa
  var f1:Function = function(e:DynamicEvent):void { 
    f.call(this,e.result);
  }
  // buduje asynchroniczną funkcję, operującą na zdarzeniach
  var f2:Function = addAsync(f1, 5000);
  // pakuje odpowiedź serwera do zdarzenia
  var f3:Function = function(a:*):void {
    var e:DynamicEvent = new DynamicEvent("MyDynamicEvent");
    e.result = a;
    f2.call(this, e);
  }
  return f3;
}
Ta ostatnia funkcja wygląda dość dziwnie – ale robi to co musi. Daje mi możliwość budowania testów integracyjnych – współpraca Flex’a z serwerem Red5.
Categories: FLEX, Java, Red5 Tags:

Red5 + Flex + JPA – mapowanie encji

March 12th, 2008 No comments

Udało mi się zamapować klasę Java (reprezentującą encję JPA) do klasy Flash AS3. Serwerem jest RED5, protokołem RTMP, kodowanie obiektów AMF0. Miałem dwa problemy:

  • wybór dostawcy JPA,
  • typ Number we Flashu,

Zacząłem od OpenJPA. Napotkałem na następujący problem. Obiekty klas Java nie zawsze były mapowane do odpowiedników AS3. Otóż gdy OpenJPA pobiera encje z bazy to zwraca klasy Proxy dziedziczące po klasach encji. RED5 nie potrafi sobie z tym poradzić, i nie wie jak ma mapować klasy Proxy dla Flasha. Doraźnym rozwiązaniem problemu jest wybór innego dostawcy JPA – Hibernate. Fajnie, że tak można.

Drugi problem, to mapowanie typu Number. Typ Number występuje w Flashu i teoretycznie nie należy mu przypisywać wartości NULL. Gdy ustawię w Flashu typ Number na NULL i wyślę go do serwera RED5, to w Javie otrzymam 0 (zero) – prawie to samo a działa bardzo źle. Doraźnym rozwiązaniem problemu jest dla mnie zastąpienie typu Number typem String w klasach AS3.

Categories: FLEX, Java, JPA, Red5 Tags: