Objetivo: recibir televisión TDT en local con una Raspberry Pi equipada con un sintonizador TV HAT DVB-T2 y/o teclas RTL-SDR.
Prueba con 2 herramientas: dvblast
y mumudvb
.
En los directorios conf/dvblast
y conf/mumudvb
se encuentran las configuraciones de los múltiplex TDT disponibles en París con una dirección de emisión multicast para cada canal.
Primero restringiremos el rango de IP de multidifusión al bucle local para no inundar la red si los conmutadores no están optimizados para multidifusión (consulte IGMP Snooping).
ip route add 239.10.10.0/24 dev lo src 127.0.0.1
Luego para verificar las rutas de la tarjeta de red:
$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default lan.home 0.0.0.0 UG 202 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 202 0 0 eth0
239.10.10.0 0.0.0.0 255.255.255.0 U 0 0 0 lo
Nota: el comando route
es parte del paquete net-tools
en Debian
.
O
$ ip route show
default via 192.168.1.1 dev eth0 src 192.168.1.74 metric 202
192.168.1.0/24 dev eth0 proto dhcp scope link src 192.168.1.74 metric 202
239.10.10.0/24 dev lo scope link src 127.0.0.1
Para que esta regla sea persistente:
Debian
cree el archivo /etc/network/if-up.d/local-multicast
(y hágalo ejecutable) con el siguiente contenido: #! /bin/sh
# à mettre dans /etc/network/if-up.d/local-multicast (rendre exécutable)
# le multicast ne sort pas de la boucle locale pour éviter de flooder le réseau
if [ " $IFACE " = " lo " ] ; then
ip route add 239.10.10.0/24 dev lo src 127.0.0.1
fi
CentOS7
cree un archivo /etc/sysconfig/network-scripts/route-lo
con el siguiente contenido: 239.10.10.0/24 via 127.0.0.1 dev lo
luego reinicie el servicio de red
systemctl restart network
La función de dvblast
es demultiplexar la señal de la tarjeta sintonizadora y transmitir una secuencia IP en la red, en rtp
de forma predeterminada.
Instalación
apt install dvblast
Verificación
$ dvblast --version
DVBlast 3.4 (release)
mumudvb
es una evolución de dvblast
Instalación
apt install mumudvb
Agregue el nuevo usuario _mumudvb
a los grupos video
y plugdev
usermod -a -G video _mumudvb
usermod -a -G plugdev _mumudvb
udp
de forma predeterminada. para rtp
use rtp_header
a 1
en la configuración.
ffmpeg
es la navaja suiza del audiovisual. Permite transcodificación, análisis, generación de archivos multimedia. Lo usaremos para leer una secuencia rtp/udp y mostrarla directamente en la salida estándar. En modo pase plano.
Instalación
apt install ffmpeg
Verificación
$ ffmpeg 2>&1 | head -1
ffmpeg version 4.3.4-0+deb11u1+rpt3 Copyright (c) 2000-2021 the FFmpeg developers
En el directorio systemd
, se proporcionan 2 archivos de servicio. Copiémoslos en el lugar correcto:
cp systemd/[email protected] /etc/systemd/system
cp systemd/[email protected] /etc/systemd/system
systemctl daemon-reload
Nota: es posible que sea necesario adaptar la ruta de las aplicaciones y los registros.
Para comenzar a transmitir un multiplex, use uno de los siguientes comandos de ejemplo:
systemctl start mumudvb@0_r1
systemctl enable --now dvblast@1_r15
el parámetro tiene el formato CARD_MUX
:
CARD
el identificador de la tarjeta (0 ... 7)MUX
el identificador multiplex (r1 ... r15)Enlace: Documentación de Systemd
Podemos comprobar que un multiplex se transmite en el bucle local con netstat
:
$ netstat -nu
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 127.0.0.1:41809 239.10.10.14:1234 ESTABLISHED
udp 0 0 127.0.0.1:52565 239.10.10.3:1234 ESTABLISHED
udp 0 0 127.0.0.1:39327 239.10.10.2:1234 ESTABLISHED
udp 0 0 127.0.0.1:45600 239.10.10.27:1234 ESTABLISHED
udp 0 0 127.0.0.1:37410 239.10.10.30:1234 ESTABLISHED
Nota: con mumudvb
no hay el mismo resultado de netstat...
Por otro lado, la herramienta iptraf
permite tener una visión general del tráfico de la red en una interfaz de texto.
apt install iptraf
con ffmpeg
ffmpeg -i rtp://239.10.10.2:1234 -c copy -map 0 rec.ts
o incluso mejor con multicat
(dependencia bitstream
, se compila fácilmente)
multicat -X @239.10.10.2:1234 /dev/null 2> /dev/null > rec.ts
Descripción de parámetros:
-X
: pedimos que el flujo ts pase por la salida estándar@239.10.10.2:1234
: especifica el grupo de multidifusión al que deseas suscribirte/dev/null
: no queremos que la secuencia se escriba en el disco2>/dev/null
: ocultamos la salida del error-u
para agregar si la transmisión es udp
"sin procesar" y no rtp
> rec.ts
: redireccionamos el flujo a un archivo En el caso de una red no compatible con multicast y para evitar inundaciones, puede ser interesante convertir el flujo multicast en unicast. Sin embargo, preste atención al volumen de la red si muchos clientes se conectan a la fuente.
Instalación udpxy
git clone https://github.com/pcherenkov/udpxy
cd udpxy/chipmunk
make
sudo make install
Lanzamiento manual del servicio:
sudo udpxy -p 80 -c 8
El servicio se ejecutará en el puerto 80 ( -p
), con un máximo de 8 clientes ( -c
).
Iniciar a través de systemd
:
También aquí hay un archivo de servicio systemd para udpxy.
cp conf/systemd/udpxy.service /etc/systemd/system
systemctl daemon-reload
sudo systemctl enable --now udpxy
Comprobando que el servicio se está ejecutando:
$ netstat -an | grep " :80 "
tcp 0 0 0.0.0.0:80 0.0.0.0: * LISTEN
Ahora, en nuestra red local podremos solicitar, en unicast y TCP, mediante el protocolo http, una petición como esta:
vlc http://dvbstream/rtp/239.10.10.2:1234
dvbstream
es la ip/host de la máquina que ejecuta udpxy
/rtp/
o /udp/
dependiendo del protocolo de transmisión utilizado por la fuente239.10.10.2:1234
la ip y el puerto del grupo de multidifusión de origenAquí está la lista de reproducción completa.m3u de todos los canales declarados en este proyecto (todos los multicines TNT parisinos).
Ejemplo de mosaico silencioso con posicionamiento de ventana 2x2 en una pantalla de 1920x1080:
mpv http://dvbstream/rtp/239.10.10.2:1234 --mute=yes --no-border --geometry=960x540+0+0 --deinterlace=yes &
mpv http://dvbstream/rtp/239.10.10.27:1234 --mute=yes --no-border --geometry=960x540+960+0 --deinterlace=yes &
mpv http://dvbstream/rtp/239.10.10.10:1234 --mute=yes --no-border --geometry=960x540+0+540 --deinterlace=yes &
mpv http://dvbstream/rtp/239.10.10.11:1234 --mute=yes --no-border --geometry=960x540+960+540 --deinterlace=yes &
sudo systemctl enable --now dvblast@0_r1
sudo systemctl enable --now dvblast@1_r2
sudo systemctl enable --now dvblast@2_r3
Total: 74,4 MB/s
sudo systemctl enable --now dvblast@0_r4
sudo systemctl enable --now dvblast@1_r6
sudo systemctl enable --now dvblast@2_r7
Total: 74,4 MB/s
sudo systemctl enable --now dvblast@0_r9
sudo systemctl enable --now dvblast@0_r15
Total: 50 MB/s
El directorio /dev/dvb
debe contener al menos un adapter
:
$ ll /dev/dvb/
total 0
drwxr-xr-x 2 root root 120 Mar 8 22:41 adapter0
drwxr-xr-x 2 root root 120 Mar 8 22:41 adapter1
drwxr-xr-x 2 root root 100 Mar 8 22:41 adapter2
Visualización de 2 llaves RTL-SDR conectadas vía USB:
$ lsusb | grep RTL
Bus 001 Device 004: ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 DVB-T
Bus 001 Device 005: ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 DVB-T