Montar punto de acceso wifi y servidor de streaming con raspberry pi 5

Hace unos días que me estoy poniendo con el mundillo de DJ. Ya este agosto de compré una controladora DJ Numark Mixtrack Platinum FX y ayer se reprodujo la primera sesión que he grabado de Ecstatic Dance en modalidad Silent Disco. Cuando empecé a juntar músicas y trastear con mi antigua Numark IDj2, ya contemplé la posibilidad de algún día llegar a hacer alguna sesión entre colegas y usar la modalidad Silent Disco.

Lo de Silent Disco mola mucho, ya que consiste en un emisor bluetooth al que le puedes conectar muchos auriculares, pero al ver los precios de estos sistemas me di automáticamente media vuelta. Meses mas tarde descubrí un grupo de Silent Disco en Barcelona en que lo que hacen es pasar la sesión en formato MP3, los asistentes la descargan y la reproducen con VLC en sus dispositivos. A la hora de empezar la sesión, cada uno inicia de forma manual la reproducción de la sesión, lo que hace que haya algunos segundos de diferencia entre lo que escucha un asistente de otro. Además los que llegan tarde, se les recomienda iniciar la sesión al minuto el cuál nos encontramos gracias a la funcionalidad de VLC de posicionar la pista en el tiempo indicado.

Ahora al estrenarme en un nuevo skill (DJ de Ecstatic Dance), que ya veremos hasta donde llego esta vez, han surgido la posibilidad de realizar sesiones nuevas en otros sitios y en uno de ellos les interesa la actividad, pero no podemos hacer mucho ruido y tiene que ser algo tranquilo. Una sesión de Ecstatic Dance sí, tiene algunos momentos tranquilos, pero otros… y además, con lo trancera que soy yo… pues… así que con esta alineación de los astros y también porque tenía pendiente un par de asuntos con la raspberri pi, esta noche, a altas horas de la madrugada finalmente me he hecho con un kit con una raspberri pi 5, con caja y el adaptador de tarjetas SSD en amazon (lo sé, no se debe comprar aquí, pero es muy cómodo y rápido) y justo a la hora que representaba que tenía que ponerme a comer, ha llamado a la puerta el repartidor con el paquete pedido horas antes. ¿Sabéis lo que ha ocurrido? Pues lo evidente, me he puesto con el cacharro en lugar de hacer lo que debería (la comida queda a la hora de la merienda, creo).

Tras la compra empecé a documentarme como realizar la instalación y ver qué posibilidades tenía para hacer lo que quería.

Instalación de raspberri pi + adaptador SSD

Básicamente me he basado en éste vídeo -> ASÍ he POTENCIADO mi Raspberry Pi 5! 🚀 | NVMe SSD M2 HAT. El motivo de usar una SSD es que hace años ya tuve una raspberri pi y a las pocas semanas de ponerla en funcionamiento la tarjeta SD simplemente moría y tenía que volver a empezar a hacerlo todo. Además el rendimiento sobre una SSD es mucho superior que el de una SD. Como todo esto está documentadísimo en Internet, no me centro con la instalación base. Simplemente menciono que te vas a la web de raspberri pi, te descargas el imager y cargas raspberry pi OS a la SD para después pasarla a la SSD tal como indica el vídeo.

Si que menciono como activar la SSD y pasar lo de la SD a la SSD.

En principio a mi ya me ha detectado el disco SSD pero igualmente voy a hacerlo. Antes se recomienda actualizar el sistema y al finalizar la configuración reiniciar.

laura@raspberrypi:~ $ sudo su

root@raspberrypi:/home/laura# lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
mmcblk0     179:0    0  59.5G  0 disk 
├─mmcblk0p1 179:1    0   512M  0 part /boot/firmware
└─mmcblk0p2 179:2    0    59G  0 part /
nvme0n1     259:0    0 465.8G  0 disk 

root@raspberrypi:/home/laura# fdisk -l
[...]
Disk /dev/nvme0n1: 465.76 GiB, 500107862016 bytes, 976773168 sectors
Disk model: KINGSTON SNV2S500G                      
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
[...]


