Christophe Nowicki

July 12, 2009

Diffuser des flux TV sur réseau local avec MuMuDVB

Je viens d’ajouter la diffusion des flux TV à mon installation domotique.
L’objectif est de pouvoir visionner la télévision sur l’ensemble des équipements de la maison.
Pour cela, j’ai mis en place un serveur de diffusion.
Celui-ci distribue la vidéo en Multicast à l’aide du programme MuMuDVB.

Préambule

Je sens qu’après la lecture de la courte description, vous allez me dire :

“Mais tu ne connais pas le multiposte chez Free???”.

Évidemment, je connais le service de Free, mais mon objectif est de fournir le même type de service pour contourner les limitations de l’existant :

  • la limitation à deux postes (et encore si vous avez un bon débit) ;
  • l’empiètement sur la bande passante des autres services ;
  • l’absence de chaînes culturelles^W comme TF1 et M6.

Matériel nécessaire

Vous avez besoin :

  • d’un poste client avec vlc ou mplayer ;
  • d’un serveur de diffusion (sous Debian GNU/Linux de préférence ;-) ) avec MuMuDVB ;
  • d’un réseau local ;
  • d’une carte tuner TV numérique (DVB-T, DVB-S, DVB-C) ;

Pour ma part, j’ai pris une carte tuner Hauppauge WinTV NOVA T-500 chez Materiel.net.

Les limitations en fonction de la technologie de diffusion

Vous avez le choix parmi les technologies de réceptions suivantes :

  • DVB-T (Télévision numérique terrestre ou TNT) ;
  • DVB-S (Satellite) ;
  • DVB-C (Câble).

Les émetteurs diffusent plusieurs chaînes sur une fréquence (4 à 6).
Un tuner DVB, ne peut capter qu’une seule fréquence, cela veut donc dire qu’avec ma carte Hauppauge WinTV NOVA T-500, je peux diffuser au maximum 8 à 12 chaînes.
Il faut donc ajouter d’autres cartes / tuner en fonction du nombre de chaînes que vous voulez diffuser.

Installation de mumudvb

Pour les versions “sid” et “squeeze” de Debian, le paquet est directement disponible via apt.
Pour la version stable, vous pouvez télécharger le paquet sur le site du projet ou “back-porter” la version sid/squeeze.

Installation de la carte tuner DVB-T

Ma carte est reconnue sans problème, il faut simplement télécharger le firmware, le copier dans le répertoire /lib/firmware et charger le module dvb_usb_dib0700.
Vous devez ensuite avoir les différents tuner dans le répertoire : /dev/dvb
$ ls /dev/dvb
adapter0 adapter1

Recherche des fréquences

Pour trouver les fréquences des chaînes de télévision, il faut installer le paquet dvb-apps.
Celui-ci contient les fréquences des différents transpondeurs dans le répertoire /usr/share/dvb.
Dans le cas de mon émetteur, je trouve les informations dans le fichier : /usr/share/dvb/dvb-t/fr-Paris :
# Paris - France - various DVB-T transmitters
# contributed by Alexis de Lattre
# Paris - Tour Eiffel : 21 24 27 29 32 35
# Paris Est - Chennevières : 35 51 54 57 60 63
# Paris Nord - Sannois : 35 51 54 57 60 63
# Paris Sud - Villebon : 35 51 56 57 60 63
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
T 474166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
T 498166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE
T 522166000 8MHz 2/3 NONE QAM64 8k 1/32 NONE

Configuration de MumuDVB

Pour la configuration de MumuDVB, nous allons nous créer un répertoire spécial /etc/mumudvb et faire un fichier de configuration par carte.
Voici le contenu de mon fichier /etc/mumudvb/card0.conf :

autoconfiguration=2
freq=474166

Celui-ci contient la fréquence issue du fichier fr-Paris et une directive pour dire à MumuDVB de se débrouiller ;-)
Vous pouvez ensuite tester cette configuration en ligne de commande à l’aide d’un compte utilisateur qui fait parti du groupe vidéo :

$ id
$ mumudvb -d -c /etc/mumudvb/card0.conf

Les images sont diffusées sur le réseau, nous pouvons passer à la phase la plus dur du projet : le visionage ;-)

Visionage avec VLC

vlc_mumudvb_sap Mumudvb prend en charge le protocole Session Announcement Protocol (SAP).
Il suffit donc de lancer VLC, afficher la liste de lecture, et activer la découverte de service SAP.

Configuration de Freevo

Pour afficher les chaînes dans Freevo, il faut les définir dans le fichier de configuration local_config.py de cette manière :

TV_VIDEO_GROUPS[0].group_type = 'udp'
TV_CHANNELS = [
( 'C2.telepoche.com', 'France 2', '@239.100.1.1:1234' ),
( 'C3.telepoche.com', 'France 3', '@239.100.1.5:1234' ),
( 'C28.telepoche.com', 'France 4', '@239.100.0.5:1234' ),
( 'C7.telepoche.com', 'France 5', '@239.100.1.2:1234'),
( 'C5.telepoche.com', 'ARTE', '@239.100.1.4:1234' ),
( 'C167.telepoche.com', 'Direct 8', '@239.100.0.0:1234' ),
( 'C195.telepoche.com', 'Gulli', '@239.100.0.4:1234' ),
( 'C194.telepoche.com', 'BFM TV', '@239.100.0.1:1234'),
( 'C170.telepoche.com', 'LCP', '@239.100.1.3:1234')
]

