Nginx + RTMP compilado y empaquetado en Debian

RMTP es uno de los protocolos de streaming mas usados actualmente. Fue desarrollado por Macromedia, tras la compra de Macromedia por parte de Adobe. Este ultimo librero gran parte de las especificaciones del protocolo, lo que ha generado su masificación.

Existen varios servicios con los que se pueden realizar streaming via RMTP, como el crtmpserver (free) y el Wowza (Commercial). Pero el modulo de Nginx es muy atractivo, ya que con el cual se puede realizar streaming y transcoding.
El mismo se llama nginx-rtmp-module. (Actualmente no esta incluido en el paquete de Debian, supongo que sera por algún problema de licencia … ¿?).

Manos a la obra

Primero verificaremos que tenemos lo necesario para compilar e software.
Instalaremos “build-essential” el cual contiene los paquetes necesarios para compilar software, “devscripts” nos ayudara a compilar los paquetes  “deb” y “libav-tools” (opcional) el cual posee la herramienta “avconv”, que es el reemplazo para el “ffmpeg”.
Avconv lo utilizaremos para hacer transcoding.

Ejecutamos:

# apt-get install build-essential devscripts libav-tools

Instalado estos 3 paquetes, configuramos las dependencias para compilar el paquete de “nginx”, ejecutamos:

# apt-get build-dep nginx

Ahora crearemos un directorio donde guardaremos el código de nginx, por ejemplo:

# mkdir /tmp/nginx; cd /tmp/nginx

Dentro del directorio, obtenemos el fuente utilizado en Debian ejecutando:

# apt-get source nginx

(En este caso obtenemos la version 1.6.2 “nginx-1.6.2”).

Descargamos el código del modulo, has click aquí para ver las utilizar versiones disponibles. (En este caso es la version 1.1.7).

# wget https://github.com/arut/nginx-rtmp-module/archive/v1.1.7.tar.gz

Descomprimimos el mismo:

# tar zxvf v1.1.7.tar.gz

Copiamos el directorio que contiene el modulo dentro del código fuente de Nginx.

# cp -a nginx-rtmp-module-1.1.7 nginx-1.6.2/debian/modules/nginx-rtmp-module

Agregamos en modulo en la configuración del paquete, para esto editamos en archivo “nginx-1.6.2/debian/rules” con tu editor favorito.

# nano nginx-1.6.2/debian/rules

Buscamos la sección en el archivo “full_configure_flags”, en esta sección podemos ver la lineas:

–add-module=$(MODULESDIR)/nginx-auth-pam \
–add-module=$(MODULESDIR)/nginx-dav-ext-module \
–add-module=$(MODULESDIR)/nginx-echo \
–add-module=$(MODULESDIR)/nginx-upstream-fair \
–add-module=$(MODULESDIR)/ngx_http_substitutions_filter_module

Agregamos la linea:

–add-module=$(MODULESDIR)/nginx-rtmp-module 

Debería quedar así:

–add-module=$(MODULESDIR)/nginx-auth-pam \
–add-module=$(MODULESDIR)/nginx-dav-ext-module \
–add-module=$(MODULESDIR)/nginx-echo \
–add-module=$(MODULESDIR)/nginx-upstream-fair \
–add-module=$(MODULESDIR)/ngx_http_substitutions_filter_module \
–add-module=$(MODULESDIR)/nginx-rtmp-module

(Noten que se escapo la ultima linea). Guardamos los cambios y salimos.

Ahora editamos el archivo “nginx-1.6.2/debian/source/include-binaries”, si este archivo no existe, lo creamos:

# nano nginx-1.6.2/debian/source/include-binaries

Dentro de este colocamos las siguientes lineas:

debian/modules/nginx-rtmp-module/test/rtmp-publisher/RtmpPlayer.swf debian/modules/nginx-rtmp-module/test/rtmp-publisher/RtmpPublisher.swf debian/modules/nginx-rtmp-module/test/rtmp-publisher/RtmpPlayerLight.swf debian/modules/nginx-rtmp-module/test/www/bg.jpg debian/modules/nginx-rtmp-module/test/www/jwplayer_old/player.swf debian/modules/nginx-rtmp-module/test/www/jwplayer/jwplayer.flash.swf

Compilando

Procedemos a compilar el software, apara esto ejecutamos:

# cd nginx-1.6.2/; debuild

(Si existe algún error, aparecera durante este proceso!)

Si todo va bien al final veremos un error de PGP, ya que no tenemos una firma valida (Mas información acerca de como se compila y empaqueta en Debian):

debsign: gpg error occurred!  Aborting….
debuild: fatal error at line 1295:
running debsign failed

Este error lo podemos ignorar este error, subimos un directorio “cd ..” y veremos que tenemos nuestros paquetes listos:

