#76 Le 29/06/2021, à 17:50
- Watael
Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.
mon déménagement dans 3 semaines…
non, mais ça, on s'en fout.
le plus important c'est ton script.
tant pis pour le déménagement.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#77 Le 29/06/2021, à 18:08
- Zakhar
Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.
Merci kamaris.
Parce que le Bash n'est pas POSIX ? (Édit : je viens de survoler l'article POSIX de wikipédia et ca reste flou pour moi).
Excellente remarque de Kamaris !
La première fois que j'ai voulu utiliser mes scripts sur mon antique (10 ans maintenant) Synology, je me suis mordu les doigts de ne pas avoir écrit "portable".
Pour gagner en mémoire, les NAS (surtout ceux bas de gamme) utilisent souvent busybox qui vient avec des utilitaires GNU très simplifiés, mais surtout avec ash au lieu de bash.
Ce n'est sans doute pas le cas du tien puisque tu parles de "conversion vidéo", on peut imaginer qu'il a une puissance CPU et une RAM suffisante pour supporter bash au lieu de versions de script plus compactes.
Quand ton script est "plein de bashism" tu t'en mords bien les doigts. Depuis j'écris "portable" et tous mes scripts commencent par
#! /bin/sh
Ce qui veut dire : le script pas défaut de la machine.
Une page très utile : https://wiki.ubuntu.com/DashAsBinSh
Tu vois, le changement vers dash date de la 6.10
Sur Ubuntu ce n'est donc plus bash depuis des lustres mais dash bien plus performant qui s'occupe de tous les scripts de lancement. Le "terminal", lui, invoque bien toujours bash. Sur d'autres machines tu trouveras d'autres scripts comme mon exemple avec ash ou du zsh sut IBM, etc... Chacun a ses avantages et inconvénients, mais utiliser les spécificités de l'un rend ton travail "moins portable".
Ce qui est commun entre tous ces interpréteurs de script est le script "POSIX".
Surtout sur l'exemple que tu donnait kamaris, c'est juste une façon différente d'écrire le test, ce n'est pas plus long ni plus compliqué, donc autant faire "portable".
Et pour ta question, non "bash" n'est pas "Posix", c'est le script GNU standard !
Dernière modification par Zakhar (Le 29/06/2021, à 18:13)
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#78 Le 29/06/2021, à 18:13
- MicP
Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.
Bonjour
À mon avis, tu devrais remplacer la commande de suppression des fichiers
par la création d'une liste de fichiers dont tu ne lancerais plus tard l'effacement
qu’après avoir vérifié que les fichiers convertis sont bien lisibles.
=======
Et je suis tout-à fait d'accord avec Watael :
Il est absolument hors de question que tu déménages avant que ce script soit terminé.
Non mais…
En plus, tu as encore de la lecture à faire
concernant POSIX : https://pubs.opengroup.org/onlinepubs/9699919799/
https://fr.wikipedia.org/wiki/POSIX
Dernière modification par MicP (Le 29/06/2021, à 18:23)
Hors ligne
#79 Le 29/06/2021, à 19:37
- Compte supprimé
Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.
L_d_v_c@ a écrit :Merci kamaris.
Parce que le Bash n'est pas POSIX ? (Édit : je viens de survoler l'article POSIX de wikipédia et ca reste flou pour moi).Excellente remarque de Kamaris !
La première fois que j'ai voulu utiliser mes scripts sur mon antique (10 ans maintenant) Synology, je me suis mordu les doigts de ne pas avoir écrit "portable".
Pour gagner en mémoire, les NAS (surtout ceux bas de gamme) utilisent souvent busybox qui vient avec des utilitaires GNU très simplifiés, mais surtout avec ash au lieu de bash.
Ce n'est sans doute pas le cas du tien puisque tu parles de "conversion vidéo", on peut imaginer qu'il a une puissance CPU et une RAM suffisante pour supporter bash au lieu de versions de script plus compactes.Quand ton script est "plein de bashism" tu t'en mords bien les doigts. Depuis j'écris "portable" et tous mes scripts commencent par
#! /bin/sh
Ce qui veut dire : le script pas défaut de la machine.
Une page très utile : https://wiki.ubuntu.com/DashAsBinSh
Tu vois, le changement vers dash date de la 6.10
Sur Ubuntu ce n'est donc plus bash depuis des lustres mais dash bien plus performant qui s'occupe de tous les scripts de lancement. Le "terminal", lui, invoque bien toujours bash. Sur d'autres machines tu trouveras d'autres scripts comme mon exemple avec ash ou du zsh sut IBM, etc... Chacun a ses avantages et inconvénients, mais utiliser les spécificités de l'un rend ton travail "moins portable".Ce qui est commun entre tous ces interpréteurs de script est le script "POSIX".
Surtout sur l'exemple que te donnait kamaris, c'est juste une façon différente d'écrire le test, ce n'est pas plus long ni plus compliqué, donc autant faire "portable".
Et pour ta question, non "bash" n'est pas "Posix", c'est le script GNU standard !
Merci Zakhar. Effectivement, quitte à apprendre ou réapprendre les scripts, versions GNU/Linux, autant prendre les bonnes habitudes et faire le plus portable possible. J'avais fait mon script en #/bin/bash, si je comprends bien, pour le même prix, je pourrais le réécrire en #/bin/sh ?
Effectivement, voici un résumé de mon NAS remplaçant mon Synology DS212, devenu trop faiblard par rapport à mon utilisation :
root@NAS-J5005:/home/ludovic# inxi -Fxzv5
System: Host: NAS-J5005 Kernel: 4.19.0-17-amd64 x86_64 bits: 64 compiler: gcc v: 8.3.0 Console: tty 2
Distro: Debian GNU/Linux 10 (buster)
Machine: Type: Desktop Mobo: ASRock model: J5005-ITX serial: <filter> UEFI: American Megatrends v: P1.40 date: 08/06/2018
Memory: RAM: total: 7.45 GiB used: 1.28 GiB (17.2%)
Array-1: capacity: 256 GiB note: check slots: 2 EC: None max module size: 128 GiB note: est.
Device-1: A1_DIMM0 size: 4 GiB speed: 2400 MT/s type: DDR4
Device-2: B1_DIMM0 size: 4 GiB speed: 2400 MT/s type: DDR4
CPU: Topology: Quad Core model: Intel Pentium Silver J5005 bits: 64 type: MCP arch: Goldmont Plus rev: 1
L2 cache: 4096 KiB
flags: lm nx pae sse sse2 sse3 sse4_1 sse4_2 ssse3 vmx bogomips: 11980
Speed: 2696 MHz min/max: 800/2800 MHz Core speeds (MHz): 1: 2696 2: 2696 3: 2696 4: 2696
Graphics: Device-1: Intel UHD Graphics 605 vendor: ASRock driver: i915 v: kernel bus ID: 00:02.0
Display: server: X.org 1.20.4 driver: modesetting unloaded: fbdev,vesa tty: 188x22
Message: Advanced graphics data unavailable in console for root.
Audio: Device-1: Intel vendor: ASRock driver: snd_hda_intel v: kernel bus ID: 00:0e.0
Sound Server: ALSA v: k4.19.0-17-amd64
Network: Device-1: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet vendor: ASRock driver: r8169 v: kernel port: e000
bus ID: 03:00.0
IF: enp3s0 state: up speed: 1000 Mbps duplex: full mac: <filter>
Drives: Local Storage: total: 15.46 TiB used: 14.49 TiB (93.7%)
ID-1: /dev/sda vendor: Toshiba model: HDWG180 size: 7.28 TiB temp: 38 C
ID-2: /dev/sdb type: USB vendor: Seagate model: Expansion Desk size: 5.46 TiB
ID-3: /dev/sdc type: USB vendor: Seagate model: Expansion Desk size: 2.73 TiB
Message: No Optical or Floppy data was found.
Partition: ID-1: / size: 28.71 GiB used: 8.08 GiB (28.1%) fs: ext4 dev: /dev/sda2 label: N/A
uuid: 6e3f143f-f6bc-4c58-bb37-a6bfdfdb6a08
Sensors: System Temperatures: cpu: 45.5 C mobo: 33.0 C
Fan Speeds (RPM): fan-1: 959 fan-2: 0 fan-3: 0 fan-4: 0 fan-5: 0 fan-7: 0
Voltages: 12v: N/A 5v: N/A 3.3v: 3.39 vbat: 3.15
Info: Processes: 295 Uptime: 2d 2h 34m Init: systemd runlevel: 5 Compilers: gcc: 8.3.0 Shell: bash v: 5.0.3 inxi: 3.0.32
root@NAS-J5005:/home/ludovic# hdparm -t /dev/sda
/dev/sda:
Timing buffered disk reads: 706 MB in 3.00 seconds = 235.19 MB/sec
root@NAS-J5005:/home/ludovic#
Et par le réseau gigabits/s, je transfère les fichiers en NFS à 104Mo/s du NAS à l'ordinateur et inversement.
#80 Le 29/06/2021, à 19:45
- Compte supprimé
Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.
mon déménagement dans 3 semaines…
non, mais ça, on s'en fout.
le plus important c'est ton script.
tant pis pour le déménagement.
Lol. Non, à 44 ans, l'ordinateur n'est plus le plus important, mais ça aide bien. Je vais mettre en place bientôt ma station d'enregistrements avec 4 tuners TNTHD-radios via le NAS-J5005, directement sur le disque dur du NAS. Plus tard, je retoucherai mes enregistrement télévisés en édition-suppression des publicités, pour ne garder que les films ou émissions. Mais il me faut un accès physique simplifié au NAS-J5005 pour faire ça, et la prise d'antenne à mettre dans mon amplificateur TV 1 entrée - 4 sorties, spécialement prévu pour cet usage, ce que je ne peux pas faire chez moi avant le déménagement. La vie en fauteuil roulant dans une pièce de 30m² n'est pas facile à gérer coté rangements et accès…
Dernière modification par Compte supprimé (Le 29/06/2021, à 19:46)
#81 Le 29/06/2021, à 19:51
- Compte supprimé
Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.
Bonjour
À mon avis, tu devrais remplacer la commande de suppression des fichiers
par la création d'une liste de fichiers dont tu ne lancerais plus tard l'effacement
qu’après avoir vérifié que les fichiers convertis sont bien lisibles.=======
Et je suis tout-à fait d'accord avec Watael :
Il est absolument hors de question que tu déménages avant que ce script soit terminé.
Non mais…En plus, tu as encore de la lecture à faire
concernant POSIX : https://pubs.opengroup.org/onlinepubs/9699919799/
Il est vrai que la création d'une liste de fichiers dont [je] ne lancerais plus tard l'effacement qu’après avoir vérifié que les fichiers convertis sont bien lisibles, m'éviterait le mode de débogage (=0 dans mon script).
Merci pour les deux nouveaux lien MicP, je vais essayer de les lire, ensuite j'espère les comprendre en plus de les lire…
Bonne soirée à tous !
Dernière modification par Compte supprimé (Le 29/06/2021, à 19:52)
#82 Le 29/06/2021, à 20:31
- MicP
Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.
Bonne soirée à toi aussi, repose toi bien,
et bon courage pour ce déménagement.
Hors ligne
#83 Le 29/06/2021, à 22:10
- Compte supprimé
Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.
Bonne soirée à toi aussi, repose toi bien,
et bon courage pour ce déménagement.
Merci !
Bonne nuit à tous ! Je vais essayer de me coucher plus tôt ce soir
#84 Le 30/06/2021, à 07:42
- Zakhar
Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.
Effectivement, voici un résumé de mon NAS remplaçant mon Synology DS212, devenu trop faiblard par rapport à mon utilisation :
Exactement ! Sans doute que ton DS212 avait potentiellement le couple Busybox+ash comme mon DS413j, et donc les scripts avec du bashism passent mal !
Pour ton nouveau NAS, c'est carrément un Debian Buster, donc il a sans doute dash en script par défaut, mais bash dans les paquets "essentiels". Cependant, quand "ça ne coûte pas plus cher", autant "faire portable" !
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#85 Le 30/06/2021, à 08:10
- Compte supprimé
Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.
Bonjour Zakhar
L_d_v_c@ a écrit :Effectivement, voici un résumé de mon NAS remplaçant mon Synology DS212, devenu trop faiblard par rapport à mon utilisation :
Exactement ! Sans doute que ton DS212 avait potentiellement le couple Busybox+ash comme mon DS413j, et donc les scripts avec du bashism passent mal !
Pour ton nouveau NAS, c'est carrément un Debian Buster, donc il a sans doute dash en script par défaut, mais bash dans les paquets "essentiels". Cependant, quand "ça ne coûte pas plus cher", autant "faire portable" !
Je crois en effet que c'était busybox+ash, mais je ne cherchais pas à faire des scripts.
Je l'avais modifié avec 2 disques SATA de 3To, et un disque USB de 3To, pour faire un Raid 5 qui allait entre 25 et 40Mo/s. C'est cette vitesse et la capacité de 6To qui étaient un peu faiblardes.
Et bien sur que mon but est d'apprendre à faire des scrpts portables au maximum. Je t'avais demandé plus haut si je dois tout réécrire avec #/bin/sh ?
#86 Le 03/07/2021, à 19:11
- Compte supprimé
Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.
Bonsoir à tous !
Une petite trouvaille de la soirée :
sudo apt install shellcheck
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
Les NOUVEAUX paquets suivants seront installés :
shellcheck
0 mis à jour, 1 nouvellement installés, 0 à enlever et 1 non mis à jour.
Il est nécessaire de prendre 2202 ko dans les archives.
Après cette opération, 17,7 Mo d'espace disque supplémentaires seront utilisés.
Réception de :1 http://deb.debian.org/debian buster/main amd64 shellcheck amd64 0.5.0-3 [2202 kB]
2202 ko réceptionnés en 1s (1909 ko/s)
Sélection du paquet shellcheck précédemment désélectionné.
(Lecture de la base de données... 601488 fichiers et répertoires déjà installés.)
Préparation du dépaquetage de .../shellcheck_0.5.0-3_amd64.deb ...
Dépaquetage de shellcheck (0.5.0-3) ...
Paramétrage de shellcheck (0.5.0-3) ...
Traitement des actions différées (« triggers ») pour man-db (2.8.5-2) ...
root@LibraZiK:~#
Et
ludovic@LibraZiK:~/LDVC/Art nature vid partiel$ shellcheck vp9back.bash
In vp9back.bash line 39:
echo $(mediainfo --Inform="General;%Duration%" "$1")
^-- SC2046: Quote this to prevent word splitting.
^-- SC2005: Useless echo? Instead of 'echo $(cmd)', just use 'cmd'.
In vp9back.bash line 63:
if [[ $suppression_automatique==1 ]]
^-- SC2077: You need spaces around the comparison operator.
In vp9back.bash line 75:
if [[ $suppression_automatique==1 ]]
^-- SC2077: You need spaces around the comparison operator.
In vp9back.bash line 87:
elif [[ $suppression_automatique==1 ]] #le fichier vidéo original est moins volumineux que le fichier recompressé VP9
^-- SC2077: You need spaces around the comparison operator.
In vp9back.bash line 121:
echoBlue "Conversion $fichier\nen $fichier.webm"
^-- SC1117: Backslash is literal in "\n". Prefer explicit escaping: "\\n".
In vp9back.bash line 124:
echo "Durée de la vidéo à recompresser : " $(mediainfo --Inform="General;%Duration/String3%" "$fichier")
^-- SC2046: Quote this to prevent word splitting.
In vp9back.bash line 159:
read -p "Appuyer sur une touche pour continuer."
^-- SC2162: read without -r will mangle backslashes.
ludovic@LibraZiK:~/LDVC/Art nature vid partiel$
Cool ! Une assistance à la maison…
Édit :
ludovic@LibraZiK:~/LDVC/Art nature vid partiel$ shellcheck vp9back.bash
ludovic@LibraZiK:~/LDVC/Art nature vid partiel$
Dernière modification par Compte supprimé (Le 03/07/2021, à 19:27)
#87 Le 03/07/2021, à 20:45
- Compte supprimé
Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.
Je viens de réparer un bogue que j'ai fait ce soir, mais je ne comprends pas pourquoi ça ne marchait pas avec une paire de double-guillemet et que ça marche avec deux paires de doubles-guillemets :
duree_video () {
mediainfo --Inform="General;%Duration% $1"
}
Ne fonctionne pas, mais :
duree_video () {
mediainfo --Inform="General;%Duration%" "$1"
}
Fonctionne !
Dernière modification par Compte supprimé (Le 03/07/2021, à 20:46)
#88 Le 03/07/2021, à 21:13
- Compte supprimé
Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.
J'ai à peine avancé ce soir mais ça vaut le coup d'archiver :
#!/bin/bash
# vp9.bash
# convertir vidéos en vp9
# LDVC@
# 202106210118 202106221624 202106232147 202106251226 202106261046 202106281459 202106281929 202107032124
# Remerciements :
# débogué par kamaris
# 202106220027
# astuce de l'informaticien Christian DELAIR pour la recherche automatique dans tous les sous-dossiers avec for fichier in "$(find . -type f)"
# 202106271930 202106281243
# débogué par Watael : descendre dans les sous-dossiers shopt -s nullglob globstar ; for f in ./**
# aide de documentatiors par MicP
# 202106281540
sleep 3
debut_heure_turbo=7 #ne pas écrire l'heure en commençant par un 0 (zéro) sinon cale créé un bogue.
threads_heure_turbo=3
debut_heure_calme=19 #ne pas écrire l'heure en commençant par un 0 (zéro) sinon cale créé un bogue
threads_heure_calme=2
suppression_automatique=0 # simulation suppression=0 ; suppression automatique=1 ;
#un peu de couleurs dans la console.
RED='\033[0;31m'
BLUE='\033[0;34m'
GREEN='\033[0;32m'
NC='\033[0m'
echoBlue () {
echo -e "${BLUE}$*${NC}"
}
echoGreen () {
echo -e "${GREEN}$*${NC}"
}
echoRed () {
echo -e "${RED}$*${NC}"
}
duree_video () {
mediainfo --Inform="General;%Duration%" "$1"
}
#dossier=$(zenity --title="Choisir un dossier de vidéos à compresser." --file-selection --file-selection --multiple --filename "${PWD}/")
#Si on clique sur le bouton Annuler
#if [ "$?" -eq 1 ]; then
#On quitte le script
# exit
#fi
#Sinon on continue
#echo "Recompression des vidéos du répertoire $dossier"
comparaison_nettoyage () {
fichier="$1"
#echo "DÉBUG : $fichier" #débogage.
taille1=$(stat -c%s "$fichier")
taille2=$(stat -c%s "$fichier.webm")
#echoGreen "TAILLES : $taille1 et $taille2" #débogage.
duree1=$(duree_video "$fichier")
duree2=$(duree_video "$fichier.webm")
echoGreen "DURÉES : $duree1 et $duree2" #débogage.
if (( (duree1-duree2)>100 || (duree2-duree1)>100 )) #(( (${((duree1-duree2))#-})>100 )) #si la valeur absolue de la différence fait plus de 100ms.
then #Les durées sont relativement différentes
echoRed "LES DURÉES SONT RELATIVEMENT DIFFÉRENTES : originale=$duree1 et conversion=$duree2."
if [[ $suppression_automatique == 1 ]]
then
echoBlue "Effacement de $fichier.webm"
rm -f "$fichier.webm"
else
echoRed "MISE DE CÔTÉ du $fichier.webm"
mv "$fichier.webm" "$fichier.webm-à_effacer"
fi
elif (( taille1 > taille2 )) #Les durées sont pratiquement les mêmes.
then echoGreen "Les durées sont pratiquement les mêmes à moins de 100 ms."
#le fichier vidéo original est plus volumineux que le fichier recompressé VP9
echoBlue "Le fichier vidéo original est plus volumineux que le fichier recompressé VP9."
if [[ $suppression_automatique == 1 ]]
then
echoBlue "Effacement de $fichier"
rm -f "$fichier"
echoGreen "Rennomage de $fichier.webm en $fichier.webm+"
mv "$fichier.webm" "$fichier.webm+"
else
echoGreen "SIMULATION SUPPRESSION de $fichier"
echoGreen "SIMULATION RENNOMAGE de $fichier.webm en $fichier.webm+" #on protège le fichier de ce script de conversion en ajoutant un +
# Le + à la fin du ficher ne protège pas un fichier en temps normal, mais c'est une façon de nommer les fichiers pour les mettre en valeur
# et signaler de ne pas les recompresser.
fi
elif [[ $suppression_automatique == 1 ]] #le fichier vidéo original est moins volumineux que le fichier recompressé VP9
then echoBlue "Le fichier vidéo original est moins volumineux que le fichier recompressé VP9."
echoRed "Effacement de $fichier.webm"
rm -f "$fichier.webm"
echoGreen "Renommage de $fichier en $fichier+" #on protège le fichier de ce script de conversion en ajoutant un +
# Le + à la fin du ficher ne protège pas un fichier en temps normal, mais c'est une façon de nommer les fichiers pour les mettre en valeur
# et signaler de ne pas les recompresser.
mv "$fichier" "$fichier+"
else
echoGreen "SIMULATION SUPPRESSION de $fichier.webm"
echoBlue "SIMULATION RENNOMAGE de $fichier en $fichier+"
fi
}
#routine principale
shopt -s nullglob globstar
for fichier in ./**
do
if [ "${fichier: -1}" != '+' ] && (file -b --mime-type "$fichier" | grep -q video || (file -b --mime-type "$fichier" | grep -q data) && [ "$(duree_video "$fichier")" -gt 10 ])
#if [ "${fichier: -1}" != '+' ] && file -b --mime-type "$fichier" | grep -q video
then
echo "Traitement du fichier vidéo : $fichier"
#date
echo "le fichier vidéo n'est pas protégé par un + à la fin du nom de fichier dans l'extension."
# Le + à la fin du ficher ne protège pas un fichier en temps normal, mais c'est une façon de nommer les fichiers pour les mettre en valeur
# et signaler de ne pas les recompresser.
if [ "$(file -b "$fichier")" != "WebM" ]
then # $fichier n'est pas WebM.
echo "$fichier n'est pas WebM."
if [ "$(file -b "$fichier.webm")" = "WebM" ]
then #Le fichier $fichier.webm existe.
echoGreen "Le fichier $fichier.webm existe."
#ls -l "$fichier"
#ls -l "$fichier.webm"
else #création de la conversion du fichier vidéo en WebM.
echoBlue "Conversion $fichier\\nen $fichier.webm"
heure=$(date '+%-H')
#echoBlue "Débogage : heure=$heure"
echo "Durée de la vidéo à recompresser : " $(mediainfo --Inform="General;%Duration/String3%" "$fichier")
if (( heure>debut_heure_turbo && heure<debut_heure_calme ))
then
echoGreen "Heure turbo : compression avec $threads_heure_turbo threads-coeurs-CPU."
threads_horaire=$threads_heure_turbo
else
echoGreen "Heure calme : compression avec $threads_heure_calme threads-coeurs-CPU."
threads_horaire=$threads_heure_calme
fi
ffmpeg \
-i "$fichier" \
-c:v:0 libvpx-vp9 \
-filter_threads $threads_horaire \
-crf 35 \
-b:v 1000k \
-tile-columns 4 \
-frame-parallel 1 \
-quality best \
-auto-alt-ref 1 \
-lag-in-frames 25 \
-c:a libopus \
-b:a 16k \
-strict -2 "$fichier.webm" \
-hide_banner \
-loglevel panic \
-stats
fi
comparaison_nettoyage "$fichier"
fi
else # $fichier ne sera pas traité.
echoRed "$fichier ne sera pas traité."
fi
echo
done
echoGreen "Fini."
read -r -p "Appuyer sur une touche pour continuer."
sleep 180
exit
Dernière modification par Compte supprimé (Le 03/07/2021, à 21:32)
#89 Le 03/07/2021, à 21:35
- Compte supprimé
Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.
Il ne reste qu'une petite erreur :
ludovic@ludovic-J5005:/nas/Datas/6To/0-système_secondaire/vidéos_secondaires/Films et reportages ++++++/tv$ shellcheck vp9.bash
In vp9.bash line 125:
echo "Durée de la vidéo à recompresser : " $(mediainfo --Inform="General;%Duration/String3%" "$fichier")
^-- SC2046: Quote this to prevent word splitting.
ludovic@ludovic-J5005:/nas/Datas/6To/0-système_secondaire/vidéos_secondaires/Films et reportages ++++++/tv$
Et mon test de vidéo est incomplet, car les fichiers .m2ts ne sont pas traités.
#90 Le 04/07/2021, à 10:46
- Compte supprimé
Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.
Bonjour à tous !
Voilà une version qui fonctionne assez bien apparemment.
#!/bin/bash
# vp9.bash
# convertir vidéos en vp9 suivant profil horaire.
# LDVC@
# 202106210118 202106221624 202106232147 202106251226 202106261046 202106281459 202106281929 202107032124 202107041129
# Remerciements :
# débogué par kamaris
# 202106220027
# astuce de l'informaticien Christian DELAIR pour la recherche automatique dans tous les sous-dossiers avec for fichier in "$(find . -type f)"
# 202106271930 202106281243
# débogué par Watael : descendre dans les sous-dossiers shopt -s nullglob globstar ; for f in ./**
# aide de documentatiors par MicP
# 202106281540
sleep 3
debut_heure_turbo=7 #ne pas écrire l'heure en commençant par un 0 (zéro) sinon cale créé un bogue.
threads_heure_turbo=3
debut_heure_calme=19 #ne pas écrire l'heure en commençant par un 0 (zéro) sinon cale créé un bogue
threads_heure_calme=2
suppression_automatique=0 # simulation suppression=0 ; suppression automatique=1 ;
#un peu de couleurs dans la console.
RED='\033[0;31m'
BLUE='\033[0;34m'
GREEN='\033[0;32m'
NC='\033[0m'
echoBlue () {
echo -e "${BLUE}$*${NC}"
}
echoGreen () {
echo -e "${GREEN}$*${NC}"
}
echoRed () {
echo -e "${RED}$*${NC}"
}
duree_video () {
mediainfo --Inform="General;%Duration%" "$1"
}
#dossier=$(zenity --title="Choisir un dossier de vidéos à compresser." --file-selection --file-selection --multiple --filename "${PWD}/")
#Si on clique sur le bouton Annuler
#if [ "$?" -eq 1 ]; then
#On quitte le script
# exit
#fi
#Sinon on continue
#echo "Recompression des vidéos du répertoire $dossier"
comparaison_nettoyage () {
fichier="$1"
#echo "DÉBUG : $fichier" #débogage.
taille1=$(stat -c%s "$fichier")
taille2=$(stat -c%s "$fichier.webm")
#echoGreen "TAILLES : $taille1 et $taille2" #débogage.
duree1=$(duree_video "$fichier")
duree2=$(duree_video "$fichier.webm")
echoGreen "DURÉES : $duree1 et $duree2" #débogage.
if (( (duree1-duree2)>100 || (duree2-duree1)>100 )) #(( (${((duree1-duree2))#-})>100 )) #si la valeur absolue de la différence fait plus de 100ms.
then #Les durées sont relativement différentes
echoRed "LES DURÉES SONT RELATIVEMENT DIFFÉRENTES : originale=$duree1 et conversion=$duree2."
if [[ $suppression_automatique == 1 ]]
then
echoBlue "Effacement de $fichier.webm"
rm -f "$fichier.webm"
else
echoRed "MISE DE CÔTÉ du $fichier.webm"
mv "$fichier.webm" "$fichier.webm-à_effacer"
fi
elif (( taille1 > taille2 )) #Les durées sont pratiquement les mêmes.
then echoGreen "Les durées sont pratiquement les mêmes à moins de 100 ms."
#le fichier vidéo original est plus volumineux que le fichier recompressé VP9
echoBlue "Le fichier vidéo original est plus volumineux que le fichier recompressé VP9."
if [[ $suppression_automatique == 1 ]]
then
echoBlue "Effacement de $fichier"
rm -f "$fichier"
echoGreen "Rennomage de $fichier.webm en $fichier.webm+"
mv "$fichier.webm" "$fichier.webm+"
else
echoGreen "SIMULATION SUPPRESSION de $fichier"
echoGreen "SIMULATION RENNOMAGE de $fichier.webm en $fichier.webm+" #on protège le fichier de ce script de conversion en ajoutant un +
# Le + à la fin du ficher ne protège pas un fichier en temps normal, mais c'est une façon de nommer les fichiers pour les mettre en valeur
# et signaler de ne pas les recompresser.
fi
elif [[ $suppression_automatique == 1 ]] #le fichier vidéo original est moins volumineux que le fichier recompressé VP9
then echoBlue "Le fichier vidéo original est moins volumineux que le fichier recompressé VP9."
echoRed "Effacement de $fichier.webm"
rm -f "$fichier.webm"
echoGreen "Renommage de $fichier en $fichier+" #on protège le fichier de ce script de conversion en ajoutant un +
# Le + à la fin du ficher ne protège pas un fichier en temps normal, mais c'est une façon de nommer les fichiers pour les mettre en valeur
# et signaler de ne pas les recompresser.
mv "$fichier" "$fichier+"
else
echoGreen "SIMULATION SUPPRESSION de $fichier.webm"
echoBlue "SIMULATION RENNOMAGE de $fichier en $fichier+"
fi
}
#routine principale
shopt -s nullglob globstar
for fichier in ./**
do
if [ "${fichier: -1}" != '+' ] && (file -b --mime-type "$fichier" | grep -q "video\\|BDBV\\|MPEG\\|ASF" || (file -b "$fichier" | grep -q data) && duree_video "$fichier" -gt 10 )
then
echo "Traitement du fichier vidéo : $fichier"
#date
echo "le fichier vidéo n'est pas protégé par un + à la fin du nom de fichier dans l'extension."
# Le + à la fin du ficher ne protège pas un fichier en temps normal, mais c'est une façon de nommer les fichiers pour les mettre en valeur
# et signaler de ne pas les recompresser.
if [ "$(file -b "$fichier")" != "WebM" ]
then # $fichier n'est pas WebM.
echo "$fichier n'est pas WebM."
if [ "$(file -b "$fichier.webm")" = "WebM" ]
then #Le fichier $fichier.webm existe.
echoGreen "Le fichier $fichier.webm existe."
#ls -l "$fichier"
#ls -l "$fichier.webm"
else #création de la conversion du fichier vidéo en WebM.
echoBlue "Conversion $fichier\\nen $fichier.webm"
heure=$(date '+%-H')
#echoBlue "Débogage : heure=$heure"
echo "Durée de la vidéo à recompresser : $(mediainfo --Inform="General;%Duration/String3%" "$fichier")"
if (( heure>debut_heure_turbo && heure<debut_heure_calme ))
then
echoGreen "Heure turbo : compression avec $threads_heure_turbo threads-coeurs-CPU."
threads_horaire=$threads_heure_turbo
else
echoGreen "Heure calme : compression avec $threads_heure_calme threads-coeurs-CPU."
threads_horaire=$threads_heure_calme
fi
ffmpeg \
-i "$fichier" \
-c:v:0 libvpx-vp9 \
-filter_threads $threads_horaire \
-crf 35 \
-b:v 1000k \
-tile-columns 4 \
-frame-parallel 1 \
-quality best \
-auto-alt-ref 1 \
-lag-in-frames 25 \
-c:a libopus \
-b:a 16k \
-strict -2 "$fichier.webm" \
-hide_banner \
-loglevel panic \
-stats
fi
comparaison_nettoyage "$fichier"
fi
else # $fichier ne sera pas traité.
echoRed "$fichier ne sera pas traité."
fi
echo
done
echoGreen "Fini."
read -r -p "Appuyer sur une touche pour continuer."
sleep 180
exit
Cette version prend en compte les fichiers MPG, et ASF en plus et .m2ts à travers le test grep data combiné à un test de durée…
À+
Édit : Il y a une petite erreur de syntaxe à cette ligne de test qui m'affiche la durée des vidéos :
if [ "${fichier: -1}" != '+' ] && (file -b --mime-type "$fichier" | grep -q "video\\|BDBV\\|MPEG\\|ASF" || (file -b "$fichier" | grep -q data) && duree_video "$fichier" -gt 10 )
Dernière modification par Compte supprimé (Le 04/07/2021, à 12:30)
#91 Le 04/07/2021, à 12:32
- Watael
Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.
if [ "${fichier: -1}" != '+' ] && (file -b --mime-type "$fichier" | grep -q les parenthèses ne servent à rien.
à côté de ça :
1- pourquoi tes fichiers vidéos sont-ils éparpillés dans des sous-répertoires ?
2- c'est toi qui enregistre les vidéos ? alors, tu pourrais entretenir une petite table de données externe* (au format texte, un simple fichier) qui listerait les formats desdites vidéos...
--
* pour éviter d'ouvrir le fichier du script
mais tu pourrais aussi maintenir un tableau de la liste des extensions connues.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#92 Le 04/07/2021, à 14:25
- Compte supprimé
Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.
Merci Watael.
En effet les parenthèses indispensables en logique semblent inutilisables avec BASH.
Il faut préférer les doubles crochets : https://abs.traduc.org/abs-5.3-fr/ch33s02.html
R1) mes fichiers vidéos sont éparpillés dans des sous-répertoires tout simplement parce qu'ils sont triés. Je ne mélange pas les fichiers vidéos des films que j'enregistre à la télévision, avec les émissions musicales, avec les vidéos personnelles, avec les vidéos récupérées sur internet, chaque chose est à sa place pour les retrouver plus vite.
R2) j'aurais bien voulu passer uniquement par les types MIME mais je suis obligé, lorsque je tombe sur un fichier de type MIME data, de vérifier la longueur de la vidéo, et si elle existe c'est que le fichier data est bien une vidéo. Quand j'enregistre avec ma TNT HD sur disque dur, les fichiers sont de type data, mais comme data ne veut rien dire, je vérifie s'il existe une durée vidéo pour ces fichiers.
#93 Le 04/07/2021, à 14:56
- Compte supprimé
Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.
J'aurais presque pu simplifier mes test avec la trop vieille commande avconv -i, mais je dois me débrouiller uniquement avec ffmpeg qui remplace avconv.
#94 Le 04/07/2021, à 14:56
- Watael
Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.
ta condition me semble traiter trop de cas d'un coup.
je mettrais plus de if, pour ajouter autant d'alertes sur les fichiers qui ne seront pas traités, et la raison pour laquelle ils ne le seront pas.
R2/ dans la mesure où les fichiers sont "éparpillés" sous un répertoire général (/home/user/mesEnregistrements/), et que sous ce répertoire il n'y a que des fichiers vidéos, tu devrais pouvoir être serein sur le type de fichiers qui seront trouvés.
traiter des données, c'est aussi, quand on le peut, structurer ces données.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#95 Le 04/07/2021, à 15:09
- Compte supprimé
Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.
Je généralise mon script, donc je suis obligé de tester si le fichier est bien une vidéo, peu importe l'extension qui ne veut rien dire sous GNU/Linux.
ludovic@LibraZiK:/media/nas/Datas/6To/0-système_secondaire/vidéos_secondaires/Films et reportages ++++++/tv$ ffmpeg -i tv-Films\ \&\ D.A./48\ heures.ed.m2ts 2>&1 | gawk 'match($0, /Duration: (.[^,]*)/, matches) {print matches[1]}'
01:40:56.33
ludovic@LibraZiK:/media/nas/Datas/6To/0-système_secondaire/vidéos_secondaires/Films et reportages ++++++/tv$
ludovic@LibraZiK:/media/nas/Datas/6To/0-système_secondaire/vidéos_secondaires/Films et reportages ++++++/tv$ cd /bin
ludovic@LibraZiK:/bin$ ffmpeg -i ./shred 2>&1 | gawk 'match($0, /Duration: (.[^,]*)/, matches) {print matches[1]}'
ludovic@LibraZiK:/bin$ cd ~/musiques\ +++/LDVC\@/Jingles\ LDVC\@/
ludovic@LibraZiK:~/musiques +++/LDVC@/Jingles LDVC@$ ffmpeg -i ./Jingle\ fr-001.ogg 2>&1 | gawk 'match($0, /Duration: (.[^,]*)/, matches) {print matches[1]}'
00:00:08.57
Ça semble bien, si la durée n'est pas nulle, c'est que le fichier est soit vidéo, soit sonore…
#96 Le 04/07/2021, à 15:29
- MicP
Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.
Ceci dit, si tu lances une conversion vidéo d'un fichier qui n'est pas un fichier vidéo, le programme de conversion ne le fera tout simplement pas,
et retournera un message d'erreur => le test pour savoir s'il s'agit bien d'un fichier vidéo est fait.
Dernière modification par MicP (Le 04/07/2021, à 15:32)
Hors ligne
#97 Le 04/07/2021, à 15:45
- Watael
Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.
peu importe l'extension qui ne veut rien dire sous GNU/Linux.
j'ai des fichiers .bio, qui ne veulent rien dire pour Linux, mais qui me disent que ce sont des fichiers de ma biographie.
c'est moi qui choisit ce qui a du sens pour moi, mais par convention, je garde l'extension en rapport avec le type du fichier.
ce n'est pas parce que ça ne veut rien dire qu'on ne peut pas lui donner du sens.
en l'occurrence, l'extension qui n'est pas (correctement) reconnue par file peut être ajouté/configuré dans le fichier /etc/mime.types
il faut ensuite exécuter la commande update-mime-database
Je généralise mon script
si c'est ce que je crois, ce n'est pas une bonne idée : « une commande fait une chose, et la fait bien ».
ensuite, rien ne t'empêche de faire un "wrapper" qui, selon les paramètres/options qui lui seront passés, appellera d'autres scripts (sur le même modèle : lister des fichiers), qui font des traitements différents...
Dernière modification par Watael (Le 04/07/2021, à 15:58)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#98 Le 04/07/2021, à 15:48
- Compte supprimé
Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.
Ceci dit, si tu lances une conversion vidéo d'un fichier qui n'est pas un fichier vidéo, le programme de conversion ne le fera tout simplement pas,
et retournera un message d'erreur => le test pour savoir s'il s'agit bien d'un fichier vidéo est fait.
Dans ce cas-là je tente de simplifier, si la durée existe, je vais voir pour les fichiers audio :
elif [ "${fichier: -1}" != '+' ] && [ "${fichier: -14}" != '.webm-à_effacer' ] && duree_video "$fichier" -gt 100
#99 Le 04/07/2021, à 15:53
- Compte supprimé
Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.
si c'est ce que je crois, ce n'est pas une bonne idée : « une commande fait une chose, et la fait bien ».
ensuite, rien ne t'empêche de faire un "wrapper" qui, selon les paramètres/options qui lui seront passés, appellera d'autres scripts (sur le même modèle : lister des fichiers), qui font des traitements différents...
Je voulais dire que le script ne doit pas se fier à l'extension, et comme je diffuse le script, le programme doit anticiper toute les possibilités pour ne pas planter (bien faire les choses).
édit : je suis bien obligé de tester les durées mais je dois séparer les audios des vidéos, car la conversion ne plante pas sur l'audio, ça convertit l'audio en .webm.
Dernière modification par Compte supprimé (Le 04/07/2021, à 16:20)
#100 Le 04/07/2021, à 16:00
- Watael
Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.
Je voulais dire que le script ne doit pas se fier à l'extension
parce que ça génère des "erreurs" !?
si les types mime étaient correctement identifiés ce ne serait pas utile.
j'ai édité mon message précédent à propos de l'entretien de la base de données des type mime.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne