mercredi 12 septembre 2012

Serveur UPnP et Raspberry Pi


Préambule


Pour ce billet de rentrée, je vais expliquer comment intégrer un serveur UPnP (Universal Plug & Play) à notre Raspberry Pi. Le serveur UPnP servira à partager tous types de documents multimédia sur un réseau (audio, image et vidéo).
Il est biensur possible d'utiliser le fameux media center XBMC (porté pour la raspberry pi) pour partager et visualiser les documents, mais dans mon cas, je souhaite quelque chose de leger, de facile à administrer et j'ai toujours pas envie de brancher ma RasPi sur ma télévision. ;-).

Je me suis tourné vers le serveur GPL UPnP MediaTomb. Il me permet entre autre d'administrer mon serveur via une page web, de faire du transcodage, de faire des miniatures et pleins de bonnes choses encore.


Nativement, le packge MediaTomb n'est pas présent dans l'environnement Buildroot, on va commencer par ajouter ce paquet à buildroot pour le configurer, le compiler et l'installer sur notre cible.




Installation de nos paquets


libMP4v2


Avant d'attaquer l'ajout de mediatomb, on va commencer par une libraire MP4v2, non présente dans l'environnement Buildroot. Cette librairie sert à la manipulation de fichiers au format MP4 (dérivé du format Apple QuickTime).

Je vous fourni le tarball libmp4v2.tar.gz util à la création de notre paquet dans l'environnement buildroot. Dans cette archive, deux fichiers sont présents :
  • Config.in : Fichier de description de notre application
  • libmp4v2.mk : Makefile de téléchargement, configuration, compilation et installation de notre executable.
 On va décompresser cette archive dans le sous dossier package de buildroot

# tar xvzf libmp4v2.tar.gz -C BUILDROOT_PATH/package/

Le fichier Config.in :

config BR2_PACKAGE_LIBMP4V2
 bool "libmp4v2"
 help
   The MP4v2 library provides an API to create and 
   modify mp4 files as defined by ISO-IEC:14496-1:2001 MPEG-4 Systems. 
   This file format is derived from Apple's QuickTime file format that 
   has been used as a multimedia file format in a variety of platforms and applications.

   http://code.google.com/p/mp4v2/

Le fichier libmp4v2.mk :

#############################################################
#
# libmp4v2
#
#############################################################
LIBMP4V2_VERSION = 2.0.0
LIBMP4V2_SOURCE = mp4v2-$(LIBMP4V2_VERSION).tar.bz2
LIBMP4V2_SITE = http://mp4v2.googlecode.com/files
LIBMP4V2_INSTALL_STAGING = YES
LIBMP4V2_INSTALL_TARGET = YES

define LIBMP4V2_UNINSTALL_TARGET_CMDS
 rm -f $(TARGET_DIR)/usr/bin/mp4*
 rm -f $(TARGET_DIR)/usr/lib/libmp4v2*
endef

define LIBMP4V2_UNINSTALL_STAGING_CMDS
 rm -f $(STAGING_DIR)/usr/bin/mp4*
 rm -rf $(STAGING_DIR)/usr/include/mp4v2
 rm -f $(STAGING_DIR)/usr/lib/libmp4v2*
endef

$(eval $(call AUTOTARGETS))

Je vous conseille d'aller voir la documentation de buildroot concernant l'ajout de nouveaux paquets.

Il va falloir ensuite indiquer à buildroot qu'un nouveau paquet à été créé, pour cela, on va modifier le fichier de configuration général (Config.in) du sous dossier package et lui rajouter la ligne surligné dans la section multimedia.

menu "Multimedia"
source "package/libdvdread/Config.in"
source "package/libdvdnav/Config.in"
source "package/libmms/Config.in"
source "package/libmpeg2/Config.in"
source "package/libogg/Config.in"
source "package/libplayer/Config.in"
source "package/libtheora/Config.in"
source "package/live555/Config.in"
source "package/mediastreamer/Config.in"
source "package/libmp4v2/Config.in"
endmenu

