Tutorial MediaMTX. Instala tu propio Medía Server y utilízalo en Home Assistant

En el vertiginoso mundo digital, la innovación para simplificar y unificar se agradece.

MediaMTX se puede entender como una herramienta de posibilidades ilimitadas. Únete a nosotros mientras desentrañamos los secretos detrás de MediaMTX y exploramos cómo esta herramienta puede convertirse en nuestro servidor de medios definitivo.

Qué es un Medía Server

Quizás os suene en nombre de algunos protocolos de transmisión nos sean familiares (RTSP – Real Time Streaming Protocol, WebRTC,etc). Se utilizan para servicios de transmisión en tiempo real a través de Internet (o de intranet).

Si por ejemplo tenemos varias cámaras en casa, es muy posible que cada una de ellas sirva el vídeo en un protocolo diferente.

Un Media Server es un software que nos va a ayudar a unificar todas estas distintas fuentes y mucho más. Cada cliente que quiera obtener un vídeo o una imagen podrá acceder a la misma a través del media server.

¿Porqué utilizar MediaMTX como Media Server?

Utilizaremos un software llamado MediaMTX (conocido anteriormente como rtsp-simple-server ). Apenas ocupa 14 Mb, pero es muy potente.

Para que nos hagamos una idea de su funcionalidad, no es fácil definir qué hace. Quizás la mejor definición sea la de un software que conecta fuentes multimedia con consumidores multimedia. Y pongo unos ejemplos para aclarar:

  • Podemos por ejemplo enviar a MediaMTX la imagen y el audio recogido por una cámara IP (o varias) que existan en nuestra red local, o incluso en alguna localización accesible desde internet.
  • Además podremos configurar la grabación de estas fuentes en un disco duro local o remoto.
  • Los clientes (yo mirando desde un navegador, o un sistema domótico que quiera mostrar la fuente, o cualquier cosa que precise los datos) puede conectarse al servidor MediaMTX que además ocultará el origen de las fuentes actuando así como un proxy.
  • Podríamos incluso balancear la carga automáticamente entre varios servisores MediaMTX.
  • Totalmente configurable (protocolos, resoluciones, etc, etc, etc…)
  • Y por si fuera poco, podremos grabar las fuentes en disco duro para tener todo un sistema de videovigilancia profesional si nos apetece.

Como podemos ver, es uno de esos programas que tienen casi infinitos usos, por lo que necesariamente tenemos que elegir algún ejemplo concreto para hacer este tutorial.

Instalación de MediaMTX

Lo primero que tendremos que hacer es descargar los archivos necesarios desde https://github.com/bluenviron/mediamtx/releases

Tan solo ocupa 14,5 MB, sin dependencias. Es increíble que se pueda programar tanto en tan poco sitio.

Desde este sitio oficial, descargaremos nuestra versión (deberéis elegir en vuestro caso la que corresponda). En nuestro caso estamos utilizando una máquina NUC con linux (Ubuntu):

Al descomprimir el fichero, veremos que tan solo hay 3 archivos: La licencia, el binario y el fichero de configuración.

Movemos tanto el fichero binario ( mediamtx ) como el de configuración ( mediamtx.yml ) a sus respectivas carpetas definitivas:

sudo mv mediamtx /usr/local/bin/ 
sudo mv mediamtx.yml /usr/local/etc/

Configuramos MediaMTX para correr como un servicio, creando el fichero /etc/systemd/system/mediamtx.service con el siguiente contenido:

[Unit]
Wants=network.target
[Service]
ExecStart=/usr/local/bin/mediamtx /usr/local/etc/mediamtx.yml
[Install]
WantedBy=multi-user.target

Habilitamos el servicio recien definido:

sudo systemctl daemon-reload
sudo systemctl enable mediamtx 


Si todo ha ido bien, nos mostrará el siguiente mensaje:

Created symlink /etc/systemd/system/multi-user.target.wants/mediamtx.service → /etc/systemd/system/mediamtx.service.

Por último arrancamos el servicio:

sudo systemctl start mediamtx

