Servidor RTSP + ffmpeg

Seguimos con lo del proyecto de fin de semana de montar un punto de acceso wifi con un servidor de streaming.
En el post mencionada mostraba como usar icecast2 como servidor de streaming, pero al empezar a conectar dispositivos me he encontrado con una cosa un tanto molesta, que la sincronización era malísima. Icecast2 funciona sobre el protocolo http y no era lo que quería hacer exactamente, sino hacerlo sobre RTSP. Así que en este post veremos como configurar un servidor RTSP y enviaremos el stream de MPD al servidor de streaming RTSP.

Lo primero será descargar el servidor y lo ejecutamos:

root@raspberrypi:~# mkdir mediamtx
root@raspberrypi:~# cd mediamtx
root@raspberrypi:~# wget https://github.com/bluenviron/mediamtx/releases/download/v1.9.0/mediamtx_v1.9.0_linux_armv7.tar.gz
root@raspberrypi:~# tar xvzf mediamtx_v1.9.0_linux_armv7.tar.gz
root@raspberrypi:~# ./mediamtx

Para hacer pruebas de como hacer el stream de un fichero mp3 he usado inicialmente gstreamer (que me ha llevado un buen rato para hacerlo funcionar)

root@raspberrypi:~# apt-get install gstreamer1.0-rtsp gstreamer1.0-tools

root@raspberrypi:~# gst-launch-1.0 filesrc location=/home/laura/Desktop/2024_09-07-Laura_Mora_Aubert-Silent-P9-200.mp3 ! decodebin ! audioresample ! audioconvert ! opusenc ! audio/x-opus, mapping=stream1 ! rtspclientsink location=rtsp://localhost:8554/test 

root@raspberrypi:~# gst-launch-1.0 filesrc location=/home/laura/Desktop/2024_09-07-Laura_Mora_Aubert-Silent-P9-200.mp3 ! decodebin ! audioresample ! audioconvert ! voaacenc ! audio/mpeg, mapping=/stream1 ! rtspclientsink location=rtsp://localhost:8554/test 

Me he encontrado algunos problemas con el códec que necesitaba, pero esta página me ha ayudado.

the stream doesn't contain any supported codec, which are currently H265, H264, Opus, MPEG-4 Audio

Finalmente en MPD modificamos el fichero /etc/mpd.conf y añadimos un nuevo audio_output

root@raspberrypi:~# vi /etc/mpd.conf
audio_output {
     name            "pipe to ffmpeg"
     type            "pipe"
     enabled         "yes"
     format          "48000:16:2"
     command         "ffmpeg -loglevel error -hide_banner -y -f s16le -ar 48000 -ac 2 -vn -i - -c libopus -f rtsp rtsp://localhost:8554/test"
}

He intentado añadir gstreamer como pipe de audio, pero no lo he conseguido hacer funcionar. He encontrado este ejemplo aquí que me ha funcionado y así lo dejo.

Ahora para escuchar el stream, podemos hacerlo de dos formas, por http o por rtsp:

HTTP: http://IP-RASPBERRY-PI:8888/test/

RTSP: rtsp://IP-RASPBERRY-PI:8554/test

El juguete funciona pero no tan bien como me gustaría. Por ejemplo con el VLC del escritorio no lee el rtsp, pero el del móvil sí. Necesitaré mas móviles para seguir haciendo pruebas.

Para que no tengamos que iniciar el servidor de streaming cada vez a mano:

root@raspberrypi:~/mediamtx# mv mediamtx /usr/local/bin/
root@raspberrypi:~/mediamtx# mv mediamtx.yml /etc/

root@raspberrypi:~/mediamtx# vi /etc/systemd/system/mediamtx.service
[Unit]
Wants=network.target
[Service]
ExecStart=/usr/local/bin/mediamtx /etc/mediamtx.yml
[Install]
WantedBy=multi-user.target


root@raspberrypi:~/mediamtx# systemctl daemon-reload
root@raspberrypi:~/mediamtx# systemctl enable mediamtx 
root@raspberrypi:~/mediamtx# systemctl start mediamtx


root@raspberrypi:~/mediamtx# netstat -lanp |grep mediamtx |grep 'LISTEN '
tcp6       0      0 :::1935                 :::*                    LISTEN      11836/./mediamtx    
tcp6       0      0 :::8554                 :::*                    LISTEN      11836/./mediamtx    
tcp6       0      0 :::8889                 :::*                    LISTEN      11836/./mediamtx    
tcp6       0      0 :::8888                 :::*                    LISTEN      11836/./mediamtx    

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *

Aquest lloc utilitza Akismet per reduir els comentaris brossa. Apreneu com es processen les dades dels comentaris.