Como crear una plataforma de transcoding con Rails y Node.js

2014-02-01 08:34:20 UTC Javier Amor Penas Comentarios
Big_transcoding_architecture

Todos sabemos lo sencillo que resulta subir un video a YouTube para luego compartirlo y darle difusión por internet, pero ¿que ocurre cuando somos nosotros los que debemos asumir el papel que realiza YouTube y queremos que nuestros clientes suban videos a nuestra plataforma y despues puedan visualizarlos e incluso realizar manipulaciones sobre ellos? Google lo hace tan bien y de forma tan transparente al usuario que por momentos puede parecer facil, lo que en realidad es una tarea compleja. En Softwhisper nos hemos tenido que enfrentar a este reto recientemente y como nos encanta compartir, hoy vamos a explicaros la arquitecutra necesaria para crear vuestra propia plataforma de transcoding.

Si tu aplicación tiene la necesidad de pemitir a los clientes realizar la subida de ficheros de video, tienes que asegurarte que posteriormente dichos videos puedan ser visualizados en cualquier navegador y para ello es necesario que conviertas esos archivos de video a 3 formatos MP4, OGG Y WEBM, este proceso es el que se denomina transcoding. Veamos como hemos planteado esta arquitectura de transcoding en Softwhisper.

Los que nos conozcais sabreis que seguimos la filosofía Ruby, razón por la cual hemos utilizado Ruby on Rails para el desarrollo del frontend/backend de la web, desarrollando la interfaz de usuario y la lógica de negocio basica para nuestra aplicación.

A está aplicación web se suma otro backend, pero esta vez hecho en Node.js. que actua de forma transparente a los usuarios y que es el encargado de llevar a cabo todo el procesamiento de los ficheros que el usuario sube a la plataforma. ¿Por que utilizar Node.js teniendo Rails? os podeis preguntar algunos. Bien, pues la respuesta es muy sencilla, Node.js tiene un excelente mecanismo de subida de archivos, los ficheros no son almacenados nunca de forma temporal en memoria, desde el primer instante de envió el fichero comienza a ser almacenado en el servidor, evitando saturaciones en la memoria, además hace uso intensivo de la programación funcional pemitiendonos implementar metodos asincronos muy facilmente, lo que facilita mucho la realización de tareas en paralelo. Nuestra aplicación Node.js adquiere por todo ello, un papel clave en la subida y procesamiento de los archivos: ocupandose de leer los metadatos del fichero, realizar el transcoding, rotar los fichero si la orientación no es la adecuada, realizar capturas de los videos y almacenar finalmente estos ficheros en la nube. Ademas hace uso de Socket.io para dar feedback al usuario en tiempo real, del estado en que se encuentra el fichero en cada momento de este proceso.

Cuando se crea un sistema de procesamiento bajo demanda como este es importante mantener un control de aquellos trabajos que hemos realizado, aquellos que estamos procesando y los que nos quedan por realizar, por todo esto hemos utilizado un motor de base de datos en memoria, como Redis, para implementar una una cola de peticiones basada en Kue para Node. Ademas una cola de este tipo, permite que recuperes aquellas tareas que estabas procesando o las que ibas a procesar frente a caidas del servidor.

La naturaleza de este tipo de aplicacines conduce a la generación de grandes cantidades de contenido multimedia, por ello para reducir costes en tu servidor de aplicaciones, es recomendable utilizar un servicio de almacenamiento multimedia en la nube, Cloud Hosting, que ya disponen de buenos precios ajustados a este tipo de situaciones, en nuestro caso hemos optado por el servicio de Cloud Hosting ofrecido por RackSpace.

A continuación os dejamos un listado de las principales librerias que hemos utiizado en nuestra solución de transcoding:

  • FFmpeg:  excelente herramienta de línea de comandos para convertir audio o video de un formato a otro, para abstraernos de la complejidad de la linea de comandos y facilitarnos su uso desde Node.js hemos utilizado el modulo Fluent FFmpeg.

  • ImageMagick: es la solución mas potente que podeis encontrar para la manipulación de imagenes desde el sistema, nuevamente hemos querido abastraernos de la linea de comandos y hemos usado el modulo Node-ImageMagick que nos permite un uso de la herramienta desde el backend.

  • Pkgcloud: es un modulo de Node.js que permite la interacción con multiples servicios en la nube, en nuestro caso nos ha servido para realizar el envio de nuestro contenido multimedia al servicio de Cloud Hosting de RackSpace.

  • Carrierwave & Fog: la utilización conjunta de estas dos gemas proporciona una solución extramademente flexible a la hora de subir y acceder a contenido almacenado en la nube y ha sido la solución empleada para la lectura de los archivos multimedia desde Rails.

  • Video.js: es un estupendo reproductor de video HTML5, es recomendable emplear este tipo de soluciones para promorcionar un funcionamiento y look consistente a traves de todos los navegadores. 

Esperamos que nuestras indicaciones os hayan ayudado si estais pensando en el desarrollo de una solución de transcoding, o que almenos os haya resultado inspirador ver como es posible encajar todas las piezas que componen una arquitectura como esta.