L'installation de cette librairie est finie (nous n'avons pas besoin lancer une compilation pour le moment, ce sera fait lors de la compilation de mediatomb puisque c'est une dépendance de celui-ci), nous allons passer à l'installation de notre serveur dans buildroot. Le principe d'installation va être exactement identique que pour cette librairie.

mediatomb

Je vous fourni le tarball mediatomb.tar.gz util à la création de notre paquet dans l'environnement buildroot. Dans cette archive, trois fichiers sont présents :
  • Config.in : Fichier de description de notre application
  • mediatomb.mk : Makefile de téléchargement, configuration, compilation et installation de notre executable.
  • mediatomb.patch : Patch qui sera appliqué par buildroot lors de la compilation du serveur
 On va décompresser cette archive dans le sous dossier package de buildroot

# tar xvzf mediatomb.tar.gz -C BUILDROOT_PATH/package/

Le fichier Config.in :

config BR2_PACKAGE_MEDIATOMB
 bool "mediatomb"
 select BR2_PACKAGE_SQLITE
 select BR2_PACKAGE_EXPAT
 help
   MediaTomb is an open source (GPL) UPnP MediaServer with a nice web user interface, 
   it allows you to stream your digital media through your home network 
   and listen to/watch it on a variety of UPnP compatible devices.
   MediaTomb implements the UPnP MediaServer V 1.0 specification that can be found on http://www.upnp.org/. 
   The current implementation focuses on parts that are required by the specification, 
   however we look into extending the functionality to cover the optional parts of the spec as well.
   MediaTomb should work with any UPnP compliant MediaRenderer, 
   please tell us if you experience difficulties with particular models, 
   also take a look at the Supported Devices list for more information.

Le fichier mediatomb.mk :

#############################################################
#
# mediatomb
#
#############################################################

MEDIATOMB_VERSION = 0.12.1
MEDIATOMB_SOURCE = mediatomb-$(MEDIATOMB_VERSION).tar.gz
MEDIATOMB_SITE = http://downloads.sourceforge.net/mediatomb
MEDIATOMB_INSTALL_STAGING = YES

# avoid enable static option in makefile
SHARED_STATIC_LIBS_OPTS = --enable-shared

# sqlite3 paths ugly !!!
MEDIATOMB_CONF_OPT = \
   --disable-rpl-malloc \
   --enable-pthread-lib \
   --disable-mysql \
   --disable-libmagic \
   --disable-lastfmlib \
   --disable-id3lib \
   --with-search=$(STAGING_DIR)/usr/include \
   --with-sqlite3-h=$(BUILD_DIR)/sqlite-$(SQLITE_VERSION) \
   --with-sqlite3-libs=$(TARGET_DIR)/usr/lib \
   --with-expat-h=$(BASE_DIR)/host/usr/include \
   --with-expat-libs=$(STAGING_DIR)/usr/lib
   
ifeq ($(BR2_PACKAGE_CURL),y)
MEDIATOMB_CONF_OPT += \
    --enable-curl \
    --with-curl-cfg=$(BASE_DIR)/host/usr/arm-unknown-linux-gnueabi/sysroot/usr/bin/curl-config
MEDIATOMB_DEPENDENCIES += libcurl
endif

ifeq ($(BR2_PACKAGE_LIBEXIF),y)
MEDIATOMB_CONF_OPT += \
    --with-libexif-h=$(STAGING_DIR)/usr/include \
    --with-libexif-libs=$(STAGING_DIR)/usr/lib
MEDIATOMB_DEPENDENCIES += libexif
else
MEDIATOMB_CONF_OPT += \
    --disable-libexif
endif

ifeq ($(BR2_PACKAGE_TAGLIB),y)
MEDIATOMB_CONF_OPT += \
    --with-taglib-cfg=$(STAGING_DIR)/usr/bin/taglib-config
