Hacer streaming de vídeo usando software libre
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 RTMP
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 nginx
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 OBS
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
.
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):
Usando VLC para ver el streaming
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
:
Y en pocos segundos estaríamos viendo la retransmisión en directo:
Añadiendo más funcionalidad a nuestro servidor de streaming
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 docker
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 streaming
Para solucionar la segunda limitación que indicamos anteriormente, este servidor esta configurado para acceder al streaming usando dos nuevos protocolos:
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 disponibles
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:
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.
Conclusiones
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!!!
Comments
carloslinux
Hola José Domingo, he seguido todos los pasos y cuando pongo la url en el navegador, me descarga un archivo mpd
José Domingo Muñoz
Hola,
No se lo que puede estar pasando. Repasa la configuración del servidor web y prueba con varios clientes web. A ver si encuentras el fallo.
Un saludo
carloslinux
Gracias por las respuesta, creo que el problema es que la conexión tiene que ser segura "https"
Stephen Villarroel Villarroel
Gracias por tus conocimientos , agradezco tu paciencia por instruirnos .
Gabriel Tlaxcalteco
Hola José, es normal que haya un retraso en la transmisión de 60 segundos aproximadamente o hay que hacer ajustes en algun lugar para que sea menor el tiempo de retraso.
José Domingo Muñoz
Hola Gabriel,
Me parece mucho tiempo de retraso, las prueba que yo he hecho no me han dado tanto retardo.
Un saludo
Rubén
Hola José Domingo,
Estamos intentando montar un sistema similar para retransmitir varias cámaras IP. Tenemos todo corriendo con el docker, pero viendo el consumo con sólo tres cámaras nos está asustando un poco. Estamos con un Celeron dual core y 4GB de RAM, pero nuestro objetivo es pasar 60 cámaras por aquí, pero vemos que ni con el nginx.conf de ejemplo sin transcoding baja el consumo del contenedor. ¿Tienes alguna referencia del hardware a usar?
José Domingo Muñoz
Hola Rubén, Lo siento, no puedo ayudarte. No he seguido profundizando en el tema, y sólo hice algunas pruebas con una sola cámara.
Un saludo
kevin
Hola José que línea debo modificar en los archivos de player?
José Domingo Muñoz
Hola Kevin
Los archivos en el directorio players están escritos en html. Simplemente lo que comento es que puedes modificar el html para añadirle alguna información en concreto o cambiar el estilo de la página.
Un saludo
Guille
Hola José!. He seguido todos los pasos y me encuentro con el docker instalado y funcionando. Retransmito con OBS y soy capaz de verlo a través de VLC en mi propio PC, pero no desde otro PC. Los PC’s están conectados a la misma subred y hacen ping entre ellos, pero no soy capaz de ver el vídeo desde el segundo PC. ¿Alguna idea de que puede ser?. Los puertos 1935 y 8080 los tengo abiertos.
José Domingo Muñoz
Hola Gille
No se si lo estás haciendo bien, te recuerdo que tienes que acceder desde el segundo PC a la dirección IP del primer PC. Si eso lo estás haciendo bien, no se que podría estar fallando.
Un saludo
Gerardo Ferraro
buenas esta configuración funcionaría para una página web alojada en un hosting?? o funciona solo en intranet?
José Domingo Muñoz
Hola Gerardo, Si en el servidor remoto / hosting puedes instalar docker no creo que tengas problemas. Un saludo
Leave a Comment
Your email address will not be published. Required fields are marked *