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