URL: https://linuxfr.org/users/steph1978/journaux/lecture-video-sur-reseau-local Title: lecture vidéo sur réseau local Authors: steph1978 Date: 2025年11月24日T01:40:20+01:00 License: CC By-SA Tags: vidéo, dlna, upnp, mediacenter et upnp-av Score: 24 Si vous avez une Freebox, VLC une TV dite "connectée" ou une console de salon, vous disposez du protocole [UPnP-AV](https://fr.wikipedia.org/wiki/Universal_Plug_and_Play), 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](https://cdn-0.plantuml.com/plantuml/png/LOz12i8m44NtESNOZQjSG4GgTLi8AReVx10AoKGcquAtDrOgklpllSrlYwBedABPFGH3GeZupBD2IQJ8Q30GApHTPfKSmUM9jG4iqBdDzJHE20F9GhAgVlXNddWasQGtdGDhJpM30rmTEtk-VPd_OJKusWyAf51K29FPL_nE1ys2WUhswxxGCjt9jCHZ_VC2) 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](https://cdn-0.plantuml.com/plantuml/png/SoWkIImgAStDuKfCJyqhKL3oJKt9J5G8JYqgIorIKaWiLl0DXaavv-UL5ENdA0JaP-QLnEH1L0QbvgMa5i7K1d7v1YdesW4rALWfX0Ra1UWwXY4BfQUMA1IN5AKcvd8v03K2xGK0) ## 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](https://fr.wikipedia.org/wiki/Simple_Service_Discovery_Protocol), qui se base sur la [multidiffusion](https://fr.wikipedia.org/wiki/Multicast). En gros, le _control point_ hurle en UDP sur l'adresse de multicast `239.255.255.250`, sur le port [1900](https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.txt#:~:text=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](https://fr.wikipedia.org/wiki/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](https://gerbera.io/) Pour ma part, j'ai d'abord installé Gerbera, un fork de [mediatomb](http://mediatomb.cc), 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](https://git.sr.ht/~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. ![](https://img.plantuml.biz/plantuml/png/LK_B2e9G4DtVhvZSjD8FY0Z35cw4ozNQ3pg8S1zn7OM8_ht9C6mtvpMSau-CaITdrUuUiNS85XzXOXWTCNfKs9DdI8hWEGOBEWoU4y0H2hrg5NK3WY7VKQIuY9LHaLfvq5k2vx-nfZYljdgLogRHMwLKBrLeIDEJcE00L-rrUhxzEBFXIZYcNwOdASwHq2b9PPcysSlnITGSP1y9DWk-q3oqf79fBUlV) ## 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](https://acme.com/) (je croyais que cette entreprise n'existait que dans les [Looney Tunes](https://fr.wikipedia.org/wiki/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](https://acme.com/software/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. ```bash #!/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_TM ![dans VLC](https://www.zoocoop.com/vlc_upnp.png) 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

AltStyle によって変換されたページ (->オリジナル) /