IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Encodage en masse


Sujet :

Shell et commandes GNU

  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2007
    Messages : 282
    Par défaut Encodage en masse
    Bonjour à tous,

    J'ai environ 150 videos en mp4 que je souhaiterais encoder sans devoir a chaque retaper la ligne de commande ffmpeg.
    Je suis donc en train de créer un script qui me permet de faire ceci. Voici mon début de code:

    find -name *.mp4 | while read src
    do

    srcfile=`basename "$src"`
    srcfolder=`dirname "$src"`
    dstfile="$srcfolder"/"${srcfile%}".mpeg4

    ffmpeg -i "$srcfile" -target pal-dvd -sameq "$dstfile"


    done
    Cependant il ne marche pas car d'une part je n"arrive pas à lister les fichiers présents dans mon dossier et d'autre par à envoyer le fichier n°1 dans la boucle ffmpef puis le fichier n°2 .....

  2. #2
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Voici quelque chose pour Bash:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/bash
     
    while read srcPath
    do
      ffmpeg -i "$srcPath" -target pal-dvd -sameq "${srcPath/%.*/.mpeg4}"
    done < $(find . -name "*.mp4")
    Je n'ai rien à convertir, donc c'est de tête et bien sûr à vérifier.

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 724
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 724
    Par défaut
    Il est étonnant que find ne permette pas ça... man find
    -exec
    -execdir
    ...
    ?

    jmelyn :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    find . -name "*.mp4" | while read srcPath
    do
      ffmpeg -i "$srcPath" -target pal-dvd -sameq "${srcPath/%.*/.mpeg4}"
    done
    semble plus explicite : on cherche/trouve, puis on intervient sur les lignes...
    Y a-t-il un time pour me contredire, ou est-ce égal ?

    Bref, j'en reviens à ma marotte : find devrait pouvoir le faire sans utiliser de boucle...

    find|while
    ou
    for item in $(find)
    => find -exec(dir)

  4. #4
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Bonjour N_BaH,

    Je préfère écrire la boucle "while read" avec le find à la fin, je les écris toujours de cette manière. Mais c'est une question de cosmétique. Pour tout mettre dans un find, c'est peut-être possible puisque qu'il n'y a qu'une seule commande, mais le triturage de l'argument $srcPath en ${srcPath/%.*/.mpeg4} n'est pas évident dans les paramètres puisque l'on a juste {}:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -name "*.mp4" -exec ffmpeg -i {} -target pal-dvd -sameq ??? \;
    Mais si quelqu'un a une solution, j'y porterai grande attention: je crois qu'effectivement la vitesse d'exécution serait bien meilleure.

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 724
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 724
    Par défaut
    Bonjour,

    Bonjour jmelyn,

    bah !?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -name "*.mp4" -exec ffmpeg -i {} -target pal-dvd -sameq {} \;

  6. #6
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    bah !? bah !? bah !? (*)

    (*) Fichier source écrasé

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 724
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 724
    Par défaut
    bah, oui ! pfff, je suis tête en l'air :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -name "*.mp4" -exec bash -c 'ffmpeg -i {} -target pal-dvd -sameq "$(dirname {})$(basename {} .mp4).mpeg4"'
    Je ne peux pas tester : je n'ai pas de fichiers .mp4, et pas ffmpeg.

  8. #8
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Je ne pense pas que c'est correct pour la raison suivante:
    Les arguments sont d'abord travaillés par le shell (Bash en l'occurence) qui fait les expansions et substitutions demandées, puis passe ces paramètres transformés à la commande, ici find. Or "{}" est un argument spécial de find que seule cette commande connait: Bash ne saura pas qu'en faire donc le shell sortira des erreurs parce que dirname {} et basename {} ne veulent rien dire pour lui.

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 724
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 724
    Par défaut
    si, si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ls test
    test1.sh
    test2.sh
    find test -iname "*.sh" -exec bash -c 'echo $(dirname '{}')/$(basename '{}' .sh).mpeg4' \;
    test/test1.mpeg4
    test/test2.mpeg4
    mais peut-être pas si j'oublie des single quotes

  10. #10
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Bonjour N_BaH,

    Il semble que la réalité n'est pas ce que j'ai affirmé la semaine dernière:

    1. Le shell fait d'abord ses expansions et substitutions, comme d'hab.
    2. La commande find fait ensuite la substitution qu'elle peut faire ({} en chemin de fichier).
    3. La commande qui suit l'option -exec est ensuite exécutée.

    Donc oui, tu as raison, la commande que tu as exécutée est parfaitement valable. On peut remarquer que tu as utilisé la possibilité de la commande basename qui supprime la fin du nom de fichier: basename toto.ext .ext donne toto.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Encodage de caracteres: eviter 81, 8D, 8F, 90, 9D ->
    Par Fladnag dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 27/04/2004, 12h17
  2. Encodage de cd en fichier mp3
    Par clovis dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 08/04/2004, 02h13
  3. [ENCODAGE][JAVA]Afficher correctement des accents
    Par kornelius dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 17/02/2004, 17h37
  4. Encodages DOS et Windows
    Par Aramis dans le forum Langage
    Réponses: 5
    Dernier message: 09/11/2003, 18h55
  5. [VB6] fonction d' encodage URL en VB
    Par jeanseb dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/01/2003, 12h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo