Get it on Google Play

Screenshots de vídeos con Libav y Java o Liferay sin Xuggler

26-09-2016
 
Libav

Libav

Liferay utiliza Xuggler para generar las previsualizaciones de vídeos . Si por temas de complejidad o rendimiento no nos interesa podemos hacerlo usando ‘Libav‘.

Libav son unas librerías open source para procesar audio y vídeo disponible para Linux. Con ellas podremos obtener información de vídeos, convertirlos, etc. En este caso vamos a usar ‘Avconv’ para generar un screenshot deun vídeo.

Instalar Libav

Para instalar ‘Libav’ lo podemos hacer en Ubuntu con la siguiente línea de comando:

	sudo apt-get install libav-tools

A partir de este momento ya podemos empezar a usarlos, si queremos sacar un screenshot de un vídeo:

	avconv -i /path/a/mivideo.mp4 -ss 00:00:05 -vframes 1 -aspect 640:480 -s 150:100 /path/a/miimagen.png

# donde:

# -ss marca el offset inicial del vídeo
# -vframes el número de frames a tratar
# -aspect la relación de aspecto
# - s la resolución de la imagen

Usando Aconv desde Java

Ahora que nuestro sistema operativo ya tiene Libav instalado con este script podemos generar los pantallazos que queramos y enviarlos, por ejemplo, como respuesta a una petición resourceURL de Liferay:

try {	
	/* Generamos los ficheros temporales */
	String tempFilename=new java.util.Date().getTime()+"_"+Math.random();
        File hfile=new File(tempFilename+entry.getFileName());
        File pfile=new File(tempFilename+".png");
            
        /* Guardamos fichero */
        FileOutputStream out = new FileOutputStream( hfile );
        InputStream in=entry.getContentStream();
        byte[] buf = new byte[1024];
        int len;

        while ((len = in.read(buf)) > 0) {
		out.write(buf, 0, len);
		}
          		
	in.close();
	out.flush();
	out.close();            
            
	/* Ejecutamos */
	Process p = Runtime.getRuntime().exec( "avconv -i "+hfile.getPath()+" -ss 00:00:01 -vframes 1 -aspect 640:480 -s 150:100 "+pfile.getPath() );
	p.waitFor();
             
	/* Leemos la imagen */
	byte[] b=Files.readAllBytes( pfile.toPath() );
                     
	/* Eliminamos los ficheros temporales */
	hfile.delete();
	pfile.delete();
             
	/* Devolvemos la imagen */
	HttpServletResponse response=PortalUtil.getHttpServletResponse(resourceResponse);
	response.setHeader("Content-Disposition", "attachment; filename=\"" + entry.getFileName() + ".thumb.png\";");
	response.setContentType( MimeTypesUtil.getContentType( "thumb.png" ) );

	response.getOutputStream().write(b);
	response.getOutputStream().close();
} catch (Exception ex) {
	ex.printStackTrace();
	}

Os dejo para vosotros mejorarlo, por ejemplo con una cache para mejorar el rendimiento.

Interesado en formación Liferay?

 

Leave a Reply

© Albert Coronado Calzada