Está en la página 1de 6

Hacer streaming de vídeo usando software libre

7 minute read
nginx

En este artículo voy a documentar mi experiencia montando un sistema para poder


realizar un streaming de vídeo usando software libre. En mi instituto hemos usado en
estos meses jitsi para realizar videoconferencias entre los profesores y para impartir las
clases a los alumnos. Al final de curso teníamos que celebrar el claustro final y
montamos un sistema de streaming para emitir la videconferencia jitsi donde se
encontraban los compañeros que iban a intervenir. Evidentemente con los medios que
tenemos no era posible tener una videoconferencia para unas 60 personas, pero
queríamos que todos los profesores pudieran seguir el claustro en directo. Por lo que
días antes nos pusimos a estudiar alternativas (por supuesto, usando software libre) y
os cuento los pasos que fuimos dando:

El protocolo RTMPPermalink
El primer artículo que encontramos fue: Create your own video streaming server with
Linux y nos encontramos la definición del protocolo que íbamos a usar para realizar el
streaming: el protocolo RTMP.

El protocolo RTMP (Real-Time Messaging Protocol) se usa para los servicios streaming,
trabaja sobre TCP (Transmission Control Protocol) y usa por defecto el puerto 1935.
Permite al cliente controlar la calidad de distribución de la transmisión y seguridad.

Para más información sobre este protocolo puedes leer el siguiente documento.

Además aprendimos que podíamos implementarlo usando un módulo del servidor web
nginx.

Configurando un servidor RTMP con nginxPermalink


Vamos a explicar los pasos para configurar nginx para que funcione como un servidor
RTMP. Para ello vamos a usar el sistema operativo Debian Buster donde tenemos
instalado un servidor nginx. Al ordenador en el que tenemos el servidor instalado vamos
a acceder con el nombre video.josedomingo.org.

Lo primero que vamos a hacer es instalar el módulo rtmp de nginx:

apt install libnginx-mod-rtmp


A continuación vamos a hacer una configuración mínima del servidor rtmp, para ello en
el fichero /etc/nginx/nginx.conf añadimos lo siguiente:

rtmp {
server {
listen 1935;
chunk_size 4096;

application live {
live on;
record off;
}
}
}
Reiniciamos el servidor:

systemctl restart nginx


Y ya podemos probarlo.

Transmitiendo vídeo con OBSPermalink


OBS, Open Broadcast Software es una aplicación libre y de código abierto para la
grabación y transmisión de vídeo por internet (streaming), mantenida por OBS Project.

Para configurar OBS para transmitir vídeo a nuestro servidor rtmp, vamos a la opción
Configuración -> Emisión, en Tipo de Emisión elegimos la opción Personalizar el servicio
de retransmisión e indicamos los siguientes datos:

URL: La URL de nuestro servidor rtmp, en nuestro caso sería


rtmp://video.josedomingo.org/live
Clave de retransmisión: Es una cadena de caracteres qe identifica la retransmisión y
que posteriormente usaremos para ver el streaming, en nuestro caso vamos a poner
test.
obs
Después de que configuremos el vídeo que queremos transmitir, ya podemos elegir la
opción Iniciar Transmisión en la pantalla principal.

Para comprobar que la transmisión se está haciendo de manera adecuada nos debe
aparecer una barra de estado, con un cuadro verde (recuerda: verde bueno, rojo malo):

obs

Usando VLC para ver el streamingPermalink


VLC es un reproductor multimedia libre y de código abierto multiplataforma y un
“framework” que reproduce la mayoría de archivos multimedia, muchos medios de
almacenamiento y diversos protocolos de transmisión.

Podemos configurar VLC para visualizar el streaming que estamos haciendo, para ello
nos vamos a la opción Medio -> Abrir ubicación de red… e indicamos la URL de la
retransmisión que estaría formada por la URL de nuestro servidor rtmp más la clave de
retransmisión que indicamos en OBS: rtmp://video.josedomingo.org/live/test:

vlc

Y en pocos segundos estaríamos viendo la retransmisión en directo:

vlc

Añadiendo más funcionalidad a nuestro servidor de streamingPermalink


Parece que nuestro servidor está funcionando de manera adecuada, pero nos
encontramos dos limitaciones:

Hemos hecho una configuración muy simple. Te puedo asegurar que podemos tener
muchas más funcionalidades en nuestro servidor rtmp. Efectivamente buscando por
internet llegué a la documentación oficial del módulo rtmp de nginx y te aseguro que hay
que echarle un buen rato. Nos vamos a quedar (nos hará falta posteriormente) con que
este módulo nos ofrece tres formatos para acceder al streaming: Stream Real-Time
Messaging Protocol (RTMP), Apple HTTP Live Streaming (HLS), y Dynamic Adaptive
Streaming over HTTP (DASH).

Hemos visualizado el streaming con VLC pero, ¿puedo tener un reproductor de vídeo
en una página web que me permita verlo?. He encontrado muchas librerías javascript
(luego hablaremos de ellas) que me permiten tener en mi página web un reproductor de
vídeo, pero los reproductores que eran capaz de ver vídeos desde rtmp (como hemos
hecho con VLC) necesitaban tener instalado en el navegador el plugin flash, no
funcionaban con HTML5.

Llegados a este punto y para solucionar estas dos limitaciones (tampoco he tenido
mucho tiempo para profundizar en la documentación de rtmp en nginx), me hice la
siguiente pregunta: ¿Existirá alguna imagen en docker hub que me ofrezca un servidor
rtmp configurado de forma adecuada?