root@raspberrypi:/home/laura# apt update; apt -y upgrade; apt -y dist-upgrade

root@raspberrypi:/home/laura# vi /boot/firmware/config.txt
[all]

dtparam=nvme
dtparam=pciex1_gen=3

root@raspberrypi:/home/laura# reboot

El reinicio no ha ido rápido, sino como el rayo!

Ahora lo siguiente será indicarle a raspberri pi os que arranque desde la SSD

root@raspberrypi:/home/laura# rpi-eeprom-config --edit
[all]
BOOT_UART=1
POWER_OFF_ON_HALT=0
BOOT_ORDER=0xf461
PCIE_PROBE=1

En mi caso el fichero ya estaba configurado así, en el vídeo el 6 que hace referencia a la SSD no estaba. Sí que he añadido la última línea.

Para copiar lo de la SD al SSD, podemos hacerlo de dos formas, o usando el imager desde el escritorio de la raspberri pi o usar el programa SD Copier que está en Accesorios del menú de aplicaciones.

Al finalizar reiniciamos, sacamos la tarjeta SD y comprobamos que el sistema arranca desde el disco SSD.

PUNTO DE ACCESO WIFI (RASPAP)
Inicialmente mi idea para montar el punto de acceso wifi era hacerlo a pelo con hostapd, pero me voy a atrever a instalar una herramienta de botón gordo, RaspAP basándome con éste vídeo.

root@raspberrypi:/home/laura# raspi-config
>> Localisation Options > WLAN Country > ES
>> Finish
root@raspberrypi:/home/laura# curl -sL https://install.raspap.com | bash

Como quiero ver todas las funcionalidades, le digo que Si a todo. Si quieres hacer una instalación sólo con lo que necesitas pues a leer un poco (pero no mucho) :)

Al reiniciar el sistema no me ha levantado el entorno gráfico, así que he tenido que instalar un paquete adicional, he reiniciado y entorno gráfico levantado!

root@raspberrypi:/home/laura# apt-get install raspberrypi-ui-mods

