Artisan Numérique

/matos/freebox/matériel/ FreeBox HD - faire son propre FreePlayer

Dans le précédent volet de mes bidouillages sur la FreeBox HD, je me suis juste borné à voir si l'on pouvait faire autre chose de cette boîte que caler une porte. Et le résultat avec été pour le peu mitigé. Ici le but est de la pousser un peu plus loin et tenter d'en faire un récepteur fonctionnel de flux audio/vidéo permettant aussi bien de lire des DVD que des DivX. Et ce à partir de n'importe quelle machine du LAN. La solution passe par l'obscure mode "FreePlayer".

Le mode FreePlayer

J'ai tout de même mis un peu de temps à comprendre ce qu'était cette histoire de freeplayer accessible par le menu de la FreeBox HD. L'idée est de pouvoir injecter une vidéo compatible (entendre MPEG2) sur la FreeBox à partir d'une application (un tas de scripts en fait) utilisant le fameux VLC.

Pour tester cela, il vous suffit de choisir sur le LAN une machine équipée d'un lecteur de DVD et d'y téléchargez le fameux freeplayer. Décompressez-le puis installez-le en tant que root en laçant la commande ./install.sh.

Deuxième étape, il faut sur le site de configuration de la FreeBox, aller dans la section Internet, puis Configurer mon routeur Freebox. Là vous devez déjà activer le mode routeur si ce n'est déjà fait, puis renseigner le champ IP du FreePlayer avec l'adresse IP de la machine où se trouve FreePlayer. Ceci fait, clickez sur Envoyer et redémarrez la FreeBox.

Ne suivez d'ailleurs pas les conseils disant qu'il faille modifier la configuration du NAT pour router le trafic venant d'internet sur le port 8080 de la machine cible, cela n'apporte rien et ouvre un trou de sécurité.

Maintenant vous pouvez insérer un DVD le lecteur et lancer la commande /usr/local/freeplayer/bin/vlc-fbx.sh dvd:/ ce qui va se traduire par l'apparition d'un lecteur VLC. Ensuite avec la télécommande de la FreeBox, sélectionnez le mode Freeplayer, puis Se connecter au Freeplayer. Là une vilaine interface s'affiche sur l'écran du boîtier. Maintenant il ne reste plus qu'à faire un coup de Play sur la télécommande et c'est parti...

Alors tout cela peut sembler séduisant mais comporte quelques limites. Le choix d'un DVD ne s'est en fait pas trouvé là par hasard. En effet, le décodeur de vidéo de la FreeBox est loin d'être génial. Il ne permet en fait que de décoder les standards utilisés par la VOD, à savoir un flux vidéo MPEG2, audio MPEG,MP3 ou AC-3, le tout encapsulé dans des frames de type MPEG-TS. C'est ce que nous allons chercher à corriger.

Avant de poursuivre, sachez qu'il existe des applications comme easybox qui ne sont "rien d'autre" que des version surgonflée du freePlayer. Leur installation est simple et elles vous permettent d'obtenir un niveau de fonctionnalité assez proche d'un MythTV pour ne citer que lui. La suite ne s'adresse donc qu'à ceux qui veulent bidouiller les flux par eux-même.

Fonctionnement du mode FreePlayer

Décortiquons un peu ce qui se passe entre FreePlayer et la FreeBox. Lorsque nous exécutons vlc-fbx.sh, ce dernier lance un client VLC paramétré de sorte à :

  • Ouvrir son interface WEB sur le port 8080. Cette interface permet de commander le lecteur avec un simple navigateur WEB.
  • Ouvrir le média passé en paramètre (le DVD)
  • Créer une chaîne qui va prendre les données audio et vidéo en entrée et les transférer en sortie vers la FreeBox. Notez que l'IP de la FreeBox HD est toujours la même, à savoir 212.27.38.253.
  • Se mettre en pause.

Lorsque vous sélectionnez le mode FreePlayer avec votre télécommande et que vous validez "se connecter à freeplayer", le boîtier va en réalité effectuer deux opérations simultanément :

  • Il se connecte sur le port 8080 de l'IP que vous avez saisi dans le paramétrage du mode routeur et tombe alors sur l'interface WEB de VLC. Il charge la page HTML d'accueil et se comporte dés lors comme un véritable petit navigateur WEB, la sélection des liens se faisant en navigant avec la télécommande et la validation par la touche OK.
  • Il lance un serveur UDP en écoute du port 1234 dont le rôle sera de recevoir d'éventuels flux vidéo. Ce serveur utilise le protocole RTP (Real-Time Transfert Protocole) dont le but est de permettre le transport de paquets de données sur IP avec une contrainte de temps. Cela permet aussi bien de faire passer de l'audio que de la vidéo en étant assuré que les paquets arriveront dans le bon ordre, y compris en utilisant un sous-protocole tel qu'UDP.

