Journal lecture vidéo sur réseau local

Posté par  . Licence CC By‑SA.
Étiquettes :
24
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

  • # Ready Media / minidlna

    Posté par  . Évalué à 6 (+4/-0).

    Merci pour cette découverte, c'est très intéressant.

    Pour ma part, j'utilise Ready Media (ex miniDLNA) depuis des années, simple et efficace.

    Celui qui pose une question est bête cinq minutes, celui qui n'en pose pas le reste toute sa vie.

    • [^] # Re: Ready Media / minidlna

      Posté par  . Évalué à 2 (+2/-2).

      Cela a fait partie des candidats que j'ai regardé.

      Mais j'ai été un peu refroidi par ses 132 dépendances : ux-vdso, jpeg, id3tag, sqlite3, avformat, avutil, exif, FLAC, vorbis, ogg, c, z, m, avcodec, xml2, bz2, gme, openmpt, chromaprint, bluray, gnutls, rabbitmq, srt-gnutls, ssh-gcrypt, zmq, va-drm, va, va-x11, vdpau, X11, drm, mfx, OpenCL, b64/ld-linux-x86-64, swresample, vpx, webpmux, webp, lzma, aribb24, dav1d, opencore-amrwb, rsvg-2, gobject-2, glib-2, cairo, zvbi, snappy, aom, codec2, gsm, mp3lame, opencore-amrnb, openjp2, opus, shine, speex, theoraenc, theoradec, twolame, vo-amrwbenc, vorbisenc, x264, x265, xvidcore, icuuc, stdc++, gcc_s, mpg123, vorbisfile, fontconfig, freetype, udfread, p11-kit, idn2, unistring, tasn1, nettle, hogweed, gmp, ssl, crypto, gcrypt, gpg-error, gssapi_krb5, bsd, sodium, pgm-5, norm, Xext, Xfixes, xcb, soxr, png16, cairo-gobject, gdk_pixbuf-2, gio-2, pangocairo-1, pango-1, ffi, pcre, pixman-1, xcb-shm, xcb-render, Xrender, numa, pthread, icudata, expat, uuid, brotlidec, krb5, k5crypto, com_err, krb5support, md, Xau, Xdmcp, gomp, gmodule-2, mount, selinux, pangoft2-1, harfbuzz, fribidi, thai, brotlicommon, keyutils, resolv, blkid, pcre2-8, graphite2, datrie ; dixit ldd.

      • [^] # Re: Ready Media / minidlna

        Posté par  . Évalué à 3 (+2/-1).

        Pour celle/celui qui a jugé mon commentaire précédent "inutile", je vais compléter.

        Avoir 130 dépendances n'est pas un soucis en soit si cela peut se résoudre par un apt install ou équivalent. Mais

        1/ même dans ce cas, ça prend pas mal de place (j'ai un SSD interne de 32GB).

        2/ dans Debian, c'est la version 1.3.0 qui est packagée alors que la 1.3.3 est sortie.

        3/ si je veux l'installer sur un système pour lequel le paquet n'existe pas, je dois passer par la case compilation et là c'est for 1..130; do ./configure; echo install missing deps; done

  • # par rapport à DLNA

    Posté par  . Évalué à 4 (+3/-0).

    Ton poste me fait beaucoup penser au protocole DLNA (j'ai même l'impression que c'est de ça dont tu parles).

    J'avais mis ça en route il y a 10 sur un PC avec Ubuntu (passé depuis à Debian) pour partager une télé.

    Avec minidlna, c'est vrai très très rapide:

    sudo apt install minidlna
    

    éditer le fichier /etc/minidlna.conf et ajouter les chemins à surveiller, par exemple:

    media_dir=/mnt/videodisk
    

    Il est possible d'ajouter cette ligne autant de fois qu'il y a de chemins à vérifier.

    on redémarre le service :

    sudo systemctl restart minidlna.service
    

    Et c'est parti, le temps d'arriver à la TV, on a un logo Debian dans les sources vidéos, et accès à nos vidéos.

    Les vrais naviguent en -42

  • # Freebox

    Posté par  (Mastodon) . Évalué à 1 (+0/-0).

    J'ai VLC sur la TV, j'active UPnP Av sur la Freebox (Delta) et c'est ok.

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.