Para acceder al panel web de RaspAP, vamos por http a la ip de la raspberry pi y el usuario y contraseña son admin:secret (esto lo podemos cambiar en el panel web en “Authentication”.

Para configurar el AP vamos a hotspot, lo configuramos como deseamos. La configuración inicial está diseñada para que la parte del hotspot wifi sea una red a parte de la red cableada de la raspberrypi, teniendo su propio DHCP. Es importante dejarlo así para que todo el tráfico pase por la raspberrypi y se puedan usar todas las funcionalidades que tenemos ahí instaladas.

ANÁLISIS DE TRÁFICO (PI-HOLE)
Ya que estoy probando a saco cosillas, aprovecho para instalar PI-HOLE que me va a servir para otro proyecto, pero para lo específico para el tema inicial de este post, no es necesario instalar esta parte. Además quiero instalarlo para probar si es posible hacer funcionar los dos programas a la vez en una misma instalación y ver qué problemas me encuentro.

root@raspberrypi:/home/laura# curl -sSL https://install.pi-hole.net | bash

Aparecen problemas con dnsmasq, porque aparece una línea duplicada en la configuración, así que lo arreglamos y reniciamos dnsmasq

root@raspberrypi:/etc/dnsmasq.d# vi /etc/dnsmasq.d/090_raspap.conf +2
root@raspberrypi:/etc/dnsmasq.d# service dnsmasq restart
root@raspberrypi:/etc/dnsmasq.d# service dnsmasq status

También hay problemas de permisos que pihole no puede leer dnsmasq.leases

root@raspberrypi:/etc/dnsmasq.d# chown pihole:pihole /var/lib/misc/dnsmasq.leases

Y para acceder a la interfaz web tendremos que configurar de forma adecuada lighttpd para que puedan funcionar los dos servicios.

Y voy a probar que raspap sigue funcionando y pi-hole hace su trabajo.

Pues hasta aquí parece que todo funciona. Voy a seguir con la parte del servidor de streaming.

SERVIDOR DE STREAMING (ICECAST2)
Esta parte inicialmente estaba planteando de usar aplicaciones android para streamear el contenido de un móvil android a otros sin tener que usar un ordenador tipo raspberrypi. En resumen, hay varias opcines interesantes como Audiorelay, Astra streaming studio o incluso Soundseeder que es muy interesante, pero todos limitados por lo que quiero llegar a hacer: Vamos a montar nuestro propio servicio de streaming ¡RTMP vs RTSP!.

Buscando proyectos relacionados con raspberri pi he terminado encontrando proyectos tan interesantes como volumio. Pero hace exactamente lo contrario de lo que quiero hacer, pero lo menciono como proyecto realmente interesante.

Otra solución ha sido plantear el uso de obs-studio con el plugin obs-rtspserver, una opción muy interesante salvo la guerra que me ha dado que el plugin sólo funciona a partir de la versión 30 de obs y en debian stable estamos a la 29 y no hay forma de poner la 30 por cuestión de incompatibilidad de librerías. Como raspberry pi, no deja de ser una debian stable, de momento opción descartada pero muy a contemplar de cara al futuro cuando a mediados de 2025 salga debian 13 trixie.

Así que no queda otra que usar un programa antiquísimo, nuestro amor-odio icecast2.

root@raspberrypi:~# apt -y install icecast2
root@raspberrypi:~# netstat -lanp |grep 8000
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      4004/icecast2

Ahora tenemos que mandar el audio del escritorio a icecast2.

Para ello tenemos la opción ffmpeg (lacrimógeno), darkice (lacrimógeno también porqué no he conseguido capturar el audio y peta no sé porqué aún) y finalmente mpd/mpc (que lo acabo de descubrir gracias a este post y de momento me sirve de perlas por lo que quería hacer). Nota: comida a las 20h y tras el descanso la solución. Cuando te bloqueas tomarte un descanso es lo mejor!

TRANSMITIR AUDIO A ICECAST2 (MDP/MPC)

MPD: Music player daemon
MPC: command-line tool to interface MPD

Instalamos ambos programas

root@raspberrypi:~# apt -y install mpc mpd

Ahora vamos a modificar el fichero /etc/mpd.conf y en la sección donde está audio_output debajo añadimos esto:

root@raspberrypi:~# vi /etc/mpd.conf +372
audio_output {
  type            "shout"
  name            "RasPi MPD Stream"
  description     "MPD stream on Raspberry Pi"
  host            "localhost"
  port            "8000"
  mount           "/mpd"
  password        "ICECAST_SOURCE_PASSWORD"
  bitrate         "128"
  format          "44100:16:2"
  encoding        "mp3"
}

Importante porqué tenía la duda: en icecast no defines los puntos de stream, los puntos de stream se añaden con los streams que le lanzas. Almenos esta es a la conclusión a la que he llegado.

Una vez configurado el audio_output reiniciamos el servicio

root@raspberrypi:~# service mpd restart

Para ver las salidas que tengo configuradas ejecuto mpd outputs (en el output puedes ver dos salidas, la que acabo de configurar y otra que manda la salida del mpc al audio del escritorio, en este caso tengo la rpi conectada por hdmi al tv y se está reproduciendo el stream a icecast y en la tv)

root@raspberrypi:~# mpc outputs
Output 1 (RasPi MPD Stream) is enabled
Output 2 (My ALSA Device) is enabled

Si quiero deshabilitar o habilitar uno de los outputs voy a usar enable o disable. Paro el alsa y deja de sonar :)

root@raspberrypi:~# mpc disable 2
Output 1 (RasPi MPD Stream) is enabled
Output 2 (My ALSA Device) is disabled

Ahora vamos a iniciar el streaming con mpc contra icecast2. Para ello vamos a tener que realizar algunas comprobaciones. Si el usuario normal (no root) no está en el grupo audio, lo añadimos. En mi caso ya lo estaba. Y luego comprobamos los permisos de los dos directorios que hay al final:

