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".

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.
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.
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 à :
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 :
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...
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 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.
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.
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.
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.
Juste pour en savoir plus sur tes serveurs mpd ?
Euh oui ? Tu veux savoir quoi exactement ?
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 ??!?
coté matos : c'eest quoi comme serveur pour le mpd.
et autre question, comment tu fait pour distribuer l'audio ? cable ?
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?
@malic très exactement, tout est fait
Le BBQ est pour bientôt :-]
@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.
@mhoungbo tout est ici : http://artisan.karma-lab.net/node/1310
merci Ulhume, je suis dans l'attente
@mhoungbo c'est fait : http://artisan.karma-lab.net/node/1310
mille merci Ulhume
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 ?
@FPS merci, c'est corrigé.
Pour répondre à ta question tu parles bien du flux émit par vlc à destination de la FreeBox ?
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.
@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
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 *
@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.
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.
@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.
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
Poster un nouveau commentaire