FreeBox HD - faire son propre FreePlayer
12 décembre, 2008 - 04:26 | Ulhume | Matériel Freebox Vidéo Tutoriel

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.

Commentaires

mhoungbo, le 31 juillet, 2008 - 20:53

Juste pour en savoir plus sur tes serveurs mpd ?

Ulhume, le 31 juillet, 2008 - 22:26

Euh oui ? Tu veux savoir quoi exactement ?

feilong, le 1 août, 2008 - 14:50

Joli. Je vois que tu creuses encore un peu plus loin.
Je préfère personnellement récupérer les excellents travaux des équipes de easybox ou de homeplayer pour ne cité qu'eux plutôt que de refaire un code !

Mpd j'arrive pas à voir l'intérêt, à part d'habiter en collocation ??!?

mhoungbo, le 1 août, 2008 - 14:53

coté matos : c'eest quoi comme serveur pour le mpd.
et autre question, comment tu fait pour distribuer l'audio ? cable ?

malic, le 1 août, 2008 - 15:30

Hmmm.. je vois qu'on s'amuse bien....

Les cartons du déménagement? ça y est, ils sont tous vidés? Les affaires sont rangées?
Les peintures sont faites?

:D

Ulhume, le 1 août, 2008 - 15:41

@malic très exactement, tout est fait ;p Le BBQ est pour bientôt :-]

Ulhume, le 1 août, 2008 - 15:56

@feilong Tu n'es pas si loin avec la collocation ;-) L'intérêt de MPD réside principalement dans son interface distante. Pour te donner une idée, je sonorise deux étages avec le même volume musical partagé via NFS. J'ai deux serveurs MPD qui prennent en charge deux ensemble carte son/ampli. Dans un des cas, l'ordinateur en charge n'a ni clavier, ni écran. MPD me permet de contrôler l'ensemble via Sonata de mon propre PC. Ma femme quant à elle contrôle la musique du salon par son portable sous Windows via une interface Web, ou plus généralement, à travers une autre application web adapté petits formats et son iPhone. Dans tous les cas les playlists, la musique, les settings sont partagées entre les serveurs.

Donc si tu sonorises uniquement la pièce où tu travailles, je comprends que l'on ne puisse pas y voir d'intérêt, mais dans le cas contraire, il te permet énormément de combinaisons.

Pour revenir à easybox, je suis totalement d'accord sur l'excellent travail réalisé et je ne me prive pas pour le dire si tu lis bien, j'ai même littéralement pompé la syntaxe de transcodage. Maintenant c'est encore une fois une question d'usage. Dans ma "collocation conjugale", nous avons pris l'habitude d'être autonome quant à la prise de pouvoir sur ce type de périphérique de sortie. Si ma douce et tendre désire mater le DVD d'Art martiaux qui est sur son portable, elle le fait directement. La FB-HD est juste un terminal.

Je pense que beaucoup dans tout cela tient à ce que nous avons chez nous l'habitude d'avoir chacun nos outils, il faut donc des choses standards et partageables comme simple organe de sortie.

Ulhume, le 1 août, 2008 - 15:57

@mhoungbo tout est ici : http://artisan.karma-lab.net/node/1310

mhoungbo, le 1 août, 2008 - 17:50

merci Ulhume, je suis dans l'attente :)

Ulhume, le 1 août, 2008 - 18:01
mhoungbo, le 1 août, 2008 - 19:37

mille merci Ulhume

FPS, le 6 août, 2008 - 20:51

Excellent tutoriel sur l'utilisation de la Freebox et de VLC...

Je signale juste une petit coquille sur les lignes de commandes VLC dans la partie * Fond Vidéo *, dst au lieu de dest. Mais on trouve vite la solution dans la partie * Transcodage *.

Et j'aurais une petite question : est-il possible de récupérer le flux envoyé sur un autre PC équipé de VLC ?

Ulhume, le 6 août, 2008 - 22:15

@FPS merci, c'est corrigé.

Pour répondre à ta question tu parles bien du flux émit par vlc à destination de la FreeBox ?

FPS, le 6 août, 2008 - 23:17

Désolé, on ne s'est pas compris c'est bien * dst * et non pas * dest *.