Maintenant lorsque vous sélectionnez Play avec la télécommande, l'ordre est transmis à VLC qui lance la lecture du DVD et transfert les paquets audio-vidéo sur le port 1234 de la FreeBox. Le spectacle peut commencer...

Fabriquer un faux FreePlayer

Sachant tout cela, on comprend bien qu'il est parfaitement possible d'exploiter le mode "navigateur" de la FreeBox pour afficher toute sortes d'informations en la faisant se connecter non plus sur VLC, mais sur un serveur Apache équipé de PHP. C'est comme cela que fonctionne les "mods" comme easybox, qui permettent d'afficher vos courriels, la météo, des photos et bien sur la vidéo.

Lorsque l'on commute avec la télécommande la FB-HD en mode FreePlayer, elle va en premier lieu chercher sur le serveur HTTP un fichier settings.html. Ce fichier est originalement utilisé pour communiquer à la FB-HD le paramétrage VLC. Mais en réalité nous pouvons mettre ce que nous voulons dans ce fichier, l'important étant juste que la FB-HD le trouve lorsqu'elle le cherche. C'est ainsi que nous allons créer un faux FreePlayer.

Pour ce faire, nous allons re-paramétrer le routeur de la FB pour qu'il aille chercher notre faux freePlayer sur une machine hébergeant un serveur Apache. Sur cet Apache nous allons simplement créer une nouvelle configuration vhost de ce genre :

Listen *:8080
NameVirtualHost *:8080

<VirtualHost *:8080>
  DocumentRoot /var/www/fakeplayer

  ErrorLog /var/log/fakeplayer-errors.log
  CustomLog /var/log/fakeplayer-access.log combined
  <Directory /var/www/fakeplayer>
    Allow from all
  </Directory>
</VirtualHost>
vhost.fakeplayer.conf

Ceci fait, il faut créer le dossier /var/www/fakeplayer et y poser notre premier fichier settings.html

<!DOCTYPE HTML PUBLIC "-//Freebox//DTD HTML 3.2//EN">
<html>
  <head>
    <meta name=refresh content="0;url=/index.php">
  </head>
  <body>
  </body>
</html>
settings.html

L'idée est ici de faire de settings.html un simple relais relais vers un index.php. En lisant la balise meta, le navigateur HTML de la FB-HD va directement aller à l'URL indiquée, à savoir index.php. L'avantage de cette méthode est que l'utilisation de toute l'artillerie PHP devient du coup possible. Je me suis ainsi amusé à voir si je pouvais utiliser la FB-HD pour naviguer sur notre intranet utilisant Drupal, et ça marche très bien. C'est très, mais alors très moche, mais ça fonctionne. Ceci dit, ce n'est pas le but de la manoeuvre, nous allons donc ici créer un index.php beaucoup plus simple :

<hlml>
  <body>
    <? print "Test v1" ?>
  </body>
</html>
index.php

Un petit coup de redémarrage d'Apache et normalement votre FB-HD devrait se connecter sans problème sur ce "freeplayer" et afficher le message "Test v1", généré par PHP. Le plus gros est passé.

Le Fond Vidéo

Le code HTML s'affiche nickel mais la vidéo, niet. La raison en est que le navigateur WEB de la FB-HD utilise une syntaxe HTML quelque peu détournée pour incruster la vidéo dans le fond de la page WEB à l'attribut background du tag body une valeur un peu particulière :

<hlml>
  <body background="ts://127.0.0.1">
    <? print "Test v2" ?>
  </body>
</html>
index.php

Avec ts://127.0.0.1, la FB-HD sait donc que la source de l'image de fond de notre page HTML est le flux provenant du serveur RTP. Une fois index.php modifié, il suffit donc d'utiliser la télécommande pour se reconnecter sur notre FreePlayer et ainsi rafraîchir la page. Il est maintenant temps d'injecter notre premier flux vidéo de n'importe quelle machine du réseau :

vlc --sout '#duplicate{dst=std{access=udp,mux=ts,dst=212.27.38.253:1234}}' --open=dvd://
injection d'un flux DVD

Côté HTML/HTTP, la base de notre terminal vidéo est maintenant prête. Il est cependant possible d'aller beaucoup plus loin dans l'utilisation de ce navigateur WEB un peu particulier. Juste à titre d'exemple, il est possible d'assigner une URL aux boutons de la télécommande en ajoutant dans le tag head quelque chose comme cela :

