Journal lecture vidéo sur réseau local

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
24
nov.
2025

Si vous avez une Freebox, VLC une TV dite "connectée" ou une console de salon, vous disposez du protocole UPnP-AV, qui permet de lire sur un périphérique les contenus media stockés sur un autre périphérique présent sur le réseau local.

Protocole

UPnP-AV définit trois rôles :

  • le control point, en gros la télécommande
  • le media server, chargé de stocker, présenter et diffuser le contenu
  • le media renderer, chargé de jouer le media, audio et/ou vidéo, sur un périphérique, haut parleur et écran

rôles UPnP-AV

Le control point pilote le media server et le media renderer.

Dans la pratique, le control point et le media renderer peuvent ne faire qu'un :

control point et media renderer combinés

Découverte

Qui dit plug and play dit pas de configuration. Alors comment le control point a connaissance des media servers et media renderers disponibles sur le réseau ? Avec le "protocole simple de découverte de services", en anglais "Simple Service Discovery Protocol", SSPD, qui se base sur la multidiffusion.

En gros, le control point hurle en UDP sur l'adresse de multicast 239.255.255.250, sur le port 1900: "qui est là ?". Et les services présents répondent en UDP, en donnant leur nature (upnp) et l'adresse où ils peuvent être joint.

Le reste du dialogue entre le control point et un services se fait de manière plus classique, en unicast, en SOAP, c'est à dire du XML sur HTTP.

En résumé, si vous voulez lire les media de votre PC sur la Freebox ou dans VLC sur une autre machine, il suffit de disposer d'un media server UpnP-AV.

Gerbera

Pour ma part, j'ai d'abord installé Gerbera, un fork de mediatomb, que j'avais utilise sur un NAS.

Gerbera est un media server bourré de fonctionnalités: interface web, support des icônes, des couvertures, des sous-titres, plugins pour exposer des sources externes, etc.

C'est, de fait, un logiciel plutôt complexe (C++, 152 fichiers, 22'537 uloc). Mais facile à installer et à configurer.

Son principal défaut, je trouve, est que la source de vérité de Gerbera est sa base de données et qu'il doit régulièrement synchroniser le contenu du système de fichiers pour la maintenir à jour. Et qui dit synchro dit dé-synchro.

J'ai commencé à avoir des galères lorsque j'ai voulu ajouter des fichiers de sous-titre. La configuration est un peu compliquée et les fichiers n'étaient pas vus, ni par la Box ni par VLC.

Je me suis dit que ce serait tellement plus simple avec un logiciel tout bête qui se contente d'exposer le système de fichiers directement et sans fioritures.

mcf/upnp-av

J'ai testé pas mal de candidats pour finalement dénicher mcf/upnp-av.

Il est tout simple (C, 5 fichers, 1'121 uloc). A tel point qu'il ne délivre pas lui même le contenu : il faut lui adjoindre un serveur HTTP pointant sur le même répertoire.

Il fait donc uniquement la réponse à la découverte de service et le listing du contenu.

Serveur HTTP

Je me suis alors mis en quête d'un serveur HTTP ; surtout pas de la trempe d'un Apache HTTPd ou d'un nginx mais le plus simple possible.

Je suis tombé sur la page des logiciels de l'ACME Laboratories (je croyais que cette entreprise n'existait que dans les Looney Tunes).

Le micro et le mini sont trop limités ; l'un ne supporte pas les ranges HTTP, nécessaire pour sauter à n'importe quel endroit d'un media ; l'autre ne supporte pas l'urlencoded tel que présenté dans le par le media server. Mais le thttpd fait le boulot. Un peu plus que nécessaire d'ailleurs…

Mise en œuvre

Les deux logiciels se compilent très facilement, à coup de configure et de make.

J'ai écrit un bout de script shell pour lancer le tout.

#!/bin/sh -eu

CMDD=$(dirname $(realpath $0))
PATH="${CMDD}:${PATH}"

# following ports must be allowed in FW : 1900/udp, 8000/tcp, 39053/tcp
# thttpd require the files to be 644

media="${1}"
uuid="${2:-f84d2a96-c8c0-11f0-b723-37fd10a4e15a}"

mediaserver_ip="$(ip route get 9.9.9.9 | awk '{print $7; exit}')"
mediaserver_port="39053"

stream_ip="${mediaserver_ip}"
stream_port="8000"

thttpd -D -p "${stream_port}" -d "${media}" &

upnp-mediaserver -l "${mediaserver_ip}" -p "${mediaserver_port}" -C "${media}" "${uuid}" "http://${stream_ip}:${stream_port}/"

Il serait préférable de le réécrire en unité systemd pour faire plus propre.

Conclusion

And … It works

dans VLC

J'aime cette approche à la Unix : un programme qui fait une chose et le fait bien ; que l'on combine à d'autres pour arriver à la fonctionnalité voulue.

Idéalement, j'aimerai sortir la fonctionnalité de listing de contenus pour la déléguer à un programme externe, et ne plus être contraint de mettre le serveur HTTP et le media server au même endroit.

Bon visionnage

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.