MEDIATOMB_DEPENDENCIES += taglib
else
MEDIATOMB_CONF_OPT += \
    --disable-taglib
endif

ifeq ($(BR2_PACKAGE_ZLIB),y)
MEDIATOMB_CONF_OPT += \
    --with-zlib-h=$(BASE_DIR)/host/usr/include
    --with-zlib-libs=$(STAGING_DIR)/usr/lib
MEDIATOMB_DEPENDENCIES += zlib
else
MEDIATOMB_CONF_OPT += \
    --disable-zlib
endif

ifeq ($(BR2_PACKAGE_LIBMP4V2),y)
MEDIATOMB_CONF_OPT += \
    --with-libmp4v2-h=$(STAGING_DIR)/usr/include
    --with-libmp4v2-libs=$(STAGING_DIR)/usr/lib
MEDIATOMB_DEPENDENCIES += libmp4v2
else
MEDIATOMB_CONF_OPT += \ 
    --disable-libmp4v2
endif

$(eval $(call AUTOTARGETS))

Sans oublier d'ajouter notre paquet à buildroot avec la modification du fichier de configuration générale des paquets (Config.in) dans le sous dossier package :

menu "Multimedia"
source "package/libdvdread/Config.in"
source "package/libdvdnav/Config.in"
source "package/libmms/Config.in"
source "package/libmpeg2/Config.in"
source "package/libogg/Config.in"
source "package/libplayer/Config.in"
source "package/libtheora/Config.in"
source "package/live555/Config.in"
source "package/mediastreamer/Config.in"
source "package/libmp4v2/Config.in"
source "package/mediatomb/Config.in"
endmenu

Ce paquet fait appel à de nombreuses dépendances, 2 sont obligatoires et automatique cochées (sqlite3 et libexpat) lors de l'activation de celui-ci, les autres dépendances sont fortement recommandées, donc il va falloir cocher préalablement, les paquets :
  • curl
  • zlib
  • taglib
  • libmp4v2
  • libexif

Pour choisir les paquets, Entrer la commande à la racine de buildroot :

# make menuconfig

 Le paquet mediatomb fraichement créé dans buildoot se trouve dans le sous menu "multimedia" de "library'.


Il ne reste plus qu'à compiler et installer le tout :
# make

 A la fin de la configuration du paquet, un rapport est affiché :

CONFIGURATION SUMMARY ----

sqlite3               : yes
mysql                 : disabled
libjs                 : missing
libmagic              : 
inotify               : no
libexif               : yes
id3lib                : disabled
taglib                : yes
libmp4v2              : yes
ffmpeg                : yes
ffmpegthumbnailer     : missing
lastfmlib             : disabled
external transcoding  : yes
curl                  : yes
YouTube               : yes
libextractor          : disabled
db-autocreate         : yes

Une fois la compilation terminée, nous pouvons vérifier que le serveur est bien installé :

# ls -al BUILDROOT_PATH/output/target/usr/bin/mediatomb
-rwxr-xr-x 1 sinseman44 sinseman44 1153596 2012-09-11 19:14 mediatomb

et les fichiers de configuration :

# ls -al BUILDROOT_PATH/output/target/usr/share/mediatomb
drwxrwxr-x  4 sinseman44 sinseman44 4096 2012-09-11 19:14 .
drwxrwxr-x 25 sinseman44 sinseman44 4096 2012-09-11 19:14 ..
drwxrwxr-x  2 sinseman44 sinseman44 4096 2012-09-11 19:14 js
-rw-r--r--  1 sinseman44 sinseman44 1362 2012-09-11 19:14 mappings.xml
-rw-r--r--  1 sinseman44 sinseman44 3820 2012-09-11 19:14 mysql.sql
-rw-r--r--  1 sinseman44 sinseman44 2933 2012-09-11 19:14 sqlite3.sql
drwxrwxr-x  4 sinseman44 sinseman44 4096 2012-09-11 19:14 web