Para verificar, con el comando systemctl comprobamos que efectivamente entre otros tantos, el servicio mediamtx.service está corriendo:


irqbalance.service >
kerneloops.service >
keyboard-setup.service >
kmod-static-nodes.service >
mariadb.service >
mediamtx.service >
ModemManager.service >
networkd-dispatcher.service >
NetworkManager-wait-online.service >

Para ver si está funcionando correctamente el media server, haremos una prueba de publicación con un fichero de vídeo de ejemplo público que renombramos a dwsample_ts_1080p.ts para evitar espacios en el nombre, y que hemos bajado de https://www.dwsamplefiles.com/?dl_id=396

Dicho vídeo tiene una pista de video 0:0 (mpeg) y otra pista de audio 0:1 (aac).
Ejecutaremos el siguiente comando usando ffmpeg para publicar en el server

ffmpeg -re -stream_loop -1 -i dwsample_ts_1080p.ts -map 0:0 -c copy -f rtsp rtsp://localhost:8554/mystream

La respuesta debe ser la siguiente en un loop infinito:

Ya tenemos publicado nuestro stream en el server de MediaMTX.

Para ver si funciona al servirlo, podemos utilizar por ejemplo VLC (si lo tenemos instalado) como cliente, con el siguiente comando:

vlc --network-caching=50 rtsp://localhost:8554/mystream

Y este será el resultado si hemos seguido bien los pasos:

Integración en Home Assistant

Una vez que tenemos un servidor dispuesto a dar vídeo a quien lo requiera, una opción fácil es integrar esas fuentes en Home Assistant.

En nuestro caso, hemos instalado MediaMTX en una máquina Linux independiente de la Raspberry Pi (donde corre Home Assistant).

Es una configuración que os recomendamos, pues independizamos servicios. Por tanto, debemos tener la precaución de cambiar localhost por la IP donde reside el servicio MediaMTX en los enlaces que usemos.

Lo hemos visto en otro post, pero en términos generales, incluiremos una Cámara Genérica (Generic Camera):

Y lo pondremos en una tarjeta Frigate Card, por ejemplo:

Grabaciones en disco

Todas las fuentes que publiquemos en nuestro servidor Media MTX podremos grabarlas a disco.

Para ello lo único que debemos modificar es en el fichero /usr/local/etc/mediamtx.yml, buscar la sección correspondiente y cambiar el «record: no» por un «record: yes». No es necesario reiniciar el servicio. El resto de parámetros son fácilmente entendibles:

  ###############################################
  # Default path settings -> Recording

  # Record streams to disk.
  record: no
  # Path of recording segments.
  # Extension is added automatically.
  # Available variables are %path (path name), %Y %m %d %H %M %S %f %s (time in strftime format)
  recordPath: ./recordings/%path/%Y-%m-%d_%H-%M-%S-%f
  # Format of recorded segments.
  # Available formats are "fmp4" (fragmented MP4) and "mpegts" (MPEG-TS).
  recordFormat: fmp4
  # fMP4 segments are concatenation of small MP4 files (parts), each with this duration.
  # MPEG-TS segments are concatenation of 188-bytes packets, flushed to disk with this period.
  # When a system failure occurs, the last part gets lost.
  # Therefore, the part duration is equal to the RPO (recovery point objective).
  recordPartDuration: 100ms
  # Minimum duration of each segment.
  recordSegmentDuration: 1h
  # Delete segments after this timespan.
  # Set to 0s to disable automatic deletion.
  recordDeleteAfter: 24h

Las grabaciones quedarán en la carpeta recordings por defecto:

Como hemos visto en el ejemplo, integrar fuentes de video en un server común y accesible a todos los clientes no es tan complicado. Cualquier cámara de vigilancia, fotografías, capturas de pantalla, etc… las posibilidades son muchas y sólo hemos pretendido dar un ejemplo simple.

Ahora os toca a vosotros experimentas.

Si os ha gustado el post, como siempre os ofrecemos un listado de algunos otros para seguir leyendo: