La FreeBox HD en récepteur de flux
Le 31 juillet 2008, à 16:25 par Ulhume...

Dans le précédent volet de mes bidouillages sur la FreeBox HD, je me suis juste borné à voir ce que l'on pouvait faire de cette boîte si ce n'est pour caler une porte. Ici le but est de la pousser un peu plus loin pour en faire un récepteur fonctionnel de flux permettant aussi bien de lire des DVD que des DivX. Et ce à partir de n'importe quelle machine du LAN.

Passage à la vitesse supérieur

Alors évidement, un "noeud multimédia" ça veut un peu près dire tout et n'importe quoi : lire des vidéos, des DVD, des photos de vacances, la météo, etc... Si vous êtes un fan de cette approche "tout dans ma télé", je vous conseille vivement easybox qui n'est autre qu'une version surgonflée du freePlayer. L'installation est simple, si vous disposez déjà d'un serveur apache dans un coin, et vous permet d'obtenir un niveau de fonctionnalité assez proche d'un MythTV pour ne citer que lui. Ceci dit, easyBox n'est pas le seul dans la cours de récrée, et les "mods" pour la FreeBox HD sont assez nombreux pour que chacun y trouve son bonheur.

Me concernant cette approche n'est pas acceptable. Dans l'architecture de mon nid, ce noeud doit être une périphérique "passive" qui traite un flux entrant venant de n'importe où sur le réseau, et ce avec n'importe quel format source. Je ne veux non plus être lié à un lecteur particulier, ni avoir à manipuler la télécommande pour des opérations autres que basculer les modes TV, VOD et Flux.

En somme, il me faut arriver à transformer cette boîte en récepteur de flux vidéo et rien de plus. J'exclue donc du périmètre la partie musicale que je laisse à mes serveurs mpd beaucoup plus efficace sur cette tâche. Et au regard de la très faible consommation énergétique de la boîte, et pour peu de prendre la peine de l'éteindre lorsqu'elle est inutilisée, ce serait dommage pour ma part de continuer à dédier un PC pour cet usage.

Fabriquer un faux FreePlayer

L'approche originale de FreePlayer (VLC+serveur HTTP) n'est pas gênante en soit mais implique d'avoir toujours un VLC de lancé sur la même machine. Et ce n'est pour moi pas acceptable. Je veux pouvoir injecter un flux de n'importe où sur le réseau et ce sans qu'une instance de VLC ne tourne quelque part pour des prunes.

Lorsque l'on commute avec la télécommande la FB-HD en mode FreePlayer, sa seule action est de se connecter en HTTP sur le port 8080 de la machine "freeplayer" qui a été indiquée dans le paramétrage du routeur. Ceci fait, elle va y chercher un fichier settings.html. Ce fichier est originalement utilisé pour communiquer à la FB-HD le paramétrage VLC. Mais au fond, nous pourrions mettre ce que nous voulons dans ce fichier, l'important étant juste que la FB-HD le trouve lorsqu'elle le cherche. Nous allons donc créer un faux FreePlayer.

Pour ce faire, il suffit de 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="0url=/index.php">
</head>
<body>
</body>
</html>

L'idée est ici d'en faire juste un relais. 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 "Hello World !!!" ?>
</body>
</html>

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 "Hello World", généré par PHP. Le plus gros est passé.

Le Fond Vidéo

A ce stade, les plus curieux ont déjà tenté d'injecter un flux en utilisant VLC et ont constaté que cela ne marche pas.

vlc --sout="#std" --sout-standard-access=udp --sout-standard-mux=ts --sout-standard-dst=212.27.38.253:1234 \
    --sout-ts-pid-video=68 --sout-ts-pid-audio=69 --sout-ts-pcr=80 --sout-ts-dts-delay=400 \
    --color --open=mavideo.ts

Le code HTML s'affiche nickel mais la vidéo, niet. La raison en est que le navigateur WEB de la FB-HD utilise à son compte une syntaxe HTML détournée pour incruster la vidéo dans le fond de la page. Et cette manière détournée consiste à donner une URL très particulière à l'attribut background du tag body :

<hlml>
<body background="ts://127.0.0.1">
<? print "Hello World !!!" ?>
</body>
</html>

Avec ts://127.0.0.1, la FB-HD sait que la source de l'image de fond de notre page HTML est un flux ts et ouvrira donc en conséquence le port 1234 de sorte à pouvoir le recevoir.

Une fois notre index.php modifié, il suffit donc d'utiliser la télécommande pour se reconnecter sur notre FreePlayer et ainsi rafraîchir la page. Page qui en elle même n'a rien de changé. Mais cette fois, si vous relancez la commande VLC donnée plus haut, ce dernier injectera un flux MPEG2 sur le port 1234, il sera utilisé comme fond de la page HTML et viendra donc s'animer sous le "Hello World".

J'ai bien tenté de voir si l'on pouvait utiliser cette URL magique pour d'autres sources comme celle d'un attribut img mais cela ne marche pas.

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 qu'est la FB-HD. Juste à titre d'exemple, il est possible d'assigner une URL aux boutons clef 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 sont : info, guide, options, help, play, pause, stop, red, blue, green, yellow. Grâce à cela il est possible pour nous de connecter les actions de notre choix, via PHP, aux boutons de la télécommande.

Voilà donc qui nous permet de connecter sans lancer VLC, le FB-HD à notre serveur Apache et de pouvoir lire toute source MPEG2. Ainsi pour lire un DVD :

vlc --sout="#std" --sout-standard-access=udp --sout-standard-mux=ts --sout-standard-dst=212.27.38.253:1234  _
    --sout-ts-pid-video=68 --sout-ts-pid-audio=69 --sout-ts-pcr=80 --sout-ts-dts-delay=400 --color \
    --open=dvd://

Reste maintenant à trouver le moyen de lire d'autres formats.

Transcodage

Comme nous l'avons vu plus haut, en natif la FB-HD est quelque peu limité du format. En gros elle connaît Mpeg2, Mp3, l'AC3 et c'est à peu près tout. Du coup, pour un DivX, ça coince. La solution est donc de demander gentiment à VLC d'opérer à la volée une transformation des flux pour les rendre compatible avec la FB-HD. Alors attention, c'est de la pure ligne de commande barbare :

vlc \
 --sout-standard-access=udp --sout-standard-mux=ts --sout-standard-dest=212.27.38.253:1234 \
 --sout-ts-pid-video=68 --sout-ts-pid-audio=69 --sout-ts-pcr=80 --sout-ts-dts-delay=400 --color \  
 --sout=#transcode:std --sout-transcode-vcodec=mp2v --sout-transcode-vb=4096 --sout-transcode-ab=512 \
 --sout-transcode-channels=6 --sout-transcode-acodec=a52 --sout-transcode-samplerate=44100  \
 --sout-transcode-fps=25.0 --file-caching=1000 --sout-transcode-soverlay \
 --open=mon_fichier.avi

Je n'aurais pas le culot de dire que j'ai réussi à pondre une telle commande tout seul, et je remercie au passage l'équipe d'EasyBox qui nous offre tout cela sur un plateau dans le fichier play.html.

Conclusion

Voilà, à ce stade, je dispose d'un véritable terminal audio/vidé. Je peux du coup utiliser la FB-HD pour tout ce qu'elle sait faire (enregistrement, TV, VOD) et utiliser un PC du réseau pour tout le reste (lecture de DVD, de vidéo). Et ce, sans avoir à faire la standardiste avec les câbles.

L'inconvénient du transcodage est évidement la consommation de ressources au niveau de la machine VLC mais d'un point de vue fonctionnel, ça tourne très bien, et l'on peut toujours rêver en se disant que les prochaines versions du firmware prendront en charge d'autres formats.

Commentaires

mhoungbo, le 31 July, 2008 - 19:53

Juste pour en savoir plus sur tes serveurs mpd ?

Ulhume, le 31 July, 2008 - 21:26

Euh oui ? Tu veux savoir quoi exactement ?

feilong , le 1 August, 2008 - 13: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 August, 2008 - 13: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 August, 2008 - 14: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?

Big grin

Ulhume, le 1 August, 2008 - 14:41

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

Ulhume, le 1 August, 2008 - 14:56

@feilong Tu n'es pas si loin avec la collocation Wink 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 August, 2008 - 14:57

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

mhoungbo, le 1 August, 2008 - 16:50

merci Ulhume, je suis dans l'attente Smiling

Ulhume, le 1 August, 2008 - 17:01
mhoungbo, le 1 August, 2008 - 18:37

mille merci Ulhume

FPS , le 6 August, 2008 - 19: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 August, 2008 - 21: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 August, 2008 - 22: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 August, 2008 - 22:54

@FPS ça m'apprendra à corriger sans vérifier Wink

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 August, 2008 - 09: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 August, 2008 - 09: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 Wink

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 August, 2008 - 13: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 August, 2008 - 13: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 August, 2008 - 15: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

Poster un nouveau commentaire

Le contenu de ce champ est gardé secret et ne sera pas montré publiquement.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • 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.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Textual smileys will be replaced with graphical ones.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.

Plus d'informations sur les options de formatage

Connexion utilisateur
Les derniers bavardages...