Je vous conseille d'aller voir un ancien tutoriel, pour la mise à jour du système de fichiers sur la carte SD avec les nouvelles applications fraichement installées.

Utilisation de mediatomb

Sur notre carte, on peut vérifier le bon fonctionnement de notre serveur à l'aide de la commande :

# /usr/bin/mediatomb --version

MediaTomb UPnP Server version 0.12.1 - http://mediatomb.cc/

===============================================================================
Copyright 2005-2010 Gena Batsyan, Sergey Bostandzhyan, Leonhard Wimmer.
MediaTomb is free software, covered by the GNU General Public License version 2

Lancement du serveur à la main


On peut démarrer le serveur "à la main" (voir l'aide pour les différentes options) :

# /usr/bin/mediatomb -d -e eth0 -p 8080
Running mediatomb to start UPnP server
1970-01-01 00:09:53    INFO: Loading configuration from: /root/.mediatomb/config.xml
1970-01-01 00:09:53    INFO: Checking configuration...
1970-01-01 00:09:53    INFO: Setting filesystem import charset to ANSI_X3.4-1968
1970-01-01 00:09:53    INFO: Setting metadata import charset to ANSI_X3.4-1968
1970-01-01 00:09:53    INFO: Setting playlist charset to ANSI_X3.4-1968
1970-01-01 00:09:53 WARNING: You enabled the YouTube feature, which allows you
                             to watch YouTube videos on your UPnP device!
                             Please check http://www.youtube.com/t/terms
                             By using this feature you may be violating YouTube
                             service terms and conditions!

1970-01-01 00:09:53    INFO: Configuration check succeeded.

il va démarrer en mode démon, sur l'interface réseau eth0, avec l'interface web sur le port 8080.
Pour avoir accès à l'interface web, ouvrer votre navigateur web favori et entrer l'adresse : http://RASPI_IP_ADDR:8080 (en remplaçant RASPI_IP_ADDR par celle qui va bien)



Lancement du serveur au démarrage de la carte


Copier le script S51upnpd dans le sous-dossier board/raspberrypi de buildroot et modifier le script post-build.sh dans ce même sous-dossier, et rajouter la ligne surlignée :

TARGETDIR=$1
# Set root password to 'root'. Password generated with
# mkpasswd, from the 'whois' package in Debian/Ubuntu.
sed -i 's%^root::%root:8kfIfYHmcyQEE:%' $TARGETDIR/etc/shadow

# Generate boot config files
echo "dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait" > $TARGETDIR/boot/cmdline.txt
echo "disable_overscan=1" > $TARGETDIR/boot/config.txt
echo "arm_freq=800" >> $TARGETDIR/boot/config.txt

# Point /bin/sh to /bin/bash
ln -T -s /bin/bash $TARGETDIR/bin/sh 

# Package the /boot partition
tar -czf $TARGETDIR/../images/boot.tar.gz --exclude=Image -C $TARGETDIR/boot/ .

# add a corrected, and lightweight inittab
#cp board/raspberrypi/inittab $TARGETDIR/etc/inittab

# add eth0 dhcp entry into /etc/network/interfaces
cp board/raspberrypi/interfaces $TARGETDIR/etc/network/

# make sure that ntpdate is run before sshd is started
cp board/raspberrypi/S41ntpdate $TARGETDIR/etc/init.d/
cp board/raspberrypi/S51upnpd $TARGETDIR/etc/init.d/
chmod a+x $TARGETDIR/etc/init.d/S41ntpdate

Ce script vous permettra de faire la même chose que la ligne de commande lancée précedement mais automatique au démarrage du système. Je vous conseille d'aller jeter un coup d'oeil à la documentation de mediatomb pour plus d'infos (utilisation avec une télévision connectée et/ou une console type PS3 ou XBOX 360, etc ...).

Amusez-vous bien avec ...

Aucun commentaire:

Enregistrer un commentaire