27
Streaming in Java e Flex con Red5 Marcello Teodori [email protected] [email protected] Java User Group Milano http://www.jugmilano.it JUG Milano Meeting #35 24/09/2009

Streaming in Java e Flex con Red5

Embed Size (px)

DESCRIPTION

Presentazione tenuta al JUG Milano Meeting #35 del 24/09/2009.

Citation preview

Page 1: Streaming in Java e Flex con Red5

Streaming in Java e Flex con Red5Marcello [email protected]@excogitanet.com

Java User Group Milanohttp://www.jugmilano.it

JUG Milano Meeting #35 24/09/2009

Page 2: Streaming in Java e Flex con Red5

JUG Milano Meeting #35 2

Di cosa parleremo?

● RIA e Applicazioni Video: MyTube● Supporto media in Flex/Flash● Il protocollo RTMP● Red5● Xuggle

Page 3: Streaming in Java e Flex con Red5

JUG Milano Meeting #35 3

Definizione di Rich Internet Application

"web applications have extended the reach of enterprises to customers, offering anywhere and anytime access. However, this has

been at the expense of the overall user-experience, which is diminished by delivery through the web browser"

Steven Webster e Alistair McLeod,autori del libro Flex Integration with J2EE, 2005

http://www.theserverside.com/articles/article.tss?l=Flex→ un nuovo tipo di web application che ne superi i limiti?

Caratteristiche:● web deployment● logica applicativa suddivisa fra client e server● interazione immediata senza percezione di un roundtrip sul server● accesso a contenuti rich: audio/video

Page 4: Streaming in Java e Flex con Red5

JUG Milano Meeting #35 4

Architettura di Riferimento

MyMy

Page 5: Streaming in Java e Flex con Red5

JUG Milano Meeting #35 5

La Flash Platform di Adobe

Page 6: Streaming in Java e Flex con Red5

JUG Milano Meeting #35 6

Supporto Media su Flash

● FLV è il formato “container” per il video in Flash● Il video contenuto in un FLV può essere codificato in uno dei

seguenti formati a seconda della versione del Flash Player: – Flash Player 6 e 7 supportano Sorenson– Flash Player 8+ supporta VP6 e MP3

→ creo video solo con prodotti On2 e Flash Player– AIR e Flash Player 9.0.115.0+ supportano H.264 e AAC

→ creo video con prodotti con supporto allo standard● Il codec audio che usa il Flash Player per registrare input da

device audio locali, come un microfono, è Speex

Page 7: Streaming in Java e Flex con Red5

JUG Milano Meeting #35 7

Supporto Server per Media

Qual è il modo più adatto per servire media?

● HTTP download– download progressivo– seek richiede metadata injection

● RTMP streaming– non è standard (vedi RTP/RTSP)– permette live– proprietario Adobe usato per lo streaming nei loro

prodotti● Flash Player/AIR come client● Flash Media Server sul server

Page 8: Streaming in Java e Flex con Red5

JUG Milano Meeting #35 8

I nostri strumenti

Page 9: Streaming in Java e Flex con Red5

JUG Milano Meeting #35 9

Red5● cos'è?

Server di streaming opensource in Java per client Flash alternativo a Flash Media Server.

● basato su:– Spring– Apache Mina– Tomcat

● versione 0.8 stabile, 0.9 RC1 con supporto H.264: http://gregoire.org/2008/10/06/red5-h264/

● deployment come server standalone o come war in generico servlet container Java EE

Page 10: Streaming in Java e Flex con Red5

JUG Milano Meeting #35 10

Cosa offre Red5?● Implementazione in reverse engineering del

protocollo RTMP, reso pubblico a giugno 2009 da Adobe, con supporto varianti RTMPS e RTMPT

● Streaming Audio/Video● Recording Client Streams ● Remote Shared Objects● Live Stream Publishing● Remoting (AMF) per Flex API● client-to-server method call● server-to-client method client

Page 11: Streaming in Java e Flex con Red5

JUG Milano Meeting #35 11

Esempi di applicazioni

● Chat● Videoconferenza● Lavagnetta Condivisa● Player video● Player Mp3● Web TV● Video Notizie live in streaming● Sistemi di Collaborazione Online● Realtime multiplayer Game● Aule Web● Video Blog● Etc

