" /> Mon para-monde
Flux RSS

jeudi 17 avril 2014

Pourquoi on ne peut pas transcoder vers une Freebox

Les serveurs multimédias domestiques évoluent de jour en jour. Il n'y a pas si longtemps, on se baladait avec des disques durs portables puis des clés USB, des SDCards pour aller de l'ordi à la platine de salon. Désormais toutes les boxes font plus ou moins serveur et lecteur de flux réseau. C'est le cas aussi pour certaines consoles de jeux (hackées ou non).

Pour ma part, j'ai une PS3 et une Freebox HD (V5, pas la dernière), elles font toutes deux - mal chacune dans leur genre - lecteur DLNA.

Au fil du temps, j'ai d'abord utilisé un petit serveur DLNA qui se trouvait sur mon premier NAS, autant dire qu'il n'était pas top, ne supportait rien et le processeur n'avait de toute façon pas le oumpff pour faire autre chose que streamer en direct les contenus (c'était un TeraStationII de Buffalo).

Depuis j'ai monté mon "petit" NAS perso sur un HP MicroServer avec FreeNAS comme OS/Distrib. Sur FreeNAS,l'une des alternatives "au déballage" est l'installation de Plex. Ce serveur multimédia a de nombreuses fonctions (comme le streaming à distance par exemple, le partage via internet, etc.) et en local dispose d'un module serveur DLNA (=UPnP) qui gère le transcodage.

Le transcodage consiste pour le serveur à recalculer les flux vidéo et audio à la volée lorsque le lecteur ne supporte pas le format original du fichier. La puissance du processeur du MicroServer est suffisante pour la plupart de mes besoins.

L'avantage du transcodage, c'est qu'on a plus à se poser la question du format, on streame un fichier vers la PS3, les tablettes/téléphones Android ou de la pomme de façon totalement transparente même si comme c'est le cas pour les différents iTrucs, il n'y a pas beaucoup de format supporté à la base...

Or comme un oeil sagace peu s'en rendre compte, je n'ai pas cité ci-dessus la Freebox... En effet, celle-ci, bien qu'elle supporte pas mal de codecs tant video qu'audio ou des contenants multimédias pas les plus courants (le Matroska par exemple, excellent container mais peu diffusé face à l'AVI,le MPEG-TS ou au MP4) marche encore plus mal que la PS3 qui avant le transcodage était TRES tatillonne...

Pour résumer : La Freebox ne supporte pas l'un des principaux containers actuel à savoir le MP4, ainsi tout fichier s'annoncant comme "*.mp4" ou avec un type MIME "video/mp4" sera tout simplement ignoré dans la liste des fichiers disponibles (alors que le serveur les envoie bien dans la liste), par ailleurs, pour une raison à l'origine inconnue, il n'était pas possible de transcoder, la freebox n'arrivant pas à récupérer le flux (qui fonctionnait en faisant mimer la freebox par XBMC ou VLC). La freebox a d'autres limitations mais je les laisse de côté car rien en théorie que le transcodage ne pourrait résoudre !

Je me suis donc mis en tête de faire fonctionner ce %#~$£^#"& de transcodage... Si la PS3 le fait il n'y avait pas de raison que la freebox (supportant plus de codec) ne le fasse pas ! Après quelques jours à triturer les profils, a lire des lignes et des lignes de logs de Plex. Il faut se rendre à l'évidence. Il n'y a rien à faire du côté serveur ! Le problème est exclusivement du côté client. J'ai donc ouvert un ticket sur le bugtracker de la Freebox HD mais sans grand espoir quand on voit le nombre de tickets ouverts en attente depuis des années !

Pour la petite histoire, Plex se base sur les champs d'entête et en particulier sur le champ HTTP "User-Agent" pour identifier le matériel qui lui parle. Or la freebox envoie bien une telle ligne lorsqu'elle parcours l'arborescence par l'énumérateur UPnP, mais une fois la ressource multimédia trouvée, elle va la chercher via une requête HTTP ne contenant pas ce fameux "User-Agent"... Résultat, Plex perd la notion du type de matériel qui lui parle et considère parler à un matériel "Generic", c'est à dire qui sait tout lire sans transcodage. N'ayant plus notion de destination de transcodage, l'accès aux ressources énumérées à l'étape précédent échoue lui aussi.

La solution propre est que la Freebox envoie toujours son User-Agent... et il n'y a hélas pas de solution sale car Plex ne fait pas de discrimination par adresse IP par exemple (normal, ca n'a pas de sens dans un réseau universal**Plug'nPlay** ou les IP peuvent varier sans prévenir à l'occasion d'un renouvellement de bail DHCP par exemple...).

Donc toi qui bosse chez Free au développement de la Freebox et qui passe par hasard ici, s'il te plait pourrais-tu rajouter une ligne dans "fbxupnpav" pour que le User-Agent soit envoyé lors de la demande d'un objet pour le streaming. Je t'assure, il y en a pour une ligne du genre

httpResponse.header("User-Agent","Linux/2.6 UPnP/1.0 fbxupnpav/1.0");

en fonction de ton langage de prédilection...

Note, si le source de fbxupnpav avait été libre, je l'aurais fait moi-même et je t'aurais même économisé ça...

Allez soit cool, vieux ! ;)

jeudi 3 mars 2011

Présenter proprement la playlist TV de Free pour regarder la TV sur un iPad

Ma femme a un iPad depuis quelques temps qui a été jailbreaké dans la foulée de l'achat.

Cela a permis d'installer VLC afin de passer outre aux limitations intrinsèques du player Apple.

Or VLC sur iPad c'est un peu pas facile à utiliser, il n'y a pas d'interface pour saisir un chemin réseau et il faut déposer à la mimine en SFTP les fichiers au bon endroit.

Alors de là à pouvoir rentrer un lien RTSP voire pire le sélectionner dans une liste M3U autant ne pas y penser (rah zut, j'y ai pensé).

Mais ne voulant pas m'avouer vaincu vu que j'avais lu que les formats et transports présents dans le VLC "ordi" étaient présent dans le VLC "iPad", j'ai bidouillé un petit script PHP pour transformer à la volée le liste de lecture de la friboite (récupérable à http://212.27.40.238/pub/playlist.m3u depuis tout poste interne d'un réseau free).

Grosso modo, le principe du script c'est on lit ligne par ligne le contenu de la playlist, on traite la ligne #EXTINF puis la ligne d'URL (qui commence par rtsp://), tout le reste est ignoré.

L'iPad n'arrive pas à traiter les flux HD donc je les filtre

Voici le script brut de décoffrage, le but étant que ca marche au mépris total de la mise en page et de la présentation.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<h1>Chaines FBX</h1>
<ul>
<?php
$browser
=get_browser($_SERVER["HTTP_USER_AGENT"],true); 

$m3u=file_get_contents("http://212.27.40.238/pub/playlist.m3u");
$m3ulines=explode("\n",$m3u);

foreach (
$m3ulines as $l) {
    if (
preg_match("/(#EXTINF:)(.*),(.*)\s-\s(.*)/",$l,$res)) {
    
//    echo "EXTINF trouvé<br/>\n" ;
        
$domain=$res[2];
        
$chaine=$res[3];
        
$desc=$res[4];
    } elseif (
preg_match("/(rtsp:\/\/.*)$/",$l)) {
        if ( (
strstr($l,"flavour=hd")) && ($browser["parent"]=="iPad") ) {
            echo 
"<li>[$domain - $chaine$desc</li>";
        } else {
            echo 
"<li>[$domain - $chaine] <a href=\"$l\">$desc</a></li> ";
        }

    }
}

?>
</ul>
</body>
</html>

Voilà, un peu moins de 10 lignes.

Il n'y a plus qu'à pointer Safari sur le lieu où vous avez déposé le fichier

Pour tester, vous pouvez voir le résultat à http://www.frederic.senis.org/~fs/fbx.php.