Page 1 sur 2

[HOWTO] Serveur de Video On Demand - VLC+LINUX

Publié : dim. 27 nov. 2011 16:28
par Zedoune
Bonjour à tous ^^

Je m'embêtais ce matin alors j'ai décidé de me faire un serveur de VOD à l'aide de VLC. En distribution j'utilise Fedora 16 mais ça changera pas grand chose d'un linux à l'autre, surtout que j'ai pratiquement tout rendu paramétrable dans l'ignoble (c'est le cas ! :D ) script.

C'est la version 1.0 on va dire. Ça a l'air de fonctionner pas trop mal (prise en charge des accents et caractères à la con dans les noms de fichiers). Ca recréé l'arborescence d'un seul dossier Vidéos et ça créé des vignettes pour les vidéos.

Donc c'est parti !



Ce qu'il vous faut :

- vlc avec le bit SUID root
- un serveur web
- un nom de serveur ou une adresse ip
- bash
- ffmpeg (pour les miniatures)
- ImageMagick (pour pas faire de grosses miniatures, on doit pouvoir le faire avec ffmpeg mais c'est une usine à gaz ce truc)
- md5sum (il est installé par défaut, s'il l'est pas, changez de système immédiatement ! :D )


Ce qu'il ne faut pas :

- critiquer la non-lisibilité et la syntaxe de mon script qui est moche


Cas concret (le mien) :

Mes fichiers vidéos se trouvent dans /data/partage/Videos
La racine de mon serveur web se trouve dans /var/www/html/ (vérifier le droit d'écriture ! )
Mon répertoire perso est /home/zplay/

Les vignettes se trouvent par rapport à la racine du serveur web dans vignettes/
La liste des vidéos se trouve par rapport à la racine du serveur web dans vod/

Pourquoi j'ai pas mis vignettes dans vod ? Parce que le dossier vod est SUPPRIMÉ lors de la regénération de l'index des vidéos, et que les vignettes n'ont pas à être refaites et que ça prend trois plombes à générer ces vignettes :o


LE SCRIPT :
#!/bin/bash

#* Copyright (c) 1998, Regents of the University of California
#* All rights reserved.
#* Redistribution and use in source and binary forms, with or without
#* modification, are permitted provided that the following conditions are met:
#*
#*     * Redistributions of source code must retain the above copyright
#*       notice, this list of conditions and the following disclaimer.
#*     * Redistributions in binary form must reproduce the above copyright
#*       notice, this list of conditions and the following disclaimer in the
#*       documentation and/or other materials provided with the distribution.
#*     * Neither the name of the University of California, Berkeley nor the
#*       names of its contributors may be used to endorse or promote products
#*       derived from this software without specific prior written permission.
#*
#* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
#* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
#* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
#* DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
#* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
#* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
#* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
#* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
#* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
#* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


export IFS=$'\n'
DEBUG=1

REP=/var/www/html/vod			# repertoire qui contient l'arborescence
VIGNETTES=$REP/../vignettes/		# repertoire qui contient les vignettes (corriger un truc a la fin)
CONFIG=/home/zplay/config.vlc		# fichier de config de vlc
DATA=/data/partage/Videos/		# dossier avec les videos
ADDRESS=monserveurrienquamoi.no-ip.org		# adresse du serveur
PORT=554					# port de RTSP
rm -fr $REP && mkdir $REP		# RESET de l'arborescence !!!
rm $CONFIG

cd /$DATA

# pour tous les repertoiers des videos
for dir in `find . -type d`
do

	# creation d'un repertoire sans espaces
	dir2=$(echo $dir | sed 's/ /_/g')
	if [ $DEBUG -ne 0 ]; then echo "Creation de $REP/$dir2" ; fi
	mkdir -p $REP/$dir2
	echo "$dir" > $REP/$dir2/index.html


	# si le repertoire ne contient que des repertoires
	if [ $(find "$dir" -maxdepth 1 -type f | wc -l) -eq 0 ]
	then
		# On fait l'index des dossiers
		dossiers=$(find "$dir" -maxdepth 1 -type d | sort)
		for dossier in $dossiers
		do
			path_dossier=$(basename $dossier)
			dossier2=$(echo $path_dossier | sed 's/ /_/g')
			if [[ "$dossier" == "$dir" ]]
			then
				if [ $DEBUG -ne 0 ]; then echo "Creation de la remontee pour $path_dossier" ; fi
				echo "$path_dossier" >> $REP/$dir2/index.html
			else
				if [ $DEBUG -ne 0 ]; then echo "Creation des liens pour $path_dossier" ; fi
				echo "$path_dossier" >> $REP/$dir2/index.html
			fi
		done


	# si le repertoire ne contient que des fichiers !
	else

		# On fait l'index des fichiers
		for fichier in `find "$dir" -maxdepth 1 -type f | sort`
		do
			fichier=$(basename $fichier)
			touch $REP/$dir2/$fichier
			echo " $fichier" >> $REP/$dir2/index.html

			# CREATION CONFIG VLC
			# ---------------------------------------------------------------
			nom=$fichier
			nom=$(echo $nom | sed 's/ /_/g')
			echo "new \"$(echo $nom | md5sum | cut -d ' ' -f 1)\" vod enabled" >> $CONFIG
			echo "setup \"$(echo $nom | md5sum | cut -d ' ' -f 1)\" input \"$DATA/$dir/$fichier\"" >> $CONFIG
			# ---------------------------------------------------------------

			# CREATION VIGNETTES + RESIZE
			# ---------------------------------------------------------------
			if [ ! -f "$VIGNETTES/$fichier.jpg" ]
			then
				if [ $DEBUG -ne 0 ]; then echo "ffmpeg -loglevel quiet \"$dir/$fichier\" -ss 120 -t 1 -f image2 -sameq -vcodec mjpeg \"$VIGNETTES/$fichier.jpg\"" ; fi
				ffmpeg -loglevel quiet -i "$dir/$fichier" -ss 120 -t 1 -f image2 -sameq -vcodec mjpeg "$VIGNETTES/$fichier.jpg"
				convert "$VIGNETTES/$fichier.jpg" -resize 256x256 "$VIGNETTES/$fichier.jpg"
			fi
			# ---------------------------------------------------------------
		done
		echo "" >> $REP/$dir2/index.html
	fi
done
unset $IFS

echo "FIN DU SCRIPT"

Ensuite il suffit de lancer vlc avec le petit script suivant pour faire un peu propre. Vous inquiétez pas si c'est lent à se lancer, vlc utilise un cpu complet pendant 8 minutes sur un E8400 avec 380 vidéos.
#!/bin/bash

test -S /var/run/screen/S-zplay/*.vlc
if [ $? -ne 0 ]
then
	screen -dmS vlc vlc --vlm-conf /home/zplay/config.vlc
else
	echo "VLC est deja en cours d'execution !"
fi


Améliorations à faire :
- Mettre des CSS et faire des pages plus jolies
- Permettre de mélanger dossiers et fichiers dans un même répertoire
- Offrir une option de réencodage par défaut, si ça peut être utile.. pour faire de la vod avec un petit débit


Comment ça marche :

Le script parcours le dossier des Vidéos.
Pour chaque dossier, il regarde s'il y a des fichiers
- S'il y a des fichiers : il fait un fichier index.html avec la liste des fichiers, les ajoutes à la liste des fichiers VOD et fait les imagettes
- Sinon il fait un dossier index.html avec la liste des dossiers du dossier

Le nom du fichier dans le VOD est son nom passé au md5, ça évite d'avoir une url de streaming avec des accents, ce qui marche pas. C'est à peu près tout...


Limitation :
- Pour le moment, il n'est pas possible d'afficher un dossier qui contient des vidéos et des dossiers avec des vidéos. Selon la condition du dessus, s'il y a des fichiers, on ne scan pas les dossiers, faut que j'améliore ça mais comme mon arborescence est faite de cette manière, je ne rencontre pas le problème..

[HOWTO] Serveur de Video On Demand - VLC+LINUX

Publié : dim. 27 nov. 2011 19:12
par Alucardfh
Merci pour le topic,

Ça confirme l'idée que j'avais.

[HOWTO] Serveur de Video On Demand - VLC+LINUX

Publié : dim. 27 nov. 2011 19:38
par Larifounette
Heuuuu, t'as vraiment rien à faire de tes journées Zplay ...

[HOWTO] Serveur de Video On Demand - VLC+LINUX

Publié : dim. 27 nov. 2011 20:21
par Zedoune
Figure toi que j'ai passé un bon dimanche à faire ça ^^

[HOWTO] Serveur de Video On Demand - VLC+LINUX

Publié : dim. 27 nov. 2011 20:23
par Zedoune
Merci pour le topic,

Ça confirme l'idée que j'avais.

En fait ce script il automatise la configuration de vlc qui ressemble à ça pour un fichier
new "MA_video" vod enabled
setup "MA_video" input "/data/partage/Videos/ma video.avi"
On enchaine les lignes de ce genre et ça permet de lancer la lecture en demande rtsp://adresse:port/MA_video avec un lecteur vidéo compatible RTSP ^^

[HOWTO] Serveur de Video On Demand - VLC+LINUX

Publié : dim. 27 nov. 2011 20:31
par fighting_falcon
c'est énorme ! Merci pour le partage ! :)

[HOWTO] Serveur de Video On Demand - VLC+LINUX

Publié : lun. 28 nov. 2011 00:07
par kalistyan
+1 :jap:

[HOWTO] Serveur de Video On Demand - VLC+LINUX

Publié : lun. 28 nov. 2011 11:40
par Zedoune
Je vais modifier le truc pour faire 3 liens :

Qualité "normale" (essayer de mettre en place une qualité maximale avant encodage afin de pouvoir regarder des vidéos qui sont stockés en FULL HD)
Qualité "tablette" (utile ?)
Qualité "téléphone" (petite résolution)

Et peut être ajouter un paramètre essentiel :
CONN_RATE=120 # 120 ko/s maximum en débit sortant

Le top serait de pouvoir encoder les vidéos pour qu'elles passent toujours avec 80% de CONN_RATE qui est la connexion sortante.

Je dispose d'une fibre bouygues, j'ai 600 Ko/s en up je peux lire 3164 Mo pour un film de 1h30, j'ai pas trop de problème avec la plupart de mes vidéos. Mais pour un débit réduit, faut réencoder ^^

[HOWTO] Serveur de Video On Demand - VLC+LINUX

Publié : lun. 28 nov. 2011 13:56
par c0bw3b
Smartphones et tablettes partagent souvent les mêmes composants (Tegra ou Snapdragon ou Qualcomm) donc performances équivalentes.

AMHA deux catégories suffisent : qualité normale et qualité mobile devices.

[HOWTO] Serveur de Video On Demand - VLC+LINUX

Publié : lun. 28 nov. 2011 14:43
par Zedoune
Mon blackberry curve 8520 il a pas la puissance d'une tablette :o
Ni la résolution d'une tablette :D

De toute façon, si je suis capable de produire 2 profils différents, ce sera simple d'ajouter d'autres profiles ^^

Et t'en penses quoi du CONN_RATE décrit ci-dessus ?

[HOWTO] Serveur de Video On Demand - VLC+LINUX

Publié : lun. 28 nov. 2011 16:22
par poulpito
le conn_rate ouai super bonne idée

[HOWTO] Serveur de Video On Demand - VLC+LINUX

Publié : lun. 28 nov. 2011 18:03
par augur1
Je vais modifier le truc pour faire 3 liens :

Qualité "normale" (essayer de mettre en place une qualité maximale avant encodage afin de pouvoir regarder des vidéos qui sont stockés en FULL HD)
Qualité "tablette" (utile ?)
Qualité "téléphone" (petite résolution)

Et peut être ajouter un paramètre essentiel :
CONN_RATE=120 # 120 ko/s maximum en débit sortant

Le top serait de pouvoir encoder les vidéos pour qu'elles passent toujours avec 80% de CONN_RATE qui est la connexion sortante.

Je dispose d'une fibre bouygues, j'ai 600 Ko/s en up je peux lire 3164 Mo pour un film de 1h30, j'ai pas trop de problème avec la plupart de mes vidéos. Mais pour un débit réduit, faut réencoder ^^
ou tu testes le SVC "Codage vidéo scalable" qui remplacera le h264 AVC ;)
=> http://www.cameravideo.net/forum/news-d ... -unir.html

Image Image

En gros, c'est ce que permet le WMV mais en h264

:sol:

[HOWTO] Serveur de Video On Demand - VLC+LINUX

Publié : lun. 28 nov. 2011 19:00
par roro05
Plop Plop, étant un peu plus noob que la majorité d'entre vous, je me permet une question, j'ai tenté de faire ta config, mais sans succès, après s'être bien cassé la tête dessus avec alucard, on pencherais pour un soucis de firewall, du coup aurais tu la possibilité de m'aider pour les règles de pare-feu à effectuer.

Mon réseau

1 serveur-routeur sous debian avec 2 interfaces (1ip publique, 1 local (192.168.10.254)
1 serveur VLC derrière en local (192.168.10.2)

Je n'ai pas eu de soucis pour "nater" le HTTP mais pour le RTSP ça merdouille un peu.

Merci par avance de votre aide

[HOWTO] Serveur de Video On Demand - VLC+LINUX

Publié : mar. 29 nov. 2011 09:40
par Zedoune
si tu fais netstat -l tu vois bien que le port tcp rtsp est en écoute ? (554)

Je dois lancer vlc en root pour pouvoir utiliser ce port, et si je change j'ai pas réussi à faire fonctionner le streaming :??:
si le port est pas en écoute, c'est pas bon signe déjà ^^

[HOWTO] Serveur de Video On Demand - VLC+LINUX

Publié : mar. 29 nov. 2011 12:37
par Alucardfh
Bon le soucis est définitivement un problème de nattage de port :

Le SUID root sur vlc-wrapper suffit bien à binder le port 554 et via le vpn ça marche nikel.

Je pense qu'il va trouver comment passé les bonne règle dans son iptable.

Par contre j'vais surement modifier ton script pour le rendre un peu plus portable ^^

[HOWTO] Serveur de Video On Demand - VLC+LINUX

Publié : mar. 29 nov. 2011 14:20
par Zedoune
Ben à la rigueur, je préférerais qu'on se mette à deux dessus. Tu proposes quoi pour améliorer la portabilité ?

Déjà il faut mettre le plus de variables possibles, ce qui est pas le cas actuellement.


Et puis j'ai rencontré un problème ce midi. Ma copine qui a un MAC a lu des vidéos et ça a créé des petits fichiers à la con .DS_Store et .[jesaisplusquoi]nomdelavideo.avi

Du coup au lancement du script il a essayé de faire des miniatures et tout :D
Avec "file" ou "ffmpeg" doit y avoir moyen de vérifier facilement que l'on a affaire à une vidéo :)

[HOWTO] Serveur de Video On Demand - VLC+LINUX

Publié : mar. 29 nov. 2011 16:10
par biour
je sais pas ce qu'il y'a de pire
que tu ai une copine
ou qu'elle utilise un mac :o

[HOWTO] Serveur de Video On Demand - VLC+LINUX

Publié : mar. 29 nov. 2011 16:39
par Zedoune
je sais pas ce qu'il y'a de pire
que tu ai une copine
ou qu'elle utilise un mac :o
Ben au moins quand je suis chez elle, je peux ouvrir un terminal et faire du ssh pour bricoler des trucs si je suis d'astreinte :D

[HOWTO] Serveur de Video On Demand - VLC+LINUX

Publié : mar. 29 nov. 2011 20:32
par biour
commence comme cela et tu vas finir marier avec des gosses :sol:

[HOWTO] Serveur de Video On Demand - VLC+LINUX

Publié : mar. 29 nov. 2011 20:55
par dsebire
:D

[HOWTO] Serveur de Video On Demand - VLC+LINUX

Publié : mar. 29 nov. 2011 20:56
par poulpito
biour ta femme a pas de mac et pourtant ça t'as pas empêché de faire le chaud lapin :D
HS :D

[HOWTO] Serveur de Video On Demand - VLC+LINUX

Publié : mar. 29 nov. 2011 21:01
par Zedoune
Ca me paraît un bon plan ;)

[HOWTO] Serveur de Video On Demand - VLC+LINUX

Publié : mar. 29 nov. 2011 21:04
par augur1
Plutôt que de vous casser la tête avec VLC, vous ne voulez pas essayer Razuna ?
=> http://razuna.org/
... qui en plus de gérer les fichiers, peut encoder en streamer directement dans une fenêtre Web ;)

Image

++

[HOWTO] Serveur de Video On Demand - VLC+LINUX

Publié : mar. 29 nov. 2011 21:14
par poulpito
peut être parce que c'est super lourd comme truc :D et que c'est du java !beuuuuuurkkkkk !!!

[HOWTO] Serveur de Video On Demand - VLC+LINUX

Publié : mar. 29 nov. 2011 21:47
par Alucardfh
Ben à la rigueur, je préférerais qu'on se mette à deux dessus. Tu proposes quoi pour améliorer la portabilité ?

Déjà il faut mettre le plus de variables possibles, ce qui est pas le cas actuellement.

Oui je suis d'accord faut mettre tout ce qui peut changer dans des variables.

Autre chose, j'ai pas trop trop eut le temps de me pencher sur la chose, mais la génération des miniatures avec ffmepg ne marche pas à tout les coups.

Me faudrait quelque éclaircissement sur la ligne :

[cpp] ffmpeg -loglevel quiet -i "$dir/$fichier" -ss 120 -t 1 -f image2 -sameq -vcodec mjpeg "$VIGNETTES/$fichier.jpg" [/cpp]

D'après le man j'en ai déduit ça :

-ss 120 -> se place à 120 secondes dans la vidéo
-t 1 -> ne prend qu'une seconde de vidéo
-f image2 -> ???
-sameq -> le man dit que ça a un rapport avec le fait que la vidéo soit en vbr mais ça me parle pas trop
-vcodec -> ça sert a spécifier codec de sortie, non ?