Page 12: Streaming in Java e Flex con Red5

JUG Milano Meeting #35 12

Creare applicazioni Red5● WAR packaging

– streams → cartella per file FLV– persistence → cartella per shared object– WEB-INF

● lib● classes● web.xml● red5-web.xml → configurazione spring● red5-web.properties → property placeholder

● per deployment non su server standalone bisogna aggiungere le configurazioni spring del server Red5

Page 13: Streaming in Java e Flex con Red5

JUG Milano Meeting #35 13

Come Red5 usa Spring● 2 livelli di ApplicationContext

– 1 parent application context condivisocaricato via ContextSingletonBeanFactoryLocator

● red5-common.xml → beans del server Red5● red5-core.xml → endpoint Mina TCP● red5-default.xml → root context Red5 di default

– N child application context → per applicazione WAR● red5-web.xml

● bean contenuti in un'application:– context– 1 web scope più N eventuali subscope– handler → entry point dell'applicazione Red5, deve essere

un bean del seguente tipo o sua sottoclasse: org.red5.server.adapter.ApplicationAdapter

Page 14: Streaming in Java e Flex con Red5

JUG Milano Meeting #35 14

Anatomia di una URL RTMP per Red5

● protocol → rtmp/rtmps/rtmpt● host → server Red5● port → porta: 1935 per rtmp, 80 per rtmpt,

443 per rtmps● application → contextPath del web scope● scope → nome subscope in gerarchia

protocol://host:port/application/scope/../scope

Page 15: Streaming in Java e Flex con Red5

JUG Milano Meeting #35 15

Un'applicazione Red5Java Serverpackage it.jugmilano.examples.red5;import org.red5.server.adapter.ApplicationAdapter;public class Application extends ApplicationAdapter { public List<Movie> getHitParadeMovieAtPosition(int i) { VideoDetails vd = new VideoDetails(); vd.setId(i); vd.setName("Pulp Fiction"); return vd; }}

ActionScript Clientnc = new NetConnection();nc.connect("rtmp://localhost/myapp", "myusername", "mypassword");nc.onResult = function(obj:*) { trace("The result is " + obj);}nc.call("getHitParadeMovieAtPosition", nc, 1);ns = new NetStream(nc);video = new Video();// publishns.attachCamera(Camera.getCamera());ns.publish("my-video", "live");// playvideo.attachNetStream(ns);ns.play("your-video");

Page 16: Streaming in Java e Flex con Red5

JUG Milano Meeting #35 16

Mapping Java-FlexJavapackage it.jug...odel;

public class VideoDetails { private Integer id; private String name; public Long getId() { return id; }

public void setId(Long id) { this.id = id; } public String getName() { return name; }

public void setName(String name) { this.name = name; }}

ActionScriptpackage {

[Bindable] [RemoteClass(alias="it...deoDetails")] public class VideoDetails { public var id:*; public var name:String; }

}

Page 17: Streaming in Java e Flex con Red5

JUG Milano Meeting #35 17

Un esempio

Riproduzione di un file video FLV in download progressivo su HTTP vs. streaming RTMP:1. avvio Red5 standalone2. upload in cartella streams sul server3. connessione tramite oggetto NetConnection con URL

HTTP4. creazione oggetto NetStream da NetConnection5. aggancio NetStream a componente VideoDisplay6. play del file FLV sul NetStream7. ripeti dal punto 3 a 6 sostituendo on URL RTMP8. effettua seek del file

Page 18: Streaming in Java e Flex con Red5

JUG Milano Meeting #35 18

red5.deployment.type● standalone

– tomcat embedded preconfigurato– distribuzioni per i vari OS– hot deployment WAR – problemi di visibilità classi

● war– si installa su qualsiasi servlet container JEE– local deployment in ROOT war

● posso usare “mavenized” red5– remote deployment in WAR aggiuntivi

● usa RTMPTunnelServlet

Page 19: Streaming in Java e Flex con Red5

JUG Milano Meeting #35 19

AMF Remoting

● posso usare le API RemoteObject di Flex al posto della NetConnection di Flash

● richiede la configurazione della AMFGatewayServlet in web.xml

