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 02/12/2011, à 15:04

Miroslav

Problème de boucle [RESOLU]

Bonjour,

Je pense avoir un souci avec la commande ffmpeg qui stop la boucle quand elle n'a pas l'option -y pour autoriser automatiquement la réécriture par dessus les fichiers.
Ma commande de test semble ne pas fonctionner correctement non plus, du moins pas tout le temps, c'est très étrange.

#!/bin/bash

## FONCTIONS
directory () {
dirname "$line"
}

basename_avi () {
basename "$line" | sed "s/\.avi//g"
}


## liste des fichiers avi HD
find ../ -maxdepth 4 -name '*.avi' -type f | grep -v "mail" | sort 1> /tmp/avi_list 2> /dev/null

## ACTIONS
while read line; do
 echo "$line"
 if [ ! -e `basename_avi`_youtube.flv ]; then
 echo "`basename_avi`_youtube.flv n'existe pas"
 ffmpeg -i "$line" -s 852x480 -ar 44100 -pass 1 -b 768k -r 18 -f flv `directory`/`basename_avi`_youtube.flv
 fi
 if [ ! -e `basename_avi`_siteweb.mp4 ]; then
 echo "`basename_avi`_siteweb.mp4 n'existe pas"
 ffmpeg -i "$line" -s 852x480 -ar 44100 -pass 1 -b 768k -r 18 -f mp4 `directory`/`basename_avi`_siteweb.mp4
 fi
 ########## mobile
 if [ ! -e `basename_avi`_youtube_mobile.flv ]; then
 echo "`basename_avi`_youtube_mobile.flv n'existe pas"
 ffmpeg -i "$line" -s 426x240 -ar 44100 -pass 1 -b 768k -r 18 -f flv `directory`/`basename_avi`_youtube_mobile.flv
 fi
 if [ ! -e `basename_avi`_siteweb_mobile.mp4 ]; then
 echo "`basename_avi`_siteweb_mobile.mp4 n'existe pas"
 ffmpeg -i "$line" -s 426x240 -ar 44100 -pass 1 -b 768k -r 18 -f mp4 `directory`/`basename_avi`_siteweb_mobile.mp4
 fi
 ########### mail
 if [ ! -e `basename_avi`_mail.avi ]; then
 echo "`basename_avi`_mail.avi n'existe pas"
 ffmpeg -i "$line" -s 426x240 -ar 44100 -pass 1 -b 768k -r 18 -f avi `directory`/`basename_avi`_mail.avi 
 fi
done < /tmp/avi_list
user@PC1:~/Studio/Gamme/.Scripts$ bash convertion_video.sh 
../3112x200/VIDEO/3112x201/3112x201.avi
3112x201_youtube.flv n'existe pas
3112x201_siteweb.mp4 n'existe pas
3112x201_youtube_mobile.flv n'existe pas
3112x201_siteweb_mobile.mp4 n'existe pas
3112x201_mail.avi n'existe pas
user@PC1:~/Studio/Gamme/.Scripts$ cat /tmp/avi_list 
../3112x200/VIDEO/3112x201/3112x201.avi
../1106_9025/VIDEO/1106_9025/Video_1106_9025.avi

d'avance merci pour vos conseils

Dernière modification par Miroslav (Le 02/12/2011, à 19:36)

Hors ligne

#2 Le 02/12/2011, à 15:45

Levi59

Re : Problème de boucle [RESOLU]

déjà tes fonctions sont bizarres. Comment veux-tu qu'elles connaissent $line? Il faut utiliser des arguments ($1, $2 etc)
De plus il y a plus simple avec les substitutions :

line="/chemin/vers/fichier.ext"
Directory="${line%/*}"      ## ="./chemin/vers"
Fichier_Ext="${line##*/}"  ## ="fichier.ext"
Fichier="${Fichier_Ext%.*}"  ## ="fichier"
Extension="${line##*.}"    ## ="ext"

Cependant, il est préférable d'utiliser un chemin absolu dans find surtout si tu l'utilise toujours sur le même dossier. En effet, le retour de find dépend du format du chemin. Si il est absolu, tu auras "/chemin/vers/fichier.ext". Si il est relatif, tu auras "./vers/fichier.ext".
Tu perds donc une partie du chemin.

Tu peux aussi te passer de fichier temporaire en passant directement le résultat de la commande find à la boucle while :

while read line
do
    ""Commandes en tout genre""
done < <(find ....)

Hors ligne

#3 Le 02/12/2011, à 16:05

Miroslav

Re : Problème de boucle [RESOLU]

Merci pour ces infos, ça se voit que j'apprends tout seul dans mon coin? smile

Hors ligne

#4 Le 02/12/2011, à 16:43

Levi59

Re : Problème de boucle [RESOLU]

Je te rassure, je n'ai moi même jamais suivi de formation, j'ai tout appris des gens de ce forum et un peu de ceux de developpez.net wink
Je sais qu'il n'est pas simple de se lancer mais il faut bien faire des erreurs pour apprendre.

Hors ligne

#5 Le 02/12/2011, à 18:45

Miroslav

Re : Problème de boucle [RESOLU]

concrètement j'ai essayé des choses mais ça ne marche pas du tout, se serait possible de me montrer vite faite par rapport à ce que j'ai fait?

edit: J'ai rien dit c'est OK, par contre si je poste la soluce je vais me faire pourrir, en gros j'utilise toujours mes fonction, c'est juste que le test n'avait pas de chemin d'accès du coup il était faut tout le temps

merci

Dernière modification par Miroslav (Le 02/12/2011, à 19:37)

Hors ligne

#6 Le 02/12/2011, à 19:50

pingouinux

Re : Problème de boucle [RESOLU]

Bonsoir,

@Miroslav :
La commande

basename "$line" | sed "s/\.avi//g"

peut se remplacer par

basename "$line" .avi

et est d'ailleurs erronée dans certains cas. Par exemple :

line=fich.avion.avi
$ basename "$line" | sed "s/\.avi//g"    # Ne marche pas, car .avi se trouve 2 fois dans le nom du fichier
fichon                                   # et les 2 sont retirés
$ basename "$line" .avi                  # Ça marche, et c'est plus simple
fich.avion
basename "$line" | sed "s/\.avi//"       # Ne marche non plus, car c'est le 1er .avi qui est retiré
fichon.avi

@Levi59 :
Dans les fonctions, tu as raison, il est préférable d'utiliser les paramètres. Néanmoins, une variable (comme $line ici) définie avant l'appel de la fonction est prise en compte (même si la fonction elle-même est définie avant la variable).

Hors ligne

#7 Le 02/12/2011, à 20:42

Levi59

Re : Problème de boucle [RESOLU]

pingouinux a écrit :

@Levi59 :
Dans les fonctions, tu as raison, il est préférable d'utiliser les paramètres. Néanmoins, une variable (comme $line ici) définie avant l'appel de la fonction est prise en compte (même si la fonction elle-même est définie avant la variable).

Ah! Et bien je viens d'apprendre quelque chose! Je croyais que les variables n'étaient pas accessibles aux fonctions un peu comme en langage C. Merci de cette précision! wink

Hors ligne