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

Avatar de l’utilisateur
Zedoune
Messages : 15343
Inscription : ven. 12 janv. 2018 17:44

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

Message 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..
Alucardfh
Messages : 1053
Inscription : ven. 12 janv. 2018 17:44

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

Message par Alucardfh »

Merci pour le topic,

Ça confirme l'idée que j'avais.
Avatar de l’utilisateur
Larifounette
Messages : 7803
Inscription : ven. 12 janv. 2018 17:44
Localisation : Maine et Loire

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

Message par Larifounette »

Heuuuu, t'as vraiment rien à faire de tes journées Zplay ...
Avatar de l’utilisateur
Zedoune
Messages : 15343
Inscription : ven. 12 janv. 2018 17:44

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

Message par Zedoune »

Figure toi que j'ai passé un bon dimanche à faire ça ^^
Avatar de l’utilisateur
Zedoune
Messages : 15343
Inscription : ven. 12 janv. 2018 17:44

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

Message 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 ^^
fighting_falcon
Messages : 656
Inscription : ven. 12 janv. 2018 17:44

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

Message par fighting_falcon »

c'est énorme ! Merci pour le partage ! :)
kalistyan
Messages : 14259
Inscription : ven. 12 janv. 2018 17:44
Localisation : LYON
Contact :

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

Message par kalistyan »

+1 :jap:
Avatar de l’utilisateur
Zedoune
Messages : 15343
Inscription : ven. 12 janv. 2018 17:44

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

Message 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 ^^
Avatar de l’utilisateur
c0bw3b
Messages : 5521
Inscription : ven. 12 janv. 2018 17:44
Localisation : Lyon

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

Message 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.
Avatar de l’utilisateur
Zedoune
Messages : 15343
Inscription : ven. 12 janv. 2018 17:44

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

Message 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 ?
Avatar de l’utilisateur
poulpito
Messages : 12402
Inscription : ven. 12 janv. 2018 17:44
Localisation : Grenoble

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

Message par poulpito »

le conn_rate ouai super bonne idée
Avatar de l’utilisateur
augur1
Messages : 13167
Inscription : ven. 12 janv. 2018 17:44
Localisation : où tout est neuf et tout est sauvage
Contact :

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

Message 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:
roro05
Messages : 20
Inscription : ven. 12 janv. 2018 17:44

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

Message 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
Avatar de l’utilisateur
Zedoune
Messages : 15343
Inscription : ven. 12 janv. 2018 17:44

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

Message 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à ^^
Alucardfh
Messages : 1053
Inscription : ven. 12 janv. 2018 17:44

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

Message 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 ^^
Avatar de l’utilisateur
Zedoune
Messages : 15343
Inscription : ven. 12 janv. 2018 17:44

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

Message 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 :)
Avatar de l’utilisateur
biour
Messages : 24390
Inscription : ven. 12 janv. 2018 17:44

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

Message par biour »

je sais pas ce qu'il y'a de pire
que tu ai une copine
ou qu'elle utilise un mac :o
Image
Avatar de l’utilisateur
Zedoune
Messages : 15343
Inscription : ven. 12 janv. 2018 17:44

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

Message 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
Avatar de l’utilisateur
biour
Messages : 24390
Inscription : ven. 12 janv. 2018 17:44

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

Message par biour »

commence comme cela et tu vas finir marier avec des gosses :sol:
Image
Avatar de l’utilisateur
dsebire
Messages : 13160
Inscription : ven. 12 janv. 2018 17:44
Localisation : Loiret - entre la ville et les champs

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

Message par dsebire »

:D
Avatar de l’utilisateur
poulpito
Messages : 12402
Inscription : ven. 12 janv. 2018 17:44
Localisation : Grenoble

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

Message 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
Avatar de l’utilisateur
Zedoune
Messages : 15343
Inscription : ven. 12 janv. 2018 17:44

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

Message par Zedoune »

Ca me paraît un bon plan ;)
Avatar de l’utilisateur
augur1
Messages : 13167
Inscription : ven. 12 janv. 2018 17:44
Localisation : où tout est neuf et tout est sauvage
Contact :

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

Message 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

++
Avatar de l’utilisateur
poulpito
Messages : 12402
Inscription : ven. 12 janv. 2018 17:44
Localisation : Grenoble

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

Message par poulpito »

peut être parce que c'est super lourd comme truc :D et que c'est du java !beuuuuuurkkkkk !!!
Alucardfh
Messages : 1053
Inscription : ven. 12 janv. 2018 17:44

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

Message 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 ?

Répondre