La théorie
Le DLNA, c’est quoi ?
Réponse courte, une merde. Réponse longue : Une norme mais aussi un protocole. Premier reproche, il très difficile de comprendre quoi que ce soit à ce machin. Logique, puisque DLNA est un sous ensemble d’un « super » protocole beaucoup plus large inventé par Microsoft : l’UPnP.
En hyper méga résumé, le DLNA doit permettre à des équipements (télé, téléphones, consoles, lecteurs vidéos, boxes adsl et compagnies) de lire ou de diffuser de l’audio ou de la vidéo depuis ou vers un autre équipement.
Réfléchissons, une vidéo présente sur une machine et qui est affichée sur une autre… La, normalement, vous devez me faire remarquer qu’on est capable de faire ça depuis très longtemps. Et vous auriez bien raison. Il existe un grand nombre de protocole réseau permettant de lire des fichiers depuis une autre machine (NFS et CIFS étant les plus connus, mais pas les seuls et loin de la). Alors, pourquoi le DLNA ?
Pouvoir lire le fichier ne veut pas dire que l’on est capable de l’afficher. Un téléphone pourrait avoir du mal par exemple à afficher une vidéo en full HD (écran non adapté, pas assez de puissance pour décompresser le flux etc). Les formats vidéos évoluent assez rapidement. Après tout, le temps des divX (version 3.X) n’est pas si loin. Non seulement les algos de compressions vidéos changent (divx, h264, vp8…) mais les conteneurs changent également (avi, ogm, mkv…). au final, il faudrait donc mettre beaucoup d’équipements à jour assez régulièrement pour pouvoir continuer à lire tout et n’importe quoi. Et cela aurait vraiment été très bien ainsi. Au moins on aurait vite compris pourquoi une vidéo refusait de s’afficher en lisant simplement la documentation du produit (« Zut, mon téléphone ne lit pas les mkv, donc que la vidéo soit sur la carte mémoire ou sur mon serveur ne change rien, il ne peut pas la lire ».). A contrario, il suffisait de trouver la bonne mise à jour et le bon programme, et le même téléphone aurait été capable d’afficher les vidéos, quelles soient dans le téléphone ou sur un stockage distant.
Mais pour Microsoft, je suppose que ce mode de fonctionement était bien trop simple, bien trop prévisible. Eux, les maitres de l’aléa informatique, devaient forcément trouver comment mettre un peu de piment dans une chose pourtant simple au départ. Leur vision ? Chaque équipement doit annoncer ce qu’il sait faire, ce qu’il sait envoyer et ce qu’il sait afficher, chacun devant s’adapter aux possibilités de l’autre. Un téléphone ne sait qu’afficher des vidéos en 3gp et en basse résolution ? Alors le serveur contenant la vidéo devait être capable de transcoder la vidéo à la volée, de l’adapter de façon transparente pour que le téléphone puisse l’afficher, même si le fichier en question est un RIP de blueray encode en h264 en fullHD. Le DLNA était né.
Et ça fonctionne ?
Non. Évidement, non.
Chaque constructeur à implémenté le protocole à sa sauce, avec des équipements ayant tous des capacités différentes. Au final, il est déjà compliqué de trouver un « serveur » et un « client » qui fonctionne pas trop mal ensemble. Mais alors trouver un serveur qui fonctionne parfaitement avec trois ou quatre clients différents, ne rêvez pas, je peux vous assurer que c’est aujourd’hui totalement impossible.
Et encore, je me place dans un cas « simple », ou toutes les vidéos sont sur une même machine, le « serveur » donc. Le but du protocole à la base était de permettre à n’importe quel équipement de diffuser vers n’importe quel autre. Pas seulement du serveur vers le téléphone par exemple, mais aussi du téléphone vers la télé, de la freebox vers la console de jeu etc. Et alors la, sérieusement, si un jour ça fonctionne vraiment, Microsoft n’existera plus 🙂
Ok, et donc, en attendant ?
J’ai testé beaucoup de logiciels « serveur » DLNA. (Pas tous hein, il en existe des dizaines). le meilleur est à mon avis PS3 Media server. Son premier gros avantage et de ne pas avoir besoin d’indexer vos fichiers, comme mediatomb ou TVMOBiLi. Devoir attendre que le(s) disque(s) soient indexés avant de pouvoir lire un fichier n’est vraiment pas supportable. La ps3 faisant parti des clients les plus chiants, pardon, les moins tolérant, il faut bien un serveur spécialement conçu pour son cas pour pouvoir discuter correctement avec elle. Heureusement, ps3 media serveur connait d’autres type de clients et parvient à fonctionner avec d’autres appareils. (La liste des équipements compatibles s’allonge au fur et à mesure des versions). Globalement, il y a quelques astuces à connaitre, mais ce programme fonctionne quand même plutôt bien. Attention, comme le flux vidéo est transcodé pendant la lecture, il faut une machine avec de la ressource (cpu et ram). Pour le cpu, un bon dual-core est un minimum. Et pour la mémoire, 2 Go de ram ne seront pas de trop, surtout si vous voulez streamer des flux en HD.
La pratique
Installation de ps3 media server
Si vous avez un linux avec interface graphique, vous lancez le programme, et voila, ça fonctionne. Maintenant on arrête les bêtises et on installe ce logiciel ou il doit se trouver, sur un serveur. Donc sur une machine dépourvue d’interface graphique. Pas de panique, ça va bien se passer. On commence par les pré-requis (qui ne sont indiqués nul part, merci pour les heures perdues à essayer de comprendre d’ou venaient les soucis). Ensuite, il faut savoir que la librairie libmediainfo version 7.44, celle qui est packagée sous debian 5 est bugguée. La encore, c’est pas le genre de chose qu’on peut facilement deviner. Bref, suivez le guide (à adapter bien évidement à votre environnement et en utilisant si possible la dernière version des logiciels).
sudo apt-get install imagemagick mplayer mencoder wget http://ps3mediaserver.googlecode.com/files/pms-generic-linux-unix-1.40.0.tgz tar xvzf pms-generic-linux-unix-1.40.0.tgz apt-cache show libmediainfo0
Si la version de libmediainfo0 est la 7.44, alors mieux vaut qu’elle ne soit pas installée du tout (ps3 media server utilisera ffmpeg à la place, ce sera moins précis mais au moins ça fonctionnera). Si vous utilisez un OS 32 bits, vous trouverez probablement des paquets permettant de mettre une version plus à jour de cette librairie ici. Si vous êtes comme moi en 64 bits, c’est plus compliqué. Pour le moment, on va sagement attendre que quelqu’un se décide à faire le boulot 🙂
Il reste quelques pièges à éviter. Si sous avez activé le forwarding X11 sur votre connexion ssh, alors votre shell, celui qui lancera ps3_media_server, va avoir un display de paramétré. (Variable d’environnement). Cela va poser problème car le programme va croire qu’un écran graphique est disponible, et certains flux ne seront pas décodés correctement. Éditez donc le fichier PMS.sh et ajoutez au début du script la commande : « unset DISPLAY ».
Enfin, il faut aussi adapter la mémoire que java pourra utiliser. Si vous prévoyez de lire des flux en full HD, il va falloir fortement augmenter les valeurs indiquées. Toujours dans « PMS.sh », éditez la dernière ligne pour mettre : « exec « $JAVA » $JAVA_OPTS -Xmx1536M -Xss4096k …… » Cela fixera la mémoire maximum utilisable à 1,5 Go. (Je n’ai plus eu d’erreurs à partir de 1,2 ou 1,3 Go, mais tant qu’a faire…)
Configuration
Maintenant que le programme est prêt à tourner, il ne reste plus qu’a le configurer, le plus important étant de lui indiquer quels sont les répertoires à « partager ».
mkdir -p ~/.config/PMS
Puis, avec votre éditeur de texte préféré (normalement vi 😉 créez le fichier ~/.config/PMS/PMS.conf avec les lignes suivantes, en prenant bien soin d’adapter la liste des répertoires (folders), à votre configuration. Pour le détail des possibilités de ce fichier, allez voir dans la documentation. Une autre technique consiste à lancer une première fois l’application avec un affichage graphique, et d’utiliser le GUI pour faire toute la configuration, avant de récupérer le fichier obtenu. Moins fun, mais il faut l’avouer beaucoup plus « user friendly ». Edit : La documentation ubuntu contient également pas mal d’informations sur le sujet.
thumbnails = true mencoder_ass = false folders = /video,/musique skiploopfilter = false mencoder_mux_compatible = false mencoder_nooutofsync = false usecache = false thumbnail_seek_pos = 600 audio_thumbnails_method = 1 mencoder_encode = keyint=3:vqscale=2:vqmin=3 prevents_sleep_mode = true mencoder_disablesubs = false language = fr mencoder_audiolangs = fre,jpn,eng mencoder_subcp = ISO-8859-1 autoloadsrt = true mencoder_sublangs = fre,eng,jpn mencoder_subfribidi = false maxvideobuffer = 300 uuid = 5f5dd1ef-45b8-387c-a803-844dae1cd777
Une fois le fichier de configuration crée et enregistré à sa place, il ne reste plus qu’a lancer le programme en tapant : ./PMS.sh. Surveillez les fichiers de log pour voir comment tout fonctionne. Si vous avez de la chance, vos vidéos seront envoyées à vos clients. Si ça ne fonctionne qu’en partie, vous venez de découvrir le coté « Microsoftien du DLNA » 🙂
EDIT : Les versions se succèdent mais pour moi rien ne vaut la version 1.50. Toutes les versions supérieurs posent des problèmes que n’a pas cette version. Pourquoi ? Je sais pas.
Merci de tes explications sur le fonctionnement du DLNA /UPNP.
Effectivement, c’est de la daube et avec un fonctionnement très aléatoire selon les matériels utilisés mais cela s’amméliore.
Je fonctionne avec un Synology (et son service UPNP/DLNA sous linux). Ca marche pas trop mal depuis le dernier firmware. Pour preuve, je lis des mêmes des MKV sur ma PS3.
Il ne faut pas désespérer 🙂
« Pour preuve, je lis des mêmes des MKV sur ma PS3. ».
Ce qui compte, c’est plus le format d’encodage de la vidéo que le conteneur utilisé. La ps3 ne sait, en résumé, que lire le mpeg2 et le mpeg4, avec une compression en h264. (Et peut être deux ou trois autres, mais disons que ce sont les deux principaux). Donc, si ton mkv contient du h264, ton NAS n’aura qu’a lire le flux vidéo et à l’envoyer à la ps3. Le problème se posera si ton mkv contient un format plus exotique. Dans ce cas, je doute qu’il ai la puissance de calcul nécessaire pour faire de la conversion en temps réel, ou même que le logiciel soit prévu pour essayer !
C’est le gros avantage de ps3media_server. A condition de disposer de la puissance cpu nécessaire, il est théoriquement possible de lire depuis sa ps3 (ou autre), n’importe quelle vidéo que mplayer (et donc mencoder) saura lire. Autrement, dit, tout. y compris les mov, les flv etc.
Effectivement, je suis allé un peu vite en besogne en écrivant « Pour preuve, je lis des mêmes des MKV sur ma PS3. »
Le MKV reste qu’un conteneur.
Merci 🙂