<link rel="info"    href="mon_info.php"/>
<link rel="guide"   href="none"/>
<meta name="home_page" content="index.php"/>

La liste (non exhaustive) des boutons assignables est : info, guide, options, help, play, pause, stop, red, blue, green, yellow.

Transcodage

Comme nous l'avons vu plus haut, en natif la FB-HD est quelque peu limité du format. La solution est donc de demander gentiment à VLC d'opérer à la volée une transformation des fluxes pour les rendre compatible. Ce qui nous donne par exemple :

 vlc \
--sout '#transcode{\
    vcodec=mp2v,vb=4096,scale=1,fps=25,audio-sync,\
    acodec=a52,ab=512,channels=2\
  }:\
  duplicate{dst=std{access=udp,mux=ts,dst=212.27.38.253:1234}}' \
--open=/home/yoran/Desktop/Heroes.S03E12.avi

La seule différence avec la commande précédente est la présence du bloc "transcode". C'est lui qui va convertir le flux vidéo en MPEG2 à 4mo/s et audio en AC3 à 512ko/s. Notez que vous pouvez vous passer de la partie acodec=a52,ab=512,channels=2 si votre source a un flux audio en MP3 ou AC3. Cela allégera un peu le CPU.

La directive fps=25 permet à l'encodeur de fonctionner en cas de framerate différent à la source. audio-sync permet quant à elle de garder autant que faire se peut la syncro audio/vidéo. Malheureusement, et c'est le point noir de cette approche, si le flux d'entrée est mal gaulé, il arrive malgré tout qu'un décalage se crée, typiquement lorsque l'on se déplace dans le flux, et je n'ai trouvé aucune solution à ce problème.

Injection à partir d'un serveur MPD

Pour l'instant nous n'avons injecté que de la vidéo mais rien n'empêche l'utilisation de la FreeBox HD comme terminal audio. Avec VLC vous pouvez soit rediriger un flux MP3, soit transcoder un flux OGG sans problèmes. Et avec un peu d'huile de code, la même chose est possible à partir d'un serveur MPD

En effet, il y a peu je suis tombé sur un note dans la documentation de MPD parlant d'un nouveau type de sorti nommé FIFO. Un Fifo sous unix est aussi appelé un tube nommé, c'est à dire un fichier très spécial sur lequel une application peut écrire et qu'une autre application peut lire sans que les données transitent réellement par le disque.

Après avoir discuté avec un des développeur de MPD (merci Jat), j'ai pu utiliser cette sortie pour alimenter une instance de VLC qui, comme pour la vidéo, transcode tout ce qui sort de MPD en flux MPEG2 à destination de la freebox.

Alors c'est plus un Proof of concept qu'autre chose. Et pour mettre ceci en oeuvre vous devez utiliser la toute dernière version compilée main de MPD. Ceci fait, il faut vérifier que vous avez bien la sortie FIFO en faisant un mpd --version. Si c'est le cas, allez dans la configuration et ajoutez une nouvelle sortie

audio_output {
  type                    "fifo"
  name                    "My FIFO"
  path                    "/tmp/mpd.fifo"
  format                  "44100:16:2"
}

Relancez le serveur puis tapez la ligne de commande suivante :

sox -t raw -r 44100 -s -w -c2 /tmp/mpd.fifo -t wav - | \
vlc \
  --sout '#transcode{acodec=mp3,ab=128,channels=2}:\
    duplicate{dst=std{access=udp,mux=ts,dst=212.27.38.253:1234}}'
  --open=file:/dev/stdin

Et voilà, maintenant la lecture d'un morceau est diffusé en live sur la FreeBox HD. La commande sox est là car je n'ai pas réussi à faire manger ce flux raw/PCM directement à VLC.

Conclusion

Voilà, fin du voyage dans l'injection de flux sur la FreeBox HD. Techniquement cela fonctionne plutôt bien. Maintenant à l'usage quelques problèmes restent. Tout d'abord pour la vidéo concernant le décalage audio/vidéo qui peut devenir très pénible. Ensuite pour l'audio, c'est peut-être un peu idiot de transcoder/compresser et ainsi perdre de la qualité juste pour ne pas avoir à basculer une entrée sur l'ampli. Et c'est d'autant plus vrai si comme moi vous avez encodé votre musique avec FLAC.

Enfin tout ceci prend de la ressource. Une machine de bureau et ces 100W sont un peu cher payer pour mater un DVD. Prochaine étape donc, trouver comment remplacer tout cela par une eeebox.