Get it on Google Play

Video Streaming en Java+Liferay

06-11-2009
 

Hacía tiempo que no escribía un articulo técnico y ya tenia ganas. Hoy vamos a explicar como hacer streaming a partir de un Portlet Liferay que desarrollé hace ya tiempo.

adaptive-streaming

Introducción: El vídeo streaming nos permite ver vídeos en Internet en tiempo real (No es el ejemplo de este post) o nos permite ver vídeos por Internet sin tener que esperarnos a descargarlos por completo.

1. Transformar un vídeo para hacer streaming.

Lo primero es transformar el vídeo a algún formato que nos permita streaming, por ejemplo FLV. Para ello usaremos ffmpeg, aquí un ejemplo de como transformar un mpeg a flv:

ffmpeg -i VIDEO.mpg -ar 44100 -ab 32 -f flv -s 320x240 -aspect 4:3 -y VIDEO.flv

Luego una particularidad del formato flv, hay que añadirle la información a la película para que acepte streaming. Para ello utilizaremos la utilidad flvtool2:

flvtool2 -U VIDEO.flv

Ya tenemos un vídeo preparado para hacer streaming, esto también se podría haber hecho con otros programas como por ejemplo Adobe Premier Pro o similar. He escogido estos porque me han parecido muy prácticos al ser en línea de comando (Por tanto podemos crear scripts con ellos para automatizar) y software libre.

2. Programar la página.

Utilizaremos el Flowplayer para insertar el vídeo en la web. Aquí tenemos el código HTML:

<script type='text/javascript' src='/flowplayer/example/flowplayer-3.1.2.min.js'></script>
<div style='padding-left: 50px;'><a style='display:block;width:520px;height:330px' id='player'> </a></div>
<script>
var p=flowplayer('player', '/flowplayer/flowplayer-3.1.3.swf', {
clip: {
url: '<url del script para descargar el fichero>',
provider: 'lighttpd',
},
plugins: {
lighttpd: {
url: '/flowplayer/flowplayer.pseudostreaming-3.1.3.swf'
}
}
} );
</script>

Finalmente necesitamos un Servlet de java para descargar el fichero:

public class DownloadFileServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) {
String url = request.getRequestURL().toString();
String[] u=url.split( "/" );

String name=u[ u.length-1 ];
String id=u[ u.length-2 ];
String start=request.getParameter("start");

int st=0;
if ( start!=null ) st=Integer.parseInt( start );

Utils.downloadFile( response, id, name, st );
}

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet( req, resp );
}

static public void downloadFile( HttpServletResponse response, String id, String name, int start ) {
InputStream is = null;

try {
File fdesc=new File( "./videos/"+name );

response.setContentType( getContentType( fdesc.getName() ) );
response.addHeader( "Content-disposition", "attachment;filename="+URLEncoder.encode(fdesc.getName(),"UTF-8") );
response.addHeader( "Content-Length", ""+fdesc.length() );

OutputStream os = response.getOutputStream();
is= (InputStream) new FileInputStream( fdesc ) ;
int read = 0;
byte[] bytes = new byte[1024];
byte[] headerFLV= new byte[] {
(byte) 0x46, (byte) 0x4C, (byte) 0x56,
(byte) 0x01,
(byte) 0x05,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x09,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x09
};

if ( start>0 ) {
is.skip( (long) start );
os.write( headerFLV );
}

while((read = is.read(bytes)) != -1) {
os.write(bytes, 0, read);
}

os.flush();
os.close();
} catch (Exception ex) { ex.printStackTrace(); }

try {
if (is!=null) is.close();
} catch (Exception ex) { ex.printStackTrace(); }

}

}

Cuando se hace una petición de descargar de un fichero FLV se nos pasa el parámetro ‘start’, el parámetro ‘start’ marca el punto de inicio para descargar, en caso que ‘start’ sea mayor que 0 hay que escribir unas cabeceras para informarle al player que estamos haciéndole el streaming.

La primera versión que hice del Portlet leía los vídeos de la BBDD, pero finalmente por problemas a la hora de hacer copias de seguridad de la BBDD decidí grabarlos en disco.

Interesado en formación Liferay?

 

Comments

6 Responses to “Video Streaming en Java+Liferay”
  1. […] Esto nos puede venir de lujo para insertar diferentes tipos de vídeos en Liferay pero todavía no es suficiente(Entiendo yo) para hacer Streaming Video Streaming en Java+Liferay. […]

  2. Jordi says:

    Com et menjas el coco, quina passada.

  3. albert says:

    Es fa el que es pot 😀

  4. ¡Hola, Albert!
    Te felicito por el POST.
    Yo escribí un post acerca de cómo integrar Flowplayer con Liferay con el esquema de Estructuras y Plantillas del WCM y la Biblioteca de Documentos de Liferay. Si tenés un segundo y querés pasar a verlo, éste es el link: http://programacion-java.com/liferay-cms-avanzado-creacion-reproductor-video/
    Tu opinión es bienvenida.

    Saludos desde Argentina.

    Nicolás

  5. Gracias Nicolás, yo también te felicito por el tuyo, esta muy guapo. Saludos desde España!!!!

  6. Jaime says:

    hola esto se podriahacer para crear una web en wordpress como pelispedia.com
    ya que funciona como cuevana pero sin pedir los plugin firefox,chrome,explorer,opera etc

    los archivos que manejan son mp4 h264 igual que cuevana pero sin necesidad de los plugins

Leave a Reply

© Albert Coronado Calzada