Evidentemente la respuesta es que existen varios, finalmente elegí la imagen


alqutami/rtmp-hls (imagen en docker hub) que además de ofrecer un servidor
completamente configurado, nos ofrece un conjunto de páginas web con distintos
reproductores de vídeo que utilizan diferentes tecnologías para funcionar. Lo veremos
en el siguiente apartado:

Instalación de un servidor rtmp usando dockerPermalink


En nuestro servidor hemos desinstalado el servidor nginx, hemos instalado docker y
creamos un contenedor como nos indica la documentación de la imagen:

docker run -d -p 1935:1935 -p 8080:8080 --name rtmp alqutami/rtmp-hls


Como vemos el puerto 1935 para acceder al servidor rtmp y el puerto 8080 para acceder
a las páginas web que nos ofrece el servidor.

docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
112f5df28a19 alqutami/rtmp-hls "nginx -g 'daemon of…" 5 seconds ago Up 4
seconds 0.0.0.0:1935->1935/tcp, 0.0.0.0:8080->8080/tcp rtmp
Si queremos profundizar en los parámetros de configuración podemos ejecutar el
siguiente comando para visualizar el fichero de configuración:

docker exec rtmp cat /etc/nginx/nginx.conf


Para emitir con OBS y visualizar con VLC lo haríamos exactamente como lo hemos
estudiado anteriormente. Veamos lo nuevo que nos ofrece esta imagen:

Nuevos protocolos de streamingPermalink


Para solucionar la segunda limitación que indicamos anteriormente, este servidor esta
configurado para acceder al streaming usando dos nuevos protocolos:
HTTP Live Streaming (HLS):
Dynamic Adaptive Streaming over HTTP (DASH).
Estos protocolos de streaming están basados en HTTP y nos van a permitir tener
reproductores de vídeos basados en HTML5.

Para acceder al streaming usando HLS tendríamos que acceder a la siguiente URL:
http://<server ip>:8080/hls/<stream-key>.m3u8, donde indicaremos la ip o el nombre del
servidor y la clave de retransmisión.
Para acceder al streaming usando DASH tendríamos que acceder a la siguiente URL:
http://<server ip>:8080/dash/<stream-key>_src.mpd, donde, de la misma forma,
indicaremos la ip o el nombre del servidor y la clave de retransmisión.
Puedes probar desde VLC a reproducir desde una ubicación de red indicando estas
URLs:

http://video.josedomingo.org:8080/hls/test.m3u8
http://video.josedomingo.org:8080/dash/test_src.mpd
Reproductores de vídeos disponiblesPermalink
La imagen docker que estamos usando nos ofrece varias páginas web de demostración
con distintos reproductores de vídeo que funcionan con los distintos protocolos. Estás
páginas de demostración están configuradas para reproducir vídeos desde localhost y
usando la clave de reproducción test. Por lo tanto lo que vamos a hacer es copiarnos
los ficheros html a nuestro ordenador, modificar las páginas html a nuestra conveniencia
(usando nuestra URL y nuestra clave de reproducción) y volver a crear el contenedor
con un volumen para que tenga nuestras versiones de estos ficheros. Vamos a ello:

Lo primero que vamos a hacer es copiarnos en una carpeta que vamos a llamar players
los ficheros html a nuestro ordenador:

# docker cp rtmp:/usr/local/nginx/html/players players


# ls players
dash.html hls_hlsjs.html hls.html rtmp_hls.html rtmp.html
Tenemos 5 páginas de ejemplo, por lo tanto:

Si queremos ver contenido RTMP (requiere flash) accederemos a


http://video.josedomingo.org:8080/players/rtmp.html
Si queremos ver contenido HLS accederemos a
http://video.josedomingo.org:8080/players/hls.html
Si queremos ver contenido HLS usando la librería hls.js accederemos a
http://video.josedomingo.org:8080/players/hls_hlsjs.html
Si queremos ver contenido DASH accederemos a
http://video.josedomingo.org:8080/players/dash.html
Si queremos ver contenido rtmp y HLS en la misma página accederemos a
http://video.josedomingo.org:8080/players/rtmp_hls.html
Para que estas páginas funcionen de manera adecuada debemos modificarlas para
indicar nuestra URL y nuestra clave de retransmisión.

A continuación borramos el contenedor y lo volvemos a crear con un volumen para que


tenga nuestras versiones de estos ficheros:

# docker rm -f rtmp
# docker run -d -p 1935:1935 -p 8080:8080 -v /root/players:/usr/local/nginx/html/players
--name rtmp alqutami/rtmp-hls
Y podemos probar por ejemplo con la retransmisión hls:

rtmp

Para terminar algunas indicaciones:

Evidentemente las páginas webs proporcionadas son de demostración y nos pueden


servir de guías para añadir a nuestras páginas web los reproductores de vídeo de
nuestras retransmisiones.
Sería muy recomendable la configuración de un proxy inverso para no utilizar el puerto
8080 y configurar el acceso HTTPS.
ConclusionesPermalink
Sin haber profundizando mucho en el tema, la utilización de esta imagen docker nos
proporcionó la infraestructura necesaria para retransmitir el claustro final de mi instituto.

Para el próximo curso y basándonos en esta experiencia, queremos desarrollar un


sistema que permita de forma automática retransmitir las videoconferencias en jitsi de
los profesores para que los alumnos puedan acceder de forma más cómoda a las clases.

Ya os contaré la experiencia!!!

También podría gustarte