Streaming de peliculas casero con Linux + VLC

Publicado el 09 diciembre 2015 por Drassill
¿Alguna vez habéis querido compartir un vídeo con una gran cantidad de personas de vuestra red, pero no deseáis subirlo a Internet ni mandarlo individualmente a cada persona? ¿Simplemente dejar ese vídeo disponible para cualquiera que desee verlo? En el día de hoy vengo a mostraros cómo lograr dicho objetivo de forma muy sencilla gracias a Linux y a la archiconocida herramienta VLC. En este caso en concreto me centraré en usar la consola de Linux, pues aunque también es posible hacerlo desde la interfaz gráfica, el conocer cómo hacerlo desde la consola puede ser realmente útil en entornos en los que se carece de ésta, entornos que necesitan muy pocos recursos para funcionar. Antes de nada, he de decir que para lograr este objetivo transmitirá el vídeo mediante el método de transmisión multicast, con lo que en caso de desconocer este concepto, os recomiendo leeros este post.

Los requisitos para lograr esto se tratan de simplemente dos:
  • Un sistema basado en Linux; preferiblemente Debian.
  • VLC

El primer requisito es sencillo y requiere de un equipo o máquina virtual con muy pocos recursos, pues no requerirá de entorno gráfico alguno; todo se puede hacer desde la consola sin problemas. El segundo requisito, si bien es muy conocido, nunca viene instalado por defecto en ningún sistema Linux, sea la distribución que sea, pero al ser una herramienta Open Source que goza de una enorme popularidad, está incluida en los repositorios oficiales de la gran mayoría de las distribuciones, con lo que su instalación es tan sencilla como escribir:
sudoapt-get install vlc
Con todos los requisitos cumplidos, hay un pequeño problema y es que aunque VLC es usable, requiere usar una serie de parámetros muy difíciles de recordar, y además es mucho más útil y cómodo tratar VLC como un "demonio" y ejecutarlo cuando nosotros queramos sin tener que memorizar el comando y los parámetros necesarios... Además he aprovechado dicho script para indicar un fichero de configuración en el que indicaremos una serie de comportamientos para VLC. Dicho script se denominaría vlcinit.sh y poseería el siguiente contenido:
  1. #!/bin/bash
  2. PIDFILE=/var/run/streaming.pid
  3. CONF=/etc/vlc/streaming.conf
  4. DAEMON="/usr/bin/vlc"
  5. DAEMON_ARGS="-I telnet --telnet-port 60000 --telnet-password uvelece --vlm-conf=$CONF"
  6. do_start()
  7. {
  8.         start-stop-daemon --verbose --chuid nobody:nogroup --start --pidfile $PIDFILE --background --make-pidfile --exec $DAEMON --$DAEMON_ARGS
  9. }
  10. do_stop()
  11. {
  12.         start-stop-daemon --verbose --stop --pidfile $PIDFILE
  13.         rm -f $PIDFILE
  14. }
  15. case "$1" in
  16.   start)
  17.         do_start
  18.         ;;
  19.   stop)
  20.         do_stop
  21.         ;;
  22.   restart)
  23.         do_stop
  24.         do_start
  25.         ;;
  26.   *)
  27.         echo "El uso correcto es: $0 {start|stop|restart}"
  28.         ;;
  29. esac

Lo más reseñable dentro de este script (aparte de los argumentos de DAEMON_ARGS en los que no profundizaré), sería el archivo de configuración llamado /etc/vlc/streaming.conf. Si exploramos dentro del equipo veremos que no existe dicho directorio vlc, ni mucho menos el fichero streaming.conf... Esto es debido a que este fichero de configuración ha sido inventado con el único propósito de hacernos capaces de "stremear" una película que tengamos almacenada en el equipo.
Es por ello que si queremos que apunte a un fichero real, tendremos que apuntar a éste, para lo cual tendremos que crear tanto la carpeta como el fichero en cuestión, con sus correspondientes permisos de ejecución. Esto se lograría mediante los comandos:
  1. mkdir /etc/vlc/
  2. touch /etc/vlc/streaming.conf
  3. sudo chmod +x /etc/vlc/streaming.conf