$ groups
pi adm dialout cdrom sudo audio video plugdev games users input
If audio does not appear in this list, add it:

$ sudo usermod -a pi -G audio

Fix permissions:

$ sudo chmod g+w /var/lib/mpd/music/ /var/lib/mpd/playlists/
$ sudo chgrp audio /var/lib/mpd/music/ /var/lib/mpd/playlists/
root@raspberrypi:/var/lib/mpd# ls -lh
total 28K
drwxrwxr-x 2 root audio 4.0K Sep  8 20:41 music
drwxrwxr-x 2 mpd  audio 4.0K Apr  9  2023 playlists
-rw-r--r-- 1 mpd  audio  305 Sep  8 21:14 state
-rw-r--r-- 1 mpd  audio  12K Sep  8 20:38 sticker.sql
-rw-r--r-- 1 mpd  audio  443 Sep  8 20:41 tag_cache

Ahora las canciones que deseamos reproducir en el streaming deberemos guardarlas en /var/lib/mpd/music/ (es posible que de problemas de permisos, como opción tienes guardarlo a otro sitio y luego con un script como root mover las cosas a tu gusto, o arreglar los permisos según corresponda o cambiar en la configuración de mpd la ubicación de la música. No me voy a liar ahora).

laura@triptofan:~$ scp 2024_09-07-Laura_Mora_Aubert-Silent-P9-200.mp3 laura@192.168.1.74:/var/lib/mpd/music/

Ahora añadimos las canciones a la playlist

root@raspberrypi:/var/lib/mpd/music# mpc update
Laura Mora i Aubert - Blackhold - Sessió Ecstatic Dance - Silent Disco Poble Nou Barcelona #200 - 2024/09/07
[playing] #1/1  38:22/107:21 (35%)
Updating DB (#1) ...
volume: n/a   repeat: on    random: off   single: off   consume: off
root@raspberrypi:/var/lib/mpd/music# mpc ls |mpc add
root@raspberrypi:/var/lib/mpd/music# mpc playlist
Laura Mora i Aubert - Blackhold - Sessió Ecstatic Dance - Silent Disco Poble Nou Barcelona #200 - 2024/09/07

Con mpc pues lo que estamos haciendo es gestionar la cola de MPD. Usa mpc help para entender un poco más como funciona.

Activamos el repeat para que cuando termina la cola vuelva a reproducirla y le damos a play! y si queremos parar la reproducción, stop.

root@raspberrypi:/var/lib/mpd/music#  mpc repeat on
volume: 80%   repeat: on    random: off   single: off   consume: off

root@raspberrypi:/var/lib/mpd/music# mpc play
Laura Mora i Aubert - Blackhold - Sessió Ecstatic Dance - Silent Disco Poble Nou Barcelona #200 - 2024/09/07
[playing] #1/1   0:00/107:21 (0%)
volume: n/a   repeat: on    random: off   single: off   consume: off

root@raspberrypi:/var/lib/mpd/music# mpc stop
volume: n/a   repeat: on    random: off   single: off   consume: off

Al reproducir la cola de MPD se establece el mountpoint en icecast2, al parar la reproducción, desaparece.

Existen clientes gui para MPD, musicpd clients

Y hasta aquí lo que quería hacer :) me ha llevado unas cuantas horas pero finalmente lo he sacado. Ahora me queda pendiente como hacer streaming del audio del escritorio en la raspberry pi y/o de una entrada de audio, streaming de video y ver si puedo hacer uso de obs-studio para streamear directamente o usando icecast2. Todo esto para otro capítulo!

CONCLUSIÓN
Ahora lo que tendrán que hacer los asistentes a una silent disco es conectarse al AP de la raspberrypi con sus móviles y con VLC iniciar un stream contra la url del stream de icecast, en la configuración de este post:

http://ip-raspberry-pi:8000/mpd

Listos, tarde entretenida con el objetivo inicial cumplido! :)

Me dejo aquí este enlace como nota para realizar el stream a icecast2 con mixxx.

One Comment

  1. Pingback: Servidor RTSP + ffmpeg - Blackhold

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.