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.