Además, dentro de dicha carpeta (/etc/vlc) crearemos un directorio que almacenará la pelicula y/o peliculas que deseemos compartir; como por ejemplo el directorio películas.
mkdir/etc/vlc/peliculas
Dentro de este directorio almacenaremos las peliculas que deseemos; yo por ejemplo, para no incurrir en ningún problema de derechos, he introducido la película Big Buck Bunny, la cual es completamente gratis y se puede distribuir sin problemas. En caso de estar interesados en usar dicha película lo podéis hacer aquí.
Ahora llegaría el turno de preparar el archivo de configuración streaming.conf; este fichero está vacío por defecto, ya que ha sido creado por nosotros, pero usando como plantilla el fichero de configuración para la película Big Buck Bunny, podemos crear un archivo de configuración con tantas películas como deseemos. En este caso en particular, el fichero tendría este contenido:
  1. new channel1 broadcast enabled
  2. setup channel1 input /etc/vlc/peliculas/big_buck_bunny_1080p.avi loop
  3. setup channel1 output #duplicate{dst=std{access=udp,mux=ts,dst=230.40.100.80:1234}}
  4. control channel1 play

A primera vista este párrafo puede parecer ilegible, pero en él únicamente hay tres valores que tendríamos que modificar por cada pelicula a compartir.
  • channel${número canal}: Cada película tendrá un número de canal asociado. Dicho número de canal debe ser único por cada una de éstas y generalmente irá aumentando consecutivamente (1,2...) si bien esto último es opcional. En este caso solo tendremos una película, que será la primera y última, con lo que el canal sería el 1
  • input ${nombre película a compartir}: En el input deberemos definir cual será la pelicula que emitiremos... Aquí es muy importante establecer de forma precisa la ruta de la película en cuestión para evitar emitir contenidos vacíos.
  • output #duplicate{dst=std{access=udp,mux=ts,dst=${ip_multicast}:1234}}: Aquí es indispensable tener un mínimo conocimiento de lo que se trata una dirección ip multicast y el método de transmisión de ésta; es por ello que al principio he recomendado la lectura del anterior artículo. Esta ip sería la dirección a la que tendríamos que dirigirnos para ver la película, cosa que veremos más adelante. Obviamente la ip multicast tiene que ser única para cada pelicula, pues en caso contrario habría problemas.
Teniendo claros estos conceptos, podemos concluir que, en base al fichero de configuración anterior, tendríamos esta plantilla:
  1. new channel${número_canal} broadcast enabled
  2. setup channel${número_canal} input ${pelicula} loop
  3. setup channel${número_canal} output #duplicate{dst=std{access=udp,mux=ts,dst=${ip_multicast}:1234}}
  4. control channel${número_canal} play

Con el fichero de configuración preparado, seriamos capaces de ejecutar el demonio vlcinit.sh anteriormente creado; demonio que puede ser ejecutado en cualquier momento y con facilidad. Si por ejemplo se encontrase dentro de /etc/init.d, únicamente habría que hacer /etc/init.d/vlcinit.sh start y ya tendríamos el contenido disponible para todo el mundo; ahora bien: ¿Cómo accedemos a dicho contenido? Mediante VLC también claro está.
En este caso, obviamente, los equipos desde los cuales veremos la película deben de tener entorno gráfico, independientemente del sistema operativo que tengan siempre y cuando tengan el software VLC instalado. Simplemente habría que abrir dicho software y dirigirnos a la sección Medio --> Abrir ubicación de red...

Tras clickar en dicha sección, veríamos una pequeña ventana en la que nos preguntarían a que ubicación de red deseamos acceder... ¿Adivinad a qué ubicación deseamos acceder? Efectivamente. A la dirección multicast que hemos especificado anteriormente en streaming.conf. Dirección a la que siempre apuntaríamos mediante la nomenclatura: udp://@${ip_multicast}:1234; es decir que para ver Big Buck Bunny escribiríamos --> udp://@230.40.100.80:1234 tal y como se muestra en la pantalla de a continuación.

Con únicamente pulsar reproducir, podríamos ver el contenido sin tenerlo almacenado en nuestro equipo... Además dicho contenido podría ser accedido desde diferentes orígenes y diferentes usuarios sin que ninguno de ellos se "molestase" al otro. Cómo nota final, diría que es recomendable compartir pocas películas mediante este método, a menos que tengamos una red preparada para trabajar con multicast, red que jamás estaría preparada para dicho tráfico en un entorno doméstico.
Espero que os haya resultado útil.
Saludos.