nginx_1.6.2-5+deb8u1_all.deb
nginx-common_1.6.2-5+deb8u1_all.deb
nginx-doc_1.6.2-5+deb8u1_all.deb
nginx-extras_1.6.2-5+deb8u1_amd64.deb
nginx-extras-dbg_1.6.2-5+deb8u1_amd64.deb
nginx-full_1.6.2-5+deb8u1_amd64.deb
nginx-full-dbg_1.6.2-5+deb8u1_amd64.deb
nginx-light_1.6.2-5+deb8u1_amd64.deb
nginx-light-dbg_1.6.2-5+deb8u1_amd64.deb

Instalamos los paquetes:

# dpkg -i nginx-full_*.deb nginx-common_*.deb


(Opcional)

Pues ya tenemos compilado he instalado el Nginx,  bloquearemos estos paquetes para que los mismo no se actualicen por error.

# echo “nginx-common hold” | dpkg –set-selections
# echo “nginx-full hold” | dpkg –set-selections

Verificamos:

# dpkg –get-selections | grep nginx
nginx-common hold
nginx-full hold

Esto evitara que al realizar una actualización los paquetes tambien sean actualizados. Si requieres una actualización, deberas volver a compilar los mismos con la nueva versión del código.


Una configuración de prueba simple.

Para evitar el “espagueti code”, crearemos un directorio en “/etc/nginx/”, podemos ponerle el nombre que deseemos, en mi caso lo llamare “rtmp”:

# mkdir /etc/nginx/rtmp

Dentro de este directorio podremos las configuraciones de nuestro streaming. Creamos un archivo que luego llamaremos desde el archivo de configuración de nginx:

# nano /etc/nginx/rtmp/stream.conf

Dentro del archivo, pegamos el siguiente código:

rtmp {
server {
listen 1935;
chunk_size 4096;
# Permitimos que todos publiquen
allow publish all;
# Permitimos que todos visualicen
allow play all;
# Nombre de la aplicación
application envivo {
# Activamos el streaming
live on;
# No salvamos el stream
record off;
}}}

(No te olvides de indentar, para que se vea mas atractivo 😉
Editamos el archivo de configuración de nginx, para que cargue el archivo que hemos creado:

# nano /etc/nginx/nginx.conf

Agregamos la siguiente linea al final del archivo:

include /etc/nginx/rtmp/*.conf;

Reiniciamos el nginx:

# /etc/init.d/nginx restart

Y verificamos que el mismo este escuchando en el puerto “1935”:

netstat -anpt | grep nginx

tcp        0      0 0.0.0.0:1935            0.0.0.0:*               LISTEN      5695/nginx -g daemo

Con este pequeño ejemplo, ya podremos enviar datos al servidor. Por ejemplo si enviamos contenido desde una aplicación como “OBS”, lo haremos mediante la siguiente URL:

rtmp://la_ip_de_tu_server/envivo/

Indicamos la contraseña que queramos, en mi caso usare “pelicula”.
Así que si queremos ver el stream desde un reproductor, como el VLC, deberemos abrir al dirección:

rtmp://la_ip_de_tu_server/envivo/pelicula

En el proximo articulo explicare todas las opciones del modulo (RTMP, HSL, DASH). Su modulo de control, estadísticas y por supuesto, el transcoding.

No duden en comentar 😉

Continue Reading

¿La mentira de las llamadas WIFI de Orange?

La verdad que hace mucho tiempo que no escribo en mi blog, de hecho había decidido limpiarlo y dejarlo morir lentamente, utilizando solo el dominio para mantener mis cuentas de correos. Pero ayer a la noche recibí un SMS que me hizo pensar un poco, el SMS de Orange, del cual soy cliente, dice lo siguiente:

Lanzamos las llamadas Wi Fi, habla donde antes parecía imposible. Solo tienes que activarlo en los ajustes de tu iPhone + info…

Lo primero que se me paso por la cabeza fue un “Pero estos se quieres ahorrar el use del espectro radioeléctrico”, pero tuve algún pensamiento positivo, “la gente que vive fuera podar ahorrarse unos euros”. Pero las dudas fueron disipadas, según leo en las paginas de Orange:

¿Puedo utilizarlo en redes Wi-Fi del extranjero para llamar más barato?
Por el momento el servicio solo está disponible en redes Wi-Fi de España. Estamos trabajando para ampliarlo a redes Wi-Fi del extranjero, para que nuestros clientes puedan llamar de forma más económica cuando estén de viaje.

¡No! Como se me paso por la cabeza que nos podrían brindar semejante servicio…

Otra cosa que me llamo la atención, es la cantidad de notas de prensa que hay en internet sobre esta funcionalidad… y todo es “para mejorar la cobertura”.

Mucho iPhone, Android y demás yerbas… todo sigue siendo igual que hace 20 años, cuando comencé a utilizar móvil… hay que pagar por usar… pagas por el dispositivo, pagas por el servicio.

Continue Reading