(Voir documentation http://www.videolan.org/doc/streaming-howto/fr/ch03.html).

Donc ce que tu avais noté dans le paragraphe * Transcodage * était bon et les coquilles se trouvaient dans le paragraphe * Fond Vidéo *.

Pour ma question, oui j'aimerais récupérer le flux émis par VLC à destination de la FreeBox. Est ce possible ?

Merci par avance pour tes réponses.

Ulhume, le 6 août, 2008 - 23:54

@FPS ça m'apprendra à corriger sans vérifier ;-)

Pour recevoir le flux émis par un VLC c'est bête et con :

Sur la machine cible qui a disons l'ip 10.0.0.1 tu lances VLC en réception de flux RTP/UDP, le port par défaut est 1234 :
vlc udp://@

Sur la machine source, tu lances la même commande magique que pour la freebox, sauf que tu mets l'IP de la machine cible :
vlc --sout="#std" --sout-standard-access=udp --sout-standard-mux=ts --sout-standard-url=10.0.0.1:1234 --sout-ts-pid-video=68 --sout-ts-pid-audio=69 --sout-ts-pcr=80 --sout-ts-dts-delay=400 --color --open=maVideo.ts

FPS, le 7 août, 2008 - 10:10

Merci pour l'info...

Donc on ne peut avoir qu'un seul destinataire. Il n'est pas possible de diffuser à la fois vers la Freebox et un autre PC ?

PS : il reste toujours la petite coquille dans le paragraphe * Transcodage *

Ulhume, le 7 août, 2008 - 10:22

@FPS Non en effet, ce n'est pas du multicast. C'est techniquement très possible mais c'est au niveau de la FbxHD que ça va coincer vu qu'elle ne se connecte pas sur une adresse multicast.

Maintenant tous les délires sont réalisables avec VLC. Tu peux par exemple diffuser un flux en multicast sur une machine, t'y connecter à partir d'une autre et à partir d'une autre encore relayer le flux multicast sur le port RTP/UDB de la FreeBox. Après ça devient juste un peu tordu disons ;-)

Tu avais besoin de cela pour faire quoi ? J'ai du mal à saisir le besoin de base d'envoyer de la vidéo sur deux machines en même temps dans un cadre domestique.

FPS, le 7 août, 2008 - 14:17

En fait, VLC permet de transformer un PC en véritable serveur multimédia grâce à cette fonctionnalité de streaming qui n'est pas très connue et qui n'est pas facile à prendre en main pour un noob.

Je voulais savoir si cela été possible sans que cela ne devienne une usine à gaz.

Merci pour tes réponses et tes articles intéressants sur une architecture domestique.

Ulhume, le 7 août, 2008 - 14:42

@FPS possible sans aucun doute, souhaitable je ne sais pas car le multicast fait beaucoup soufrir les switchs grands publiques (j'ai bossé 1 an dans le secteur de la vidéosureveillance sur IP). Maintenant pour que cela ne devienne pas une usine à gaz, le mieux reste de dédier une machine à ce travail. Il y a pas mal d'exemple d'utilisation de VLC en serveur VOD ce qui me parait le plus simple dans ton cas.

Ulhume, le 9 août, 2008 - 16:58

Pour ceux que cela intéresse, j'ai ajouté un tutoriel sur MPD avec un moyen de diffuser sur la FreeBox HD.
http://artisan.karma-lab.net/node/1603

Daniel, le 12 mai, 2010 - 21:47

Excellent comme tutoriel, j'aurais jamais pensé à ca. Ce VLC me surprendra toujours par la richesse des choses que l'on peut faire avec.

Scrabble Cheat

broc, le 6 août, 2010 - 23:27

Pour ceux qui n'ont pas le droit à un vlc compilé avec encodage lame, mais qui ont quand même la possibilité d'installer la commande "lame", voici ce qu'il est possible de faire :

lame --quiet -r -s m -b 192 -s 44.100 /tmp/mpd.fifo - |\
cvlc --sout '#duplicate{dst=std{access=udp,mux=ts,dst=212.27.38.253:1234}}' /dev/stdin

Poster un nouveau commentaire

Si vous avez détecté une erreur, coquille ou bêtises du même ordre, merci de plutôt passer par le formulaire de contact
Pour vous abonner au flux des commentaires sur cet article, clickez ici.
Pour répondre à quelqu'un, utilisez plutôt le lien répondre qui se trouve en haut (ou en bas) à gauche de son commentaire.
Le contenu de ce champ sera maintenu privé et ne sera pas affiché publiquement. Si vous avez un compte gravatar, l'utilisez pour afficher votre avatar.
  • To highlight piece of code, just surround them with <code type="language"> Your code &tl;/code>>. Language can be java,c++,bash,etc... Everything Geshi support.
  • Tags HTML autorisés : <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <blockquote> <div> <p> <br>
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Every instance of custom tags in the input text will be replaced with a specific tool shortcut.

Plus d'informations sur les options de formatage

Êtes-vous humain ?
Cette question est là pour déterminer si vous êtes humain ou pas...