Objectif: capter localement la télévision TNT avec une Raspberry Pi munie d'un tuner DVB-T2 TV HAT et/ou de clés RTL-SDR.
Test avec 2 outils: dvblast et mumudvb.
Dans les répertoires conf/dvblast et conf/mumudvb se trouvent les configurations des multiplex TNT disponibles sur Paris avec une adresse de diffusion multicast pour chaque chaîne.
On va d'abord restreindre la plage d'ip multicast à la boucle locale pour ne pas innonder le réseau si les switchs ne sont pas optimisés pour le multicast (cf. IGMP Snooping).
ip route add 239.10.10.0/24 dev lo src 127.0.0.1Puis pour vérifier les routes des cartes réseau :
$ 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 loNote: la commande route fait parti du paquet net-tools sous Debian.
ou
$ 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.1Pour rendre cette règle persistante :
- sous
Debiancréer le fichier/etc/network/if-up.d/local-multicast(et le rendre exécutable) avec le contenu suivant :
#!/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- Sous
CentOS7créer un fichier/etc/sysconfig/network-scripts/route-loavec le contenu suivant :
239.10.10.0/24 via 127.0.0.1 dev lopuis redémarrer le service réseau
systemctl restart networkdvblast a pour rôle de demultiplexer le signal de la carte tuner, et diffuser un flux ip sur le réseau, en rtp par défaut.
Installation
apt install dvblastVérification
$ dvblast --version
DVBlast 3.4 (release)mumudvb est une évolution de dvblast
Installation
apt install mumudvbAjouter le nouvel utilisateur _mumudvb aux groupes video et plugdev
usermod -a -G video _mumudvb
usermod -a -G plugdev _mumudvbudp par défaut. pour rtp utiliser rtp_header à 1 dans la configuration.
ffmpeg est le couteau suisse de l'audiovisuel. Il permet transcodage, analyse, génération de fichiers media. On l'utilisera pour lire un flux rtp/udp et l'afficher directement sur la sortie standard. En mode passe plat.
Installation
apt install ffmpegVérification
$ ffmpeg 2>&1 | head -1
ffmpeg version 4.3.4-0+deb11u1+rpt3 Copyright (c) 2000-2021 the FFmpeg developersDans le répertoire systemd sont fournis 2 fichiers de services. Copions les au bon endroit :
cp systemd/[email protected] /etc/systemd/system
cp systemd/[email protected] /etc/systemd/system
systemctl daemon-reloadNote: le chemin des apps et des logs peut être à adapter.
Pour commencer le stream d'un multiplex, utiliser l'une des commandes exemples suivantes :
systemctl start mumudvb@0_r1
systemctl enable --now dvblast@1_r15le paramètre est de la forme CARD_MUX :
CARDl'identifiant de la carte (0 ... 7)MUXl'identifiant du multiplex (r1 ... r15)
Lien: Documentation sur Systemd
On peut contrôler qu'un multiplex est bien streamé sur la boucle locale avec 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 ESTABLISHEDNote: avec mumudvb il n'y a pas le même résultat du netstat ...
D'autre part, l'outil iptraf permet d'avoir une vue d'ensemble du trafic réseau dans une interface texte.
apt install iptrafavec ffmpeg
ffmpeg -i rtp://239.10.10.2:1234 -c copy -map 0 rec.tsou encore mieux avec multicat (dépendance bitstream, se compile facilement)
multicat -X @239.10.10.2:1234 /dev/null 2>/dev/null > rec.tsDescription des paramètres :
-X: on demande à ce que le flux ts passe par la sortie standard@239.10.10.2:1234: on précise le groupe multicast auquel on veut s'abonner/dev/null: on ne veut pas d'écriture du flux sur disque2>/dev/null: on cache la sortie d'erreur-uà ajouter si le flux estudp"brut" et pasrtp> rec.ts: on redirige le flux vers un fichier
Dans le cas d'un réseau non compatible multicast et pour éviter le flood, il peut être intéressant de convertir le flux multicast en unicast. Attention cependant à la volumétrie réseau si beaucoup de clients de connectent sur la source.
Installation de udpxy
git clone https://github.com/pcherenkov/udpxy
cd udpxy/chipmunk
make
sudo make installLancement manuel du service :
sudo udpxy -p 80 -c 8Le service tournera sur le port 80 (-p) , avec un maximum de 8 clients (-c).
Lancement via systemd :
Voici également un fichier de service systemd pour udpxy.
cp conf/systemd/udpxy.service /etc/systemd/system
systemctl daemon-reload
sudo systemctl enable --now udpxyVérification que le service tourne :
$ netstat -an| grep ":80"
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTENMaintenant, sur notre réseau local on va pouvoir demander, en unicast et en tcp, via le protocole http, une requête de ce genre :
vlc http://dvbstream/rtp/239.10.10.2:1234dvbstreamétant l'ip/le host de la machine faisant tournerudpxy/rtp/ou/udp/suivant le procole de stream utilisé par la source239.10.10.2:1234l'ip et le port du groupe multicast source
Voici la playlist.m3u complète de toute les chaînes déclarées dans ce projet (ensemble des multiplex TNT parisiens).
Exemple de mosaïque muette avec positionnement des fenêtes en 2x2 sur un écran 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 &- mux r1 (hat)
- 24.8 Mb/s : https://www.digitalbitrate.com/dtv.php?mux=r1,idf&liste=1&live=1
sudo systemctl enable --now dvblast@0_r1
- mux r2 (sdr)
- 24.8 Mb/s : https://www.digitalbitrate.com/dtv.php?mux=r2&liste=1&live=1
sudo systemctl enable --now dvblast@1_r2
- mux r3 (sdr)
- 24.8 Mb/s : https://www.digitalbitrate.com/dtv.php?mux=r3&liste=1&live=1
sudo systemctl enable --now dvblast@2_r3
Total : 74.4 Mb/s
- mux r4 (hat)
- 24.8 Mb/s : https://www.digitalbitrate.com/dtv.php?mux=r4&liste=1&live=1
sudo systemctl enable --now dvblast@0_r4
- mux r6 (sdr)
- 24.8 Mb/s : https://www.digitalbitrate.com/dtv.php?mux=r6&liste=1&live=1
sudo systemctl enable --now dvblast@1_r6
- mux r7 (sdr)
- 24.8 Mb/s : https://www.digitalbitrate.com/dtv.php?mux=r7&liste=1&live=1
sudo systemctl enable --now dvblast@2_r7
Total : 74.4 Mb/s
- mux r9 (hat)
- 34 Mb/s : https://www.digitalbitrate.com/dtv.php?mux=r9&liste=1&live=1
sudo systemctl enable --now dvblast@0_r9
- mux r15 (sdr)
- 16 Mb/s : https://www.digitalbitrate.com/dtv.php?mux=r15&liste=1&live=1
sudo systemctl enable --now dvblast@0_r15
Total : 50 Mb/s
Le répertoire /dev/dvb doit au moins contenir 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 adapter2Visualisation de 2 clés RTL-SDR branchées en 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