● il codice sorgente di Red5 conterrebbe anche le classi di supporto al messaging per le API Producer e Consumer di Flex, ma... non sono mai citate in esempi e documentazione come funzionanti...

Page 20: Streaming in Java e Flex con Red5

JUG Milano Meeting #35 20

Integration Testing in JavaRed5 mette a disposizione delle Client API in Java per costruire test JUnit di integrazione, in alternativa all'uso delle Flash API in test FlexUnit:● RTMPClient per RTMP/RTMPT/RTMPS● RemotingClient per AMF/HTTP

Queste classi sono utilizzate nella test suite ufficiale di prodotto, i cui risultati di esecuzione sono pubblicati su un'istanza di Hudson come server di Continuos Integration: http://build.theyard.net/

Page 21: Streaming in Java e Flex con Red5

JUG Milano Meeting #35 21

Red5 Eclipse PluginRed5 offre un plugin per Eclipse per facilitare lo sviluppo e deployment: http://www.red5.org/wiki/Red5Plugin

PRO:● integra Red5 standalone come Runtime in WTP● Offre template di applicazione sia client che server come

“facet” di WTP che usano la libreria Jedaihttp://code.google.com/p/jedai/

CONTRO:● dopo il primo deploy di un WAR non ne effettua l'update● i template di applicazione usano versioni obsolete di Jedai● Jedai è poco documentato e non molto attivo● Jedai dipende da versioni non recenti di Prana Framework

(ora Spring ActionScript)● i componenti Flex offerti da Jedai sono limitati

Page 22: Streaming in Java e Flex con Red5

JUG Milano Meeting #35 22

jakubiak-red5http://code.google.com/p/jakubiak-red5/● “mavenized” Red5 realizzato da Antoni

Jakubiak tramite svn:externals● scompone Red5 in moduli più gestibili● include le demo standard in versione progetto

Maven, più diversi progetti di esempio, eseguibili sia su server Red5 standalone che come WAR anche con i plugin di Maven per Tomcat e Jetty

● Maven Repository con rilasci allineati a quelli ufficiali, inclusi sorgenti e javadoc: http://jakubiak-red5.googlecode.com/svn/repo/

Page 23: Streaming in Java e Flex con Red5

JUG Milano Meeting #35 23

Red5 al posto di FMS?SI!● sviluppo in Java con Spring invece che in script ActionScript

NON a oggetti– maggiori possibilità di integrazione– testing– posso fare scripting anche in Groovy, Jython e JRuby

● clustering con Terracotta● balancing con configurazione edge-origin ed MRTMP

Ma neanche per sogno!● non è la soluzione ufficiale supportata da Adobe!● non offre encryption tramite RTMPE che è un protocollo

proprietario!

Page 24: Streaming in Java e Flex con Red5

JUG Milano Meeting #35 24

Oltre Red5: Xuggle

● Red5 NON contiene codec→ non posso effettuare transcoding!

● Xuggle è un progetto che integra ffmpeg in Java e Red5 tramite JNI→ ffmpeg fa da decoder/encoder FLV ecc.

● Red5 e ffmpeg sono opensource con licenza LGPL (alcuni moduli di ffmpeg sono però GPL), Xuggle ha licenza AGPL, inoltre ci sarebbero le licenze d'uso dei codec...

Page 25: Streaming in Java e Flex con Red5

JUG Milano Meeting #35 25

Oltre Red5: Blue5

● Red5 NON supporta– RTMPE/RTMPTE

→ encryption– RTMPF

→ p2p● Blue5 è il progetto per l'implementazione di

protocolli alternativi su Red5http://code.google.com/p/blue5/

– in attesa che vengano pubblicati da Adobe– per esplorare strade alternative a quelle ufficiali

Page 26: Streaming in Java e Flex con Red5

JUG Milano Meeting #35 26

Riferimenti● Red5

http://www.red5.org● “mavenized” Red5

http://code.google.com/p/jakubiak-red5/● FlexMojos – plugin Maven per Flex

http://flexmojos.sonatype.org/● Flex-Developers.org - ottimi tutorial in italiano su

Flex, Red5, ecc.http://www.flex-developers.org

● Xugglehttp://www.xuggle.com/

Page 27: Streaming in Java e Flex con Red5

JUG Milano Meeting #35 27

Q&AQ&A