Forum Linux.général Script shell à entrées différentes / interactives ?

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
2
juil.
2021

Salut,

J'encode beaucoup de vidéos en HEVC et j'utilise différentes options. Typiquement, sur cette base :

$ffmpeg -i file.MP4 -c:a libvorbis -c:v libx265 -map_metadata 0 -y file.mp4
Je greffe ces options :

  1. -crf xx (la qualité globale)
  2. -preset slow (le temps de travail)
  3. -ss xx:xx:xx -t xx:xx:xx (je coupe le temps qui m'intéresse)
  4. -vf eq=contrast / brightness / saturation / gamma

Et c'est très laborieux de modifier/retaper les lignes entières, évidemment. J'aimerais pouvoir appeler un script qui me demanderait uniquement ces options (et les noms peut-être)…
Par exemple :

$ ./script_encodage
Nom : file.MP4 (avec autocomplétion si possible, mais pas obligatoire) (ENTRÉE)
Nom_sortie : file.mp4
Qualité : 23 (ENTRÉE)
Vitesse : fast (ENTRÉE)
Filtre : (ENTRÉE)
Section : 00:00:05 -t 00:00:16

Me lancerait cette commande :

$ffmpeg -i file.MP4 -c:a libvorbis -c:v libx265 -crf 23 -preset fast -ss 00:00:05 - t 00:00:16 -map_metadata 0 -y file.mp4

C'est faisable/gérable ou bien il vaut mieux que je passe par autre chose que bash (que je connais très peu) ? Merci ! :)

  • # mes scripts...

    Posté par  . Évalué à 3.

    généralement je fais des petits scripts très basiques comme ca
    on peut surement faire mieux, mais ca donne une idée

    #!/bin/bash
    
    # je vérifie que le nombre d'arguments
    case $# in
        7) # si j'en ai 7, je fais les actions qui suivent (les options sont numeritées dans l'ordre de la ligne de commande ($0 étant le nom du programme lui meme, $1 le premier argument, $2 le 2e, etc..., dans ton cas
            ffmpeg -I $1 -c:a libvorbis -c:v libx265 -crf $3 -preset $4 -ss $6 - t $7 -map_metadata 0 -y $2
        ;; #fin de l'action si on a 7 arguments
        *) # dans les autres cas, j'affiche l'aide
            echo "Usage $0 <fichier entrée> <fichier sortie> <qualité> <vitesse> <filtre> <debut> <fin>"
        ;;
    esac

    ensuite tu donnes les droits +x à ton script
    chmod 755 tonscript.sh

    et tu l'utilises comme çà
    ./tonscript.sh masource.MP4 masortie.mp4 23 fast '' 00:00:05 00:00:16

    certes ca pose pas de question,
    ca ne fait pas l'autocompletion
    mais ca fait deja une partie du boulot

    • [^] # Re: mes scripts...

      Posté par  . Évalué à 1.

      Ha pas sûr que ça ne fasse pas l'autocompletion (super la double négation :) ) : ton shell (au moins bash) devrait le permettre.

  • # Faisabilité

    Posté par  . Évalué à 1.

    Tu peux faire cela à l'aide de read. Ci dessous un court exemple:
    read -p "Qualité : " QUALITY
    echo $QUALITY

    Pour le choix du langage, tout dépend du niveau de contrôle que tu veux y mettre (ça peut vite être galère en Bash si tu veux contrôler que le fichier existe, que tu n'écrases pas un fichier existant dans la sortie, …).

    PS: pas d'auto complétion dans l'exemple.

    • [^] # Re: Faisabilité

      Posté par  . Évalué à 2.

      ça peut vite être galère en Bash si tu veux contrôler que le fichier existe

      Mauvais exemple, c'est une des choses les plus faciles à faire avec bash:

      [[ -e $fichier ]] && exit 1

      (et non, ce n'est pas une erreur qu'il n'y ait pas de guillemets autours de la variable)

      Ajouter un message d'erreur est laissé comme exercice au lecteur ;-)

  • # Utilise la commande history

    Posté par  . Évalué à 2. Dernière modification le 02 juillet 2021 à 11:31.

    … Et c'est très laborieux de modifier/retaper les lignes entières, …

    Il te faut utiliser les touches flèches vers le haut plusieurs fois (et flèche vers le bas) pour "rappeler" les dernières lignes de commandes entrées,
    et avec les touches flèches droite et gauche tu pourras aller positionner le curseur sur ce que tu veux modifier dans la ligne
    avant d'appuyer sur la touche Entrée.


    Pour visualiser les dernières lignes de commande(s) entrées,
    entre simplement la ligne de commande suivante :

    history
    

    Tu pourras lire le manuel de la commande history
    en entrant la ligne de commande suivante :

    man history
    

    Dans ta ligne de commande, tu peux aussi utiliser une variable
    après l'avoir déclarée :

    monFichierEntrée="file.MP4"
    monFichierSortie="fileModifie.mp4"
    

    comme ça tu n'a plus qu'à relancer la même ligne de commande en ayant juste changé la valeur d'une ou plusieurs variables :

    ffmpeg -i "$monFichierEntree" -c:a libvorbis -c:v libx265 -map_metadata 0 -y "$monFichierSortie"
    
    • [^] # Commentaire supprimé

      Posté par  . Évalué à 1. Dernière modification le 02 juillet 2021 à 11:31.

      Ce commentaire a été supprimé par l’équipe de modération.

      • [^] # Modération

        Posté par  (Mastodon) . Évalué à 2.

        Modification effectuée, merci

        En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

    • [^] # Re: Utilise la commande history

      Posté par  . Évalué à 1.

      Hélas, c'est bien ce système qui m'est laborieux…J'ai littéralement des centaines de vidéos à faire et je fatigue d'utiliser les flèches, d'ajouter des presets, d'en oublier par erreur, etc. :)

      • [^] # Re: Utilise la commande history

        Posté par  . Évalué à 2.

        Alors ce qu'il te faut, c'est faire une boucle, pour appliquer la même commande à plusieurs fichiers.
        Supposons que tes vidéos sont (éventuellement via des liens symboliques) dans le répertoire orig, et que tu veux les résultats dans le répertoire dest, ça donnerait:

        for f in orig/*.mp4 ;do
          ffmpeg -i "$f" {options ici} dest/"${f##*/}"
        done

        Ça te donnera les fichiers recodés, avec le même nom, dans le répertoire dest.

        • [^] # Re: Utilise la commande history

          Posté par  . Évalué à 1.

          Hélas, chaque fichier a besoin d'un traitement spécifique pour une optimisation qualitaille (mot-valise gratuit du jour !). :p

          J'appliquais ce système mais je me retrouvais quand même à retoucher de nombreuses vidéos…:)

          • [^] # Re: Utilise la commande history

            Posté par  . Évalué à 2.

            Alors tu peux préparer les commandes dans un fichier, une par ligne, ça fait techniquement un script que tu peux lance avec bash, comme ça un fois lancé il va enchainer les fichiers et tu peux le laisser tourner pendant la nuit.
            À coup de copier/coller, ça peut aller assez vite.

            Je recommande de mettre un "set -e" au début du fichier, pour qu'il s'arrête si une des commandes échoue (sinon ça risque de passer inaperçu).

            • [^] # Re: Utilise la commande history

              Posté par  . Évalué à 3.

              sinon y a handbrake

              avec une interface graphique dans laquelle tu charges les fichiers, tu définis les réglages,
              ca génère une playlist de conversion

              tu lances la playlist, ca bosse,
              et à la fin tu as tes fichiers modifiés dans le dossier cible

  • # Raccourcis clavier

    Posté par  . Évalué à 2. Dernière modification le 02 juillet 2021 à 14:51.

    Quelques raccourcis clavier qui fonctionnent par défaut sur mon système debian Xfce
    pour éditer la ligne de commande :

    Ctrl-Flèches Droite ou Gauche pour se déplacer mot par mot
    Ctrl+u pour supprimer tout ce qu'il y a avant le curseur
    Ctrl+k pour supprimer tout ce qu'il y a après le curseur
    Ctrl+w pour supprimer le mot précédant le curseur

    Échap suivit de $ pour compléter le nom d'une variable
    Échap suivit de u pour mettre le reste du mot en majuscule (upcase)
    Échap suivit de l (L minuscule) pour mettre le reste du mot en minuscule (lowercase)

    • [^] # Re: Raccourcis clavier

      Posté par  (site web personnel) . Évalué à 3.

      Et

      Alt+d pour supprimer le mot à droite
      Alt+backspace un peu plus fin que Ctrl+w (supprime doc/ dans /usr/share/doc/)
      Esc+. ou Alt+. pour rappeler le dernier argument
      Esc+_ pour annuler la dernière frappe (sorte de ctrl+z)

      sans oublier Ctrl+r pour rechercher dans l'historique (associé à FZF c'est encore mieux).

      « Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes. »

  • # Torché à l'arrache

    Posté par  . Évalué à 3.

    #! /bin/bash
    
    echo "input: " $1
    echo "output: " $2
    
    echo "Give Ratio (default: plop)"
    read ratio
    [ -z $ratio ] && ratio="plop"
    
    echo you chose $ratio as ratio
    

    dans l'ordre, tu lances ./script.sh file1.MP4 fileout.mp4
    $1 -> premier argument (comme ça tu as l'autocomplétion du shell)
    $2 -> second argument

    ensuite, read variable va te demander une variable, si tu fais entrée, la variable n'est pas renseignée (elle n'existe pas)

    [ -z $ratio ] --> Ca veut dire, on teste si la variable ratio existe
    && --> si la condition est vraie ($ratio n'existe pas)
    ratio="plop" -> on lui met la valeur par défaut
    En gros, soit $ratio vaudra "plop" soit la valeur que tu lui met.

    et la ligne de commande à la fin ça va être du genre

    $ ffmpeg -i "$1" -c:a "$libvorbis" -c:v "$libx265" -crf "$crf" -preset "$fast" -ss "$ss" -map_metadata 0 -y "$2"
    penses à bien quoter les variables pour éviter les pb d'espace. Y'a 0 gestion d'erreurs, donc si tu entres n'imp, ça fera n'imp.

    • [^] # Re: Torché à l'arrache

      Posté par  . Évalué à 1.

      Merci. :)

      Je vais passer mon après-midi à créer un script qui me fera gagner 4 secondes de travail par vidéo. :D

      • [^] # Re: Torché à l'arrache

        Posté par  . Évalué à 2.

        mais que tu garderas dans un coin, et tu n'auras pas à refaire ce travail pour les prochaines vidéos à convertir

  • # Usine à Gaz fait maison ^^

    Posté par  . Évalué à 1.

    Hello,

    J'avais un problème similaire pour recouper les vidéos enregistrée avec la Freebox (j'enregistre toujours un peu avant et un peu après, et aussi pour supprimer les pubs)
    J'étais parti d'un truc simple et au final j'ai fait un script un peu usine à gaz mais ça m'a permis d'apprendre un peu le bash comme ça
    il est ici : https://prog.ynh.fr/nextcloud/s/7PscKWFJas2QfYj
    Je t'invites à le lire avant de l'utiliser, il doit être assez commenté pour être compréhensible. Il nécessite pas mal d'amélioration (et je vais inclure certaine idées trouvée dans ce thread)

    Julien_c'est_bien (y'a pas que Seb)

    • [^] # Re: Usine à Gaz fait maison ^^

      Posté par  . Évalué à 2.

      Haha, effectivement, tu voulais un truc très interactif…Je vais finir par faire un programme en Python à ce rythme d'idées ! :p

      Merci du partage. :p

      • [^] # Re: Usine à Gaz fait maison ^^

        Posté par  . Évalué à 1.

        Yep au final je me suis autant pris au jeux de découvrir le bash que de faire répondre à mon problème. Je suis content ça ma bien servi d'apprendre un peu le bash :-)

        Julien_c'est_bien (y'a pas que Seb)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.