Le group_type udp, n’est pas pris en compte par le plugin mplayer de Freevo, il faut donc modifier le fichier /usr/lib/python2.5/site-packages/freevo/tv/plugins/mplayer.py, vers la ligne 134, pour l’ajouter :

elif vg.group_type == 'udp':
self.fc.chanSet(tuner_channel, True, app='mplayer')
tvcmd = ''
args += ('"udp://%s" %s' % (tuner_channel, config.MPLAYER_ARGS['udp']),)

Vous pouvez, modifier les options de mplayer à l’aide de la variable MPLAYER_ARGS :

MPLAYER_ARGS = { 'dvd' : '-cache 8192',
...
'udp' : '-cache 1024 -vf pp=md -fs',
'default': '-cache 5000'
....
}

Comme cela, vous pouvez afficher la télévision sur Freevo. Par contre, la qualité de l’image est inférieure à celle de VLC, mais je n’ai pas encore trouver la source du problème.

Charge réseau et processeur

iftop_mumudvb

Au niveau de la charge réseau, une chaîne nécessite de 2 à 5Mb, cela signifie qu’avec une interface réseau à 100Mb, il est possible de diffuser plus de 20 chaînes.

Pour la charge processeur, celle-ci est quasiment inexistante, si vous vous contentez de diffuser les flux sur le réseau la quantité de puissance processeurs nécessaire est très faible, d’après le Wiki de Mumudvb il est possible de faire fonctionner sur un NSLU2 avec un dongle TNT USB.

Par contre, si vous voulez transcoder le flux vous allez avoir besoin d’une ou de plusieurs bonnes machines.

Affichage d’une Mosaic de chaînes

vlc_mosaic_mumudvb

Si vous voulez, une Mosaic, il est possible d’assembler les flux udp avec VLC.
La procédure est décrite sur le wiki de VLC : Mosaic – VideoLAN Wiki.

Attention : pont réseau + OpenVPN + Mutlicast = Crash

Il faut faire attention, si vous utilisez des ponts réseaux (Bridge) avec OpenVPN.

Dans ce cas très précis, OpenVPN s’amuse à chiffrer l’ensemble des paquets qui arrivent dans le bridge.
Si votre machine n’est pas suffisamment puissante, alors OpenVPN va planter au bout de quelques minutes :

Sun Jul 12 22:46:25 2009 us=801259 MULTI: packet dropped due to output saturation (multi_add_mbuf)

La meilleure chose à faire est donc de bloquer le flux multicast au niveau du bridge avec ebtables.

Des éléphants dans le salon

Si votre réseau Ethernet supporte les Jumbo Frames.
Il suffit de modifier la taille des paquets distribués par Mumudvb dans le fichier mumudvb.h :
$ fgrep MAX_UDP_SIZE /usr/src/mumudvb/src/mumudvb.h
#define MAX_UDP_SIZE (TS_PACKET_SIZE*46)

Après avoir recompilé le programme, vous pouvez vérifier que cela fonctionne avec Tcpdump :
# tcpdump -i bond0 port 1234
13:30:59.830361 IP loutre.csquad.lan.1234 > 239.202.204.200.1234: UDP, length 8648

Le principal avantage des Jumbo Frames est de réduire le nombre de paquets sur le réseau.

Conclusion

Les principaux avantages du passage de mon système de télévision en numérique et l’adaptation du standard DVB sont :

  • la possibilité de diffuser le flux sur plusieurs postes ;
  • il n’y a plus de limite pour l’enregistrement du flux ;
  • la possibilité de modifier le flux (transcodage, mosaic, etc..) ;
  • la possibilité d’avoir la télévision sur des appareils mobiles ;
  • au niveau du câblage domotique, la diffusion la télévision via le Wifi et/ou l’Ethernet.

Je vais faire d’autres articles sur le sujet, pour expliquer comment j’ai réussi à diffuser le flux TV sur ma PlayStation Portable (PSP) et mon Nokia 770.

Filed under: Debian,Home automation — Tags:, , , , , — cscm @ 22:22

2 responses to “Diffuser des flux TV sur réseau local avec MuMuDVB”

  1. nofear says:

    Hi Christophe

    Thank you very much for the post its really beneficial.
    I have just one question.
    With one sat card and one LNB how many channels I can stream?
    My setup up will be:
    Debian squeeze server, Skystar2,LNB on hotbird and I want to stream to DM800

  2. cscm says:

    Hi Mourad,

    It depends, you can stream a frequency with 1 to n channels. You can check frequencies description for your satellite in the /usr/share/dvb/dvb-s directory (part of the dvb-apps package).
    I did not test with a DVB-S card on Linux.
    Good luck !

Powered by WordPress