Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 roll !)

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. smile

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