Pages : 1
#1 Le 23/07/2008, à 15:37
- kao_chen
[bash] VLC traitement par lot
Salut tout le monde,
Je viens de découvrir le bash, et je commence à explorer quelques-unes de ces possibilités.
Pour m'entrainer, j'ai voulu créer un système de conversion, par lot, de vidéo.
Ma copine m'a suggérer cette idée pour l'aider à convertir ces nombreuses vidéos pour son baladeur vidéo.
Elle a rajouté une petite difficulté, à l'exercice, en souhaitant incruster les sous-titres dans le fichier vidéo.
Je me suis donc naturellement tourné vers VLC pour la conversion et son système de soverlay pour l'incrust des sous titres.
Bref voici un script qui fonctionne, chez moi, qui est loin d'être parfais et que je souhaite améliorer.
Il créé sur le bureau 3 dossiers dans lequel il faut placer les vidéos pour qu'il puissent travailler.
Ensuite il convertie le premier fichier qu'il trouve, et incruste les sous-titres s'ils sont présents.
Je vais essayer de trouver une solus pour que l'on puisse choisir le dossier de travail, ainsi que le dossier de destination.
#!/bin/sh
#Définition des différent réglages de conversion
SettingsVLC=mp4v,vb=1024,width=640,height=480,acodec=mp4a,ab=192,channels=2,
#Définition de l'extension du fichier de sortie
Ext=mp4
#Fonction de récupération automatique des noms de fichier vidéos et soustitres et création du nom de fichier de sortie
FCrecupnomdefichier() {
cd ~/Bureau/Convertisseur/Video
# Creation de la liste des fichiers et enregistrement dans liste.txt
for listeVideo in $( find -type f ! -name "*.srt" ! -name "*.txt"); do
echo $listeVideo > liste.txt
done
# Recuperation de la premiere ligne du fichier et enregistrement dans liste.txt
for FichierVideolong in $( head -1 liste.txt ); do
echo $FichierVideolong > liste.txt
done
# Suppression du ./ devant le nom du fichier et enregistrement dans liste.txt
for FichierVideo in $( awk -F "/" '{ $1 = "" ; print $0 }' liste.txt ); do
echo $FichierVideo > liste.txt
done
# Suppression de l'extension du fichier
for NomFichier in $( awk -F "." '{ $2 = "" ; print $0 }' liste.txt ); do
echo $NomFichier
rm liste.txt
done
# Création du nom de fichier avec soustitres correspondant
export FichierSoustitres="$NomFichier.srt"
# Création du nom de fichier de sortie en focntion de l'extension
export FichierSortie=$NomFichier$Mention.$Ext
}
FCconversionParVLC () {
cd ~/Bureau/Convertisseur/Video/
Mention=_VOst
export commandeVLC='#transcode{'$SettingsVLC'soverlay}:duplicate{dst=std{access=file,mux='$Ext',dst="'$FichierSortie'"}} vlc:quit'
vlc $FichierVideo :sub-file=$FichierSoustitres --sout $commandeVLC
mv $FichierSoustitres ../Fait/$FichierSoustitres
mv $FichierVideo ../Fait/$FichierVideo
mv $FichierSortie ../Fait/$FichierSortie
}
FCconversionParVLCsansSoustitre () {
cd ~/Bureau/Convertisseur/Video/
Mention=_VO
export commandeVLC='#transcode{'$SettingsVLC'}:duplicate{dst=std{access=file,mux='$Ext',dst="'$FichierSortie'"}} vlc:quit'
vlc $FichierVideo --sout $commandeVLC
mv $FichierVideo ../Fait/$FichierVideo
mv $FichierSortie ../Fait/$FichierSortie
}
#Définit la liste des étapes
FCprocessusdeconversion () {
FCrecupnomdefichier
if test -f $FichierSoustitres; then
FCconversionParVLC
else
FCconversionParVLCsansSoustitre
fi
FCExist
}
#Verifie la présence de fichier vidéo et relance le processus de conversion tant qu'il y en a
FCExist () {
cd ~/Bureau/Convertisseur/Video/
if test -f $Fichierexist; then
echo Un fichier est en cours de traitement...
FCprocessusdeconversion
else
echo "Toutes les vidéos ont été traité"
fi
}
#Fonction qui permet de créer l'ensemble de l'arborescence de travail sur le Bureau, soit 3 dossiers, s'ils n'existent pas déja
Creationdesdossiers () {
DossierConvert=~/Desktop/Convertisseur; [ -e $DossierConvert ] && echo Le dossier Convertisseur existe || mkdir ~/Desktop/Convertisseur
DossierFait=~/Desktop/Convertisseur/Fait; [ -e $DossierFait ] && echo Le dossier FAIT existe || mkdir ~/Desktop/Convertisseur/Fait
DossierVideo=~/Desktop/Convertisseur/Video; [ -e $DossierVideo ] && echo Le dossier FAIT existe || mkdir ~/Desktop/Convertisseur/Video
}
#1er étape de la procédure
Creationdesdossiers
cd ~/Bureau/Convertisseur/Video
echo "Veuillez placer les fichiers vidéos et soustitres à convertir dans le dossier ~/Bureau/Convertisseur/video"
#Fonction de pause en attendant la copie des fichiers
echo "Appuyer la touche <Entrée> pour continuer,..."
read touche
case $touche in
*) echo "Reprise du script..."
;;
esac
#Si un fichier est présent dans le dossier vidéo
for Fichierexist in *.???
do FCExist
done
Je le poste ici, et n'hésitez pas pour les suggestions
A+
Hors ligne
#2 Le 01/08/2008, à 08:32
- kao_chen
Re : [bash] VLC traitement par lot
Bon, en fouillant dans la doc de VLC je suis tombé sur cette page avec une fonction de traitement par lot (pas eu le temps de la tester mais ça doit être plus efficace que mon script)
En bas de page: http://wiki.videolan.org/Uncommon_uses
Encoding Lots of Files
This command shows how to encode a whole directory of files in Linux, without your input. When complete, it'll show a message to say it is complete. It's a single command split over several lines (with \)for A in *.avi; do \
echo ************************* $A ********************* ;\
vlc --sout-all "$A" :sout="#transcode{...}:\
std{access=file,mux=avi,url=~/$A.avi}" \
vlc:quit -I dummy ;\
done ;\
Xdialog --title 'Complete' --msgbox 'All done' 0 0;
Make sure you really understand this command before using it. It's also a good idea to make sure you've got the right options in the transcode bit, and that it'll transcode the right files. The output is sent to your home folder in this example.
Hors ligne
#3 Le 02/08/2008, à 17:02
- naughtyjah
Re : [bash] VLC traitement par lot
S@lut kao_chen !
Je trouve ton post très intéressant !
J'ai essayé de modifier le script du wiki que tu as collé pour l'utilisation ci-dessous mais je n' arrive pas à le rendre fonctionnel (je suis une bille en programmation !)
Utilisation :
Objectif :
Transformer massivement (en lots) des fichiers .ts en .ps
Pourquoi ? :
Parce que j'enregistre régulièrement des documentaires sur France 5 et sur Arte par le biais du magnéto de la Freebox et que la diffusion se fait en .ts (transport streaming si je ne m'abuse) mais qu'une fois rapatriés via ftp sur le disque dur du PC, la visualisation de ces derniers avec homeplayer est un peu laborieuse.
En effet, quand les fichiers sont en.ts les fonctions d'avance rapide et de retour rapide ne sont pas disponibles dans homeplayer. Ce qui me pose problème vu que je laisse toujours une bonne marge avant chaque enregistrement pour être sûr de ne pas rater le début.
Comme j'ai la flemme, de tout retravailler avec avidemux (360 Gio de docs, ça commence à faire beaucoup !) je privilégie la conversion avec vlc pour mater tranquillement tout ça à l'envie.
Un peu d'aide ou des infos me seraient très utiles.
En te remerciant par avance.
naughtyjah
P.S : quand je procède à l'action via le gui de vlc les arguments sont
:sout=#duplicate{dst=std{access=file,mux=ps,dst=nomdufichier.mpg}}
Dernière modification par naughtyjah (Le 02/08/2008, à 17:03)
#4 Le 04/08/2008, à 10:47
- kao_chen
Re : [bash] VLC traitement par lot
Salut, je suis en vacances et je n'ai plus de linux à dispo.
Mais j'ai vite essayer le script fournit par le wiki avant de partir, et je n'ai pas réussit à le faire fonctionner correctement.. je ne sais pas encore d'où vient le problème...
par contre sur ta ligne d'arguments il manque toute la partie codec à mettre dans la partie transcode.
Il faut que tu sélectionne les bons codec dans vlc:
Les arguments ressemblent à ça :
mp4v,vb=1024,width=640,height=480,acodec=mp4a,ab=192,channels=2
for A in *.avi; do \
echo ************************* $A ********************* ;\
vlc --sout-all "$A" :sout="#transcode{Ici tu colle la ligne avec les infos codec}:\
std{access=file,mux=ps,url=~/$A.avi}" \
vlc:quit -I dummy ;\
done ;\
Xdialog --title 'Complete' --msgbox 'All done' 0 0;
Hors ligne
#5 Le 23/04/2009, à 16:01
- kao_chen
Re : [bash] VLC traitement par lot
Bon je continue avec mon traitement par lot, je me suis mis au Ruby et j'ai pondu un truc pas trop mal
#définition dossier de travail
$varInputFolder = "/dossier/de/depot/des/fichiers"
$varOutputFolder = "/dossier/de/sortie/des/fichiers"
#définition des parametres VLC
$varParamOutupVLC=":sout=#transcode{vcodec=mp4v,vb=800,scale=1,acodec=mp4a,ab=128,channels=2}:duplicate{dst=std{access=file,mux=mp4,dst="
#Définition de l'extension du fichier de sortie + mention à ajouter au nom du fichier
$varExtOutupt= ".mp4"
$varAddToNewName ="converted"
#fonction qui scrute le dossier d'entrée des fichiers et lance VLC dés qu'il en détecte un.
def foncWatchfolder
#liste les fichiers présent et sort le premier fichier présent dans la liste (par ordre alphabétique)
Dir.chdir($varInputFolder)
puts "Dossier de travail: " + Dir.getwd
puts "Fichier present dans le dossier de travail:"
puts Dir["*"]
#Extraction du premier fichier de la liste:
listfichier = Dir["*"]
$nomfichiervideo = listfichier[0]
if $nomfichiervideo
#si fichier présent: lance la conversion par VLC
then ext = File.extname($nomfichiervideo)
$nameWithOutExtension = File.basename($nomfichiervideo, ext)
$destination= "#{$varOutputFolder}#{$nameWithOutExtension}#{$varAddToNewName}#{$varExtOutupt}"
puts $destination
$maincommandeVLC="vlc #{$varInputFolder}#{$nomfichiervideo} #{$varParamOutupVLC}#{$destination}} vlc:quit"
foncRunVLC
#Si abscence de fichier relance de la fonction Watchfolder au bout de 10 secondes
else puts "absence de fichier a traiter"
sleep 10
foncWatchfolder
end
end
#fonction qui lance la conversion et qui pousse les fichiers traités vers un autre dossier puis reprend le processus au début
def foncRunVLC
puts $maincommandeVLC
system ("#{$maincommandeVLC}")
File.move($nomfichiervideo,"/dossier/des/fichiers/traités")
foncWatchfolder
end
foncWatchfolder
Il faut installer ruby avant et lancer le fichier avec:
$ruby monscript.rb
A noter que ça fonctionne aussi sous windows (j'ai scripté ça au taf).
Hors ligne
#6 Le 09/01/2013, à 20:42
- Chatillon
Re : [bash] VLC traitement par lot
Cette discussion portant exactement le nom de celle que j'aurai ouvert je pose ici ma question:
Quelle ligne de commande, s'il vous plait, pour une conversion par lot d'audio sous vlc ?
J'ai tenté quelque chose comme
vlc monfichier --sout "#transcode{acodec=mp3,ab=192,channels=2}:std{mux=mp3,dst=sortie.mp3,access=file}"
mais d'abord vlc n'arrive pas à lire le fichier qui sort et puis je ne comprend pas mux et access.
Ensuite pour un traitement par lot il suffirait de l'exécuter au sein d'un find...
Merci d'avance pour le coup de pouce qui pourrait en intéresser d'autres.
Xubuntu 13.04 kernel 3.8.0 + Compiz + Synapse
Hors ligne
#7 Le 29/08/2013, à 09:15
- Chatillon
Re : [bash] VLC traitement par lot
Pour encoder en mp3 le codec n'est pas mp3 mais mpga.
Ainsi une commande qui marche est :
vlc --sout "#transcode{acodec=mpga,ab=192,channels=2}:std{dst=conversion.mp3,access=file}"
Mais exécuté avec find, vlc converti le premier mais ne se fermant pas ne rend pas la main à find.
Aussi j'utilise lame -V2 comme ça :
find dansmondossier -name *.wav -exec lame -V2 {} {}.mp3 \;
Puis un
find dansmondossier -name *.wav -delete
pour supprimer les originaux
Seulement lame ne converti pas les wma. On peut utiliser à sa place ffmpeg (moins bon je crois) ainsi:
find dansmondossier -name "*.wma" -exec ffmpeg -i {} -vn -acodec libmp3lame {}.mp3 \;
Après sauvegarde des originaux, mes 22Go de mp3 wav et wma sont devenu 11.
En espérant que ça serve à d'autres...
--edit :
Autre solution : utiliser qwinff, gui pour ffmpeg et d'autres.
Mon oreille ne lui a pas trouvé de défaut comme à soundconverter (craquements).
En revanche il ne sait pas travailler de manière récursive.
Dernière modification par Chatillon (Le 16/10/2013, à 20:30)
Xubuntu 13.04 kernel 3.8.0 + Compiz + Synapse
Hors ligne