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.

#101 Le 04/07/2021, à 17:14

MicP

Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.

Pour tester s'il s'agit bien d'un fichier vidéo et même avoir d'autres informations comme par exemple la durée de la vidéo
dans le paquetage ffmpeg il y a le programme ffprobe

Hors ligne

#102 Le 04/07/2021, à 17:14

Watael

Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.

oula! non!
j'ai mal interprété le sortie des commandes que j'ai lancées pour tester la manip de màj de /etc/mime-types.
ce que j'ai indiqué ne modifie pas la sortie de file. sad


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#103 Le 04/07/2021, à 17:23

Compte supprimé

Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.

Watael a écrit :

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.

Non, c'est injouable d'avoir deux fichiers pour un seul script. Ce script doit être autonome. (Bien que je n'ai pas géré les dépendances).
À la limite je mets une base de données en textes à l'intérieur du script, mais ça reviens à faire ce que j'avais commencé en chaînant les tests…

Dernière modification par Compte supprimé (Le 04/07/2021, à 17:25)

#104 Le 04/07/2021, à 17:41

Compte supprimé

Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.

J'en ai marre de galérer pour un simple test a*b*(/c)*d.
Apparemment je ne dois pas utiliser «!» pour faire la négation, mais je dois utiliser «~». Et puis parenthèses, crochets, double-parenthèses, double-crochets, toujours au hasard tant que je n'ai pas une méthode fiable.

Watael a écrit :

pourquoi les simples parenthèses dans les commandes, et que parfois il faut des doubles-parenthèses

ce ne sont pas les mêmes commandes :
- le crochet simple ([) est un alias interne vers la commande test. cf. man bash /test, ou help [
- les crochets doubles ([[) introduit des capacités de test augmentées cf. man bash /[[, ou help [[
- la parenthèse simple (() exécute les commandes dans un sous-shell (un processus enfant). cf. man bash / commandes composées
- la parenthèse simple précédée d'un dollar ($() permet d'utiliser la sortie les commandes. cf. man bash /substitution de commandes
- les parenthèses doubles introduise un contexte arithmétique. cf. man bash /Développement arithmétique, et /Évaluation arithmétique

en gros : man bash.  lol

C'est la grosse partie que je n'ai pas comprise. Je ne sais pas faire les tests fiables sous BASH. Pourtant je suis arrivé à bout de l'autoformation, et j'ai repris de la lecture de liens…
Je ne saurais pas traduire la sortie logique : S = a/ * b * ( c + d/ ) en BASH.

Pire, j'ai l'impression qu'il n'y a pas de distributivité en tests BASH et que les tests se font de gauche à droite.

Dernière modification par Compte supprimé (Le 04/07/2021, à 18:02)

#105 Le 04/07/2021, à 17:45

Compte supprimé

Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.

Apparemment le test ((…)) teste une valeur numérique (0/1) tandis que le test [[…]] teste un booléen (vrai/faux).

Dernière modification par Compte supprimé (Le 04/07/2021, à 17:52)

#106 Le 04/07/2021, à 18:20

Watael

Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.

((...)) le test se fait dans un contexte strictement arithmétique, et ne traite que des nombres.
test, [, [[ sont des tests plus généraux, et traite du texte, des nombres... en fonction des options utilisées.

! est une négation.
~ est un opérateur de regex.

comme je l'ai dit tes tests devraient être scindés sur plusieurs if
le code serait aussi plus lisible.

À la limite je mets une base de données en textes à l'intérieur du script, mais ça reviens à faire ce que j'avais commencé en chaînant les tests…

declare -a knownMimeTypes= ( abc def ghi )
mimeRgx=$(IFS='|'; echo "${mimeTypes[*]}")
if [[ $nomFichier =~ $mimeRgx ]]; ...

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#107 Le 04/07/2021, à 18:21

Compte supprimé

Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.

MicP a écrit :

Pour tester s'il s'agit bien d'un fichier vidéo et même avoir d'autres informations comme par exemple la durée de la vidéo
dans le paquetage ffmpeg il y a le programme ffprobe

Non ! C'est pire que toutes les solutions précédentes.

#108 Le 04/07/2021, à 18:27

Compte supprimé

Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.

Watael a écrit :

((...)) le test se fait dans un contexte strictement arithmétique, et ne traite que des nombres.
test, [, [[ sont des tests plus généraux, et traite du texte, des nombres... en fonction des options utilisées.

! est une négation.
~ est un opérateur de regex.

comme je l'ai dit tes tests devraient être scindés sur plusieurs if
le code serait aussi plus lisible.

À la limite je mets une base de données en textes à l'intérieur du script, mais ça reviens à faire ce que j'avais commencé en chaînant les tests…

declare -a knownMimeTypes= ( abc def ghi )
mimeRgx=$(IFS='|'; echo "${mimeTypes[*]}")
if [[ $nomFichier =~ $mimeRgx ]]; ...

Balaise mais ça empêche toute évolution automatique à mon script. Il faut entretenir la base de types knownMimeTypes.

Si j'arrive à coder le test [ BLABLA ] ET [blabla2] ET [ PAS audio ] ET [ durée > 100ms ] alors mon script dépendra de «file -b» et n'aura besoin d'aucune mise à jour.

#109 Le 04/07/2021, à 18:37

Compte supprimé

Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.

J'ai peut-être réussi mon test !

	elif [ "${fichier: -1}" != '+' ] && [ "${fichier: -14}" != '.webm-à_effacer' ] && file -b "$fichier" | grep -q "^audio" && $(duree_video "$fichier") -gt 100

#110 Le 04/07/2021, à 18:38

Compte supprimé

Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.

J'arrête avant de tout casser ! À+

#111 Le 04/07/2021, à 18:39

Watael

Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.

je persiste : cette unique ligne de teste, pour tester des choses très différentes, est "périlleuse", et ne permet pas un débuggage fin/subtile.
àmha, c'est une fausse bonne idée.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#112 Le 04/07/2021, à 20:28

Compte supprimé

Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.

Watael a écrit :

je persiste : cette unique ligne de teste, pour tester des choses très différentes, est "périlleuse", et ne permet pas un débuggage fin/subtile.
àmha, c'est une fausse bonne idée.

Tu avais raison. J'ai découpé en plusieurs tests et ça me permet de mieux tracer les erreurs et d'obtenir mon test «n'est pas audio». Je suis un peu fatigué. Bonne soirée Watael.

#113 Le 04/07/2021, à 20:36

Compte supprimé

Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.

Voilà l'archivage de ce soir :

#!/bin/bash
# vp9.bash 
# convertir vidéos en vp9 suivant profil horaire.
# LDVC@
# 202106210118 202106221624 202106232147 202106251226 202106261046 202106281459 202106281929 202107032124 202107041129 202107042013
# 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
# apt-get update && apt-get install libav-tools

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)>500 || (duree2-duree1)>500 ))	#(( (${((duree1-duree2))#-})>500  ))  #si la valeur absolue de la différence fait plus de 500ms.
	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 500 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 [ -d "$fichier" ]
	then	#c'est un répertoire
		echo "Traitement du répertoire $fichier :"
	#elif [ "${fichier: -1}" != '+' ] && [ "${fichier: -14}" != '.webm-à_effacer' ] && (file -b --mime-type "$fichier" | grep -q "video\\|BDBV\\|MPEG\\|ASF" || (file -b "$fichier" | grep -q data) && duree_video "$fichier" -gt 100 )
	elif [ "${fichier: -1}" != '+' ] && [ "${fichier: -14}" != '.webm-à_effacer' ]
	then	#fichier non protégé
		if ( file -b "$fichier" | grep -q audio )
		then
			echo "$fichier est un fichier audio."
		elif duree_video "$fichier" -gt 100
		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é.
			echoBlue "$fichier ne sera pas traité."
		fi
		echo
	fi
done
echoGreen "Fini."
read -r -p "Appuyer sur une la touche Entrée pour continuer."
exit

#114 Le 04/07/2021, à 20:53

Compte supprimé

Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.

Quelqu'un m'avait lancé sur :

$ macommande > /dev/null 2>&1

Ou une syntaxe du genre que je dois apprendre par cœur et comprendre. Il a dû éditer son message, car je ne retrouve pas la référence. J'ai plus ou moins compris que ça redirige la sortie d'erreur… mais j'ai besoin de travailler ça aussi.

Je vais également essayer de comprendre «REGEX».

Bonne soirée à tous !

Dernière modification par Compte supprimé (Le 04/07/2021, à 20:55)

#115 Le 04/07/2021, à 22:41

kamaris

Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.

L_d_v_c@ a écrit :

Si j'arrive à coder le test [ BLABLA ] ET [blabla2] ET [ PAS audio ] ET [ durée > 100ms ] alors mon script dépendra de «file -b» et n'aura besoin d'aucune mise à jour.
[…]

elif [ "${fichier: -1}" != '+' ] && [ "${fichier: -14}" != '.webm-à_effacer' ] && file -b "$fichier" | grep -q "^audio" && $(duree_video "$fichier") -gt 100

->

elif [ "${fichier: -1}" != '+' ] && [ "${fichier: -14}" != '.webm-à_effacer' ] && ! file -b "$fichier" | grep -q "^audio" && [ $(duree_video "$fichier") -gt 100 ]

Hors ligne

#116 Le 04/07/2021, à 23:11

MicP

Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.

Dans son message #114, L_d_v_c@ a écrit :

Quelqu'un m'avait lancé sur :

$ macommande > /dev/null 2>&1

Ou une syntaxe du genre que je dois apprendre par cœur et comprendre.

Il vaut mieux commencer d'abord par bien comprendre
le fonctionnement des redirections de flux et plus particulièrement des flux stdin stdout et stderr,
comme ça, il ne te restera plus qu'à le mettre en pratique pour pouvoir le mémoriser facilement.

https://fr.wikipedia.org/wiki/Flux_standard

https://wiki.bash-hackers.org/howto/red … n_tutorial

http://mpailhe.free.fr/bashMic/sanchis/ch05.html

Dernière modification par MicP (Le 04/07/2021, à 23:23)

Hors ligne

#117 Le 06/07/2021, à 00:41

Compte supprimé

Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.

Merci kamaris et MicP.
Pour les regex, ça va mieux même si je ne suis pas au point :
https://www.lucaswillems.com/fr/article … regulieres

#118 Le 06/07/2021, à 01:50

MicP

Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.

Tu peux aussi aller lire la page Wikipédia concernant les expressions rationnelles

et : https://www.grymoire.com/Unix/Regular.html

Dernière modification par MicP (Le 06/07/2021, à 01:52)

Hors ligne

#119 Le 10/07/2021, à 21:36

Compte supprimé

Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.

Bonsoir,
J'avais oublié les crochets à cette ligne de test qui n'était pas réalisée (d'où bogue) :

		elif [ duree_video "$fichier" -gt 100 ]

Alors je mets les crochets, obligé d'ajouter $(…) et :

		elif [ "$(duree_video "$fichier")" -gt 100 ]

ne me permet pas de tester les fichiers vidéos, contrairement à ce qui était suggéré, le script plante sur lui même (fichier BASH) et renvoie l'erreur :

/home/ludovic/LDVC/Art nature vid partiel/test/vp9.bash: ligne 115 : [:  : nombre entier attendu comme expression
./vp9.bash ne sera pas traité.

Mon idée de tester les vidéos après avoir éliminé les audios, ne fonctionne pas puisque le fichier bash du script lui-même fait planter mon test puisque la durée vidéo d'un ficher bash n'existe pas…

Je suis donc obligé d'ajouter un test :

	elif [ "${fichier: -1}" != '+' ] && [ "${fichier: -14}" != '.webm-à_effacer' ]
	then	#fichier non protégé
		if ( file -b "$fichier" | grep -q audio )
		then
			echo "$fichier est un fichier audio."
		elif [ -n "$(duree_video "$fichier")" ] #le test a-t-il une valeur retour ?
		then
			if [ "$(duree_video "$fichier")" -gt 100 ]
			then
				echo "Traitement du fichier vidéo : $fichier"
	

Et désormais le script semble mieux fonctionner, voici l'archivage de ce soir :

#!/bin/bash
# vp9.bash 
# convertir vidéos en vp9 suivant profil horaire.
# LDVC@
# 202106210118 202106221624 202106232147 202106251226 202106261046 202106281459 202106281929 202107032124 202107041129 202107042013 202107061757 202107102133
# 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
# apt-get update && apt-get install libav-tools

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=1 # 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 () {
	echo "$(mediainfo --Inform="General;%Duration%" "$1")" | awk '{printf("%.0f\n", $1);}'	#astuce pour arrondir la durée en milliseconde à l'entier
}

#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)>1000 || (duree2-duree1)>1000 ))	#(( (${((duree1-duree2))#-})>1000  ))  #si la valeur absolue de la différence fait plus de 1000ms.
	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 1000 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 [ -d "$fichier" ]
	then	#c'est un répertoire
		echo "Traitement du répertoire $fichier :"
	#elif [ "${fichier: -1}" != '+' ] && [ "${fichier: -14}" != '.webm-à_effacer' ] && (file -b --mime-type "$fichier" | grep -q "video\\|BDBV\\|MPEG\\|ASF" || (file -b "$fichier" | grep -q data) && duree_video "$fichier" -gt 100 )
	elif [ "${fichier: -1}" != '+' ] && [ "${fichier: -14}" != '.webm-à_effacer' ]
	then	#fichier non protégé
		if ( file -b "$fichier" | grep -q audio )
		then
			echo "$fichier est un fichier audio."
		elif [ -n "$(duree_video "$fichier")" ] #le test a-t-il une valeur retour ?
		then
			if [ "$(duree_video "$fichier")" -gt 100 ]
			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é.
			echoBlue "$fichier ne sera pas traité."
			fi
			echo
		fi
	fi
done
echoGreen "Fini."
read -r -p "Appuyer sur une la touche Entrée pour continuer."
exit

Édit : non, ça ne fonctionne pas pour les fichiers, erreur en ligne 117, le test attend un nombre entier comme expression.
Je vais me coucher, ça ne sert à rien de luter… il faut dormir.

ludovic@NAS-J5005:~$ cd '/nas/Datas/6To/0-système_secondaire/vidéos_secondaires/Films et reportages ++++++/tv'
ludovic@NAS-J5005:/nas/Datas/6To/0-système_secondaire/vidéos_secondaires/Films et reportages ++++++/tv$ ./vp9.bash 
Traitement du répertoire ./ :
Traitement du répertoire ./tv-Films & D.A. :
./vp9.bash: ligne 117 : [: 6055120.000000 : nombre entier attendu comme expression
./tv-Films & D.A./48 heures.ed.m2ts ne sera pas traité.

./vp9.bash: ligne 117 : [: 8967061.000000 : nombre entier attendu comme expression
./tv-Films & D.A./Blade Runner 2049 - 20-09-2020 21h05 02h29.ed.m2ts ne sera pas traité.

./vp9.bash: ligne 117 : [: 4729440.000000 : nombre entier attendu comme expression
./tv-Films & D.A./Boule Bill - 05-07-2020 21h05 01h18.ed.m2ts ne sera pas traité.

./vp9.bash: ligne 117 : [: 5187580.500000 : nombre entier attendu comme expression
./tv-Films & D.A./Brillantissime - 31-05-2020 21h05 01h26.ed.m2ts ne sera pas traité.

./vp9.bash: ligne 117 : [: 5112279.000000 : nombre entier attendu comme expression
./tv-Films & D.A./Coexister - 03-05-2020 21h05.ed.m2ts ne sera pas traité.

./vp9.bash: ligne 117 : [: 5850360.000000 : nombre entier attendu comme expression
./tv-Films & D.A./Diversion.ed.m2ts ne sera pas traité.

Traitement du fichier vidéo : ./tv-Films & D.A./Double Zéro.ed.mpg
le fichier vidéo n'est pas protégé par un + à la fin du nom de fichier dans l'extension.
./tv-Films & D.A./Double Zéro.ed.mpg n'est pas WebM.
Conversion ./tv-Films & D.A./Double Zéro.ed.mpg
en ./tv-Films & D.A./Double Zéro.ed.mpg.webm
Durée de la vidéo à recompresser : 01:24:37.953
Heure calme : compression avec 2 threads-coeurs-CPU.
^Came=   40 fps=2.9 q=0.0 size=       1kB time=00:00:01.73 bitrate=   4.1kbits/s speed=0.125x   

Ça doit être la fonction qui retourne la durée de la vidéo en millisecondes qui ne retourne pas un entier.

Édit : et non je ne peux pas dormir avec ce bogue !
Je modifie ma fonction de retour de durée avec valeur entière :

duree_video () {
	echo "$(mediainfo --Inform="General;%Duration%" "$1")" | awk '{printf("%.0f\n", $1);}'	#astuce pour arrondir la durée en milliseconde à l'entier
}

Et ça devrait mieux fonctionner !!!

Dernière modification par Compte supprimé (Le 10/07/2021, à 23:25)

#120 Le 11/07/2021, à 00:22

Watael

Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.

je ne dégainerais pas awk, je ferais un simple mediainfo... | cut -d '.' -f1.
ou

LC_NUMERIC=C printf '%0.f\n' $(mediainfo ...)

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#121 Le 11/07/2021, à 00:30

Compte supprimé

Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.

Watael a écrit :

je ne dégainerais pas awk, je ferais un simple mediainfo... | cut -d '.' -f1.
ou

LC_NUMERIC=C printf '%0.f\n' $(mediainfo ...)

Merci Watael. Je ne connais pas awk et j'ai fait un copié collé...
Cut semble plus simple en effet, j'expérimenterai dans la journée.
Bonne nuit.

#122 Le 11/07/2021, à 11:54

Compte supprimé

Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.

Voilà, c'est plus facile le matin quand j'y vois mieux, voici l'archivage des nouvelles modifications et ajouts de commentaires :

#!/bin/bash
# vp9.bash 
# convertir vidéos en vp9 suivant profil horaire.
# Licence Creative Commons By-NC-SA
# LDVC@
# 202106210118 202106221624 202106232147 202106251226 202106261046 202106281459 202106281929 202107032124 202107041129 202107042013 202107061757 202107102133 202107111150
# 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 ./** et utilisation de cut -d '.' -f1
# aide de documentations par MicP
# 202106281540 202107042311
# Suivi de l'évolution du script : https://forum.ubuntu-fr.org/viewtopic.php?pid=22466288#p22466288
# apt-get update && apt-get install libav-tools ffmpeg

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=1 # 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"|cut -d '.' -f1	#astuce pour arrondir la durée en milliseconde à l'entier
}

#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)>1000 || (duree2-duree1)>1000 ))	#(( (${((duree1-duree2))#-})>1000  ))  #si la valeur absolue de la différence fait plus de 1000ms.
	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 1000 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 [ -d "$fichier" ]	#test est-ce un répertoire ?
	then	#c'est un répertoire
		echo -e "Traitement du répertoire $fichier : \\n"
	elif [ "${fichier: -1}" != '+' ] && [ "${fichier: -1}" != '-' ] &&[ "${fichier: -14}" != '.webm-à_effacer' ]  #le fichier est-il protégé ?
	then	#fichier non protégé
		if ( file -b "$fichier" | grep -q audio ) #le fichier est-il audio ?
		then
			echo "$fichier est un fichier audio."
		elif [ -n "$(duree_video "$fichier")" ] #le fichier n'est pas audio alors le test de durée a-t-il une valeur retour ?
		then #le fichier a une durée vidéo
			if [ "$(duree_video "$fichier")" -gt 100 ] #la durée valeur retour est-elle plus grande que 100ms ? si oui, puisque ce n'est pas audio alors c'est vidéo
			then #on est en présence d'un fichier vidéo
				if [ -e "$fichier.webm+" ] #si le fichier.webm+ existe
				then #le fichier.webm+ existe
					if [[ $suppression_automatique == 1 ]]
					then #le fichier.webm+ existe alors on efface le fichier
						echoBlue "Effacement de $fichier"
						rm -f "$fichier"
					else
						echoGreen "SIMULATION SUPPRESSION de $fichier"
						mv "$fichier" "$fichier-"
					fi
				else	
					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\\n$fichier\\nen\\n$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
				fi
			else	# $fichier ne sera pas traité.
				echoBlue "$fichier ne sera pas traité."
			fi
			echo
		fi
	elif [ "${fichier: -1}" == '-' ] || [ "${fichier: -14}" == '.webm-à_effacer' ]
	then
		if [[ $suppression_automatique == 1 ]]
		then #le fichier.webm+ existe alors on efface le fichier
			echoBlue "Effacement de $fichier"
			rm -f "$fichier"
		else
			echoGreen "SIMULATION SUPPRESSION de $fichier"
		fi
	fi
done
echoGreen "Fini."
read -r -p "Appuyer sur une la touche Entrée pour continuer."
exit

Dernière modification par Compte supprimé (Le 11/07/2021, à 12:08)

#123 Le 12/07/2021, à 08:43

Compte supprimé

Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.

Bonjour à tous !
Il y a une erreur algorithmique dans mon script (ça s'est très embêtant personnellement) qui ne cherche pas à convertir les vidéos .m2ts
Mon script n'est pas fini. Je dois reprendre mon algorithme et vérifier mes tests. Un test mal effectué peut détourner mon script.
À+

Édit : Ah non ! C'est ffmpeg qui n'arrive pas à compresser certaines vidéos m2ts… ça se complique, l'algorithme et les tests sont bons mais vu que la compression ne se fait pas pour certains fichiers, ça ressort aussitôt et ça passe à la phase de nettoyage…

Édit 2 : En fait ce sont les télétextes et sous-titrages qui font échouer la conversion de certaines vidéos.

Dernière modification par Compte supprimé (Le 12/07/2021, à 11:03)

#124 Le 12/07/2021, à 11:41

Compte supprimé

Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.

Voici la rectification embarrassante de ce matin : je suis obligé de retirer les sous-titres télétextes de mes vidéos si je veux que le script convertissent toutes les vidéos. C'est embarrassant, car j'aimais bien avoir les sous-titres disponibles si je dois passer la vidéo à quelqu'un qui entend mal et qui se sert des sous-titrages pour «sourds et malentendants».

Ce point sera éventuellement à rétablir par la suite (option -sn de ffmpeg).

En attendant, voici l'archivage de ce matin :

#!/bin/bash
# vp9.bash 
# convertir vidéos en vp9 suivant profil horaire.
# LDVC@
# 202106210118 202106221624 202106232147 202106251226 202106261046 202106281459 
# 202106281929 202107032124 202107041129 202107042013 202107061757 202107102133
# 202107111150 202107120856 202107121135
# 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 ./** et utilisation de cut -d '.' -f1
# aide de documentatiors par MicP
# 202106281540
# apt-get update && apt-get install libav-tools

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=1 # 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"|cut -d '.' -f1	#astuce pour arrondir la durée en milliseconde à l'entier
}

#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)>1000 || (duree2-duree1)>1000 ))	#(( (${((duree1-duree2))#-})>1000  ))  #si la valeur absolue de la différence fait plus de 1000ms.
	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 1000 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 [ -d "$fichier" ]	#test est-ce un répertoire ?
	then	#c'est un répertoire
		echo -e "Traitement du répertoire $fichier : \\n"
	elif [ "${fichier: -1}" != '+' ] && [ "${fichier: -1}" != '-' ] &&[ "${fichier: -14}" != '.webm-à_effacer' ]  #le fichier est-il protégé ?
	then	#fichier non protégé
		if ( file -b "$fichier" | grep -q audio ) #le fichier est-il audio ?
		then
			echo "$fichier est un fichier audio."
		elif [ -n "$(duree_video "$fichier")" ] #le fichier n'est pas audio alors le test de durée a-t-il une valeur retour ?
		then #le fichier a une durée vidéo
			if [ "$(duree_video "$fichier")" -gt 100 ] #la durée valeur retour est-elle plus grande que 100ms ? si oui, puisque ce n'est pas audio alors c'est vidéo
			then #on est en présence d'un fichier vidéo
				if [ -e "$fichier.webm+" ] #si le fichier.webm+ existe
				then #le fichier.webm+ existe
					if [[ $suppression_automatique == 1 ]]
					then #le fichier.webm+ existe alors on efface le fichier
						echoBlue "Effacement de $fichier"
						rm -f "$fichier"
					else
						echoGreen "SIMULATION SUPPRESSION de $fichier"
						mv "$fichier" "$fichier-"
					fi
				else	
					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\\n$fichier\\nen\\n$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
							echo "Début compression :"	
							ffmpeg \
								-i "$fichier" \
								-sn \
								-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
	#ffmpeg -i "$fichier" -c:v:0 libvpx-vp9 -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
				fi
			else	# $fichier ne sera pas traité.
				echoBlue "$fichier ne sera pas traité."
			fi
			echo
		fi
	elif [ "${fichier: -1}" == '-' ] || [ "${fichier: -14}" == '.webm-à_effacer' ]
	then
		if [[ $suppression_automatique == 1 ]]
		then #le fichier.webm+ existe alors on efface le fichier
			echoBlue "Effacement de $fichier"
			rm -f "$fichier"
		else
			echoGreen "SIMULATION SUPPRESSION de $fichier"
		fi
	fi
done
echoGreen "Fini."
read -r -p "Appuyer sur une la touche Entrée pour continuer."
exit

Édit : La faute algorithmique est que j'ai considéré que toute conversion vidéo aboutirait, au lieu de tester le résultat. Je pourrai améliorer ce coté plus tard. En attendant, ça va déjà compresser pas mal de vidéos jusqu'à la veille de mon déménagement du 22 juillet 2021. Le NAS et l'ordinateur travaillent plein %CPU la journée, le NAS étant fait dans une carcasse d'ordinateur récupérée à la déchetterie, le ventilateur est bruyant quand il tourne à plein régime (d'où l'utilité de ce script) , c'est pourquoi je mets manuellement une conversion sur deux du NAS en pause le soir, comme ça si j'ai besoin de calme la journée, même remède : la pause d'une conversion sur deux. Quant à l'ordinateur, même carte-mère, mais entièrement neuf avec 32Gio de RAM pour virtualbox et l'émulateur FS-UEA (Amiga). L'ordinateur MAO peut travailler jour et nuit, il est quasiment inaudible avec le RAID 0 SSD, les processeurs J5005-itx sont fanless.

Dernière modification par Compte supprimé (Le 12/07/2021, à 17:20)

#125 Le 22/11/2021, à 17:51

Compte supprimé

Re : [RÉSOLU] Script 1, compression adaptative vidéos fonctions de l'heure.

Salut !
4 mois après mon déménagement, me revoilà. L'ordinateur principal est branché depuis la semaine dernière grâce à mes aides à domicile (qui doivent également gérer les courses, le ménage et le déballage des cartons du déménagement donc l'ordinateur est secondaire) et le script fonctionne dans sa version actuelle depuis 11 jours, l'ayant corrigé à partir de mon smartphone avec rdesktop connecté sur le serveur depuis le smartphone.

Je poste ma dernière correction, à cause des différences de durées entre les vidéos originales et converties en vp9, je suis obligé de faire tolérer jusqu'à 2000 ms d'écart au script avant de considérer une erreur de différence de durée.

Voici donc la dernière version qui tourne depuis 11 jours sans erreur.

#!/bin/bash
# vp9.bash 
# convertir vidéos en vp9 suivant profil horaire.
# LDVC@
# 202106210118 202106221624 202106232147 202106251226 202106261046 202106281459 
# 202106281929 202107032124 202107041129 202107042013 202107061757 202107102133
# 202107111150 202107120856 202107121135 202111101439
# 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 ./** et utilisation de cut -d '.' -f1
# aide de documentatiors par MicP
# 202106281540
# apt-get update && apt-get install libav-tools

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=1 # 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"|cut -d '.' -f1	#astuce pour arrondir la durée en milliseconde à l'entier
}

#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)>2000 || (duree2-duree1)>2000 ))	#(( (${((duree1-duree2))#-})>2000  ))  #si la valeur absolue de la différence fait plus de 2000ms.
	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 2000 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 [ -d "$fichier" ]	#test est-ce un répertoire ?
	then	#c'est un répertoire
		echo -e "Traitement du répertoire $fichier : \\n"
	elif [ "${fichier: -1}" != '+' ] && [ "${fichier: -1}" != '-' ] &&[ "${fichier: -14}" != '.webm-à_effacer' ]  #le fichier est-il protégé ?
	then	#fichier non protégé
		if ( file -b "$fichier" | grep -q audio ) #le fichier est-il audio ?
		then
			echo "$fichier est un fichier audio."
		elif [ -n "$(duree_video "$fichier")" ] #le fichier n'est pas audio alors le test de durée a-t-il une valeur retour ?
		then #le fichier a une durée vidéo
			if [ "$(duree_video "$fichier")" -gt 100 ] #la durée valeur retour est-elle plus grande que 100ms ? si oui, puisque ce n'est pas audio alors c'est vidéo
			then #on est en présence d'un fichier vidéo
				if [ -e "$fichier.webm+" ] #si le fichier.webm+ existe
				then #le fichier.webm+ existe
					if [[ $suppression_automatique == 1 ]]
					then #le fichier.webm+ existe alors on efface le fichier
						echoBlue "Effacement de $fichier"
						rm -f "$fichier"
					else
						echoGreen "SIMULATION SUPPRESSION de $fichier"
						mv "$fichier" "$fichier-"
					fi
				else	
					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\\n$fichier\\nen\\n$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
							echo "Début compression :"	
							ffmpeg \
								-i "$fichier" \
								-sn \
								-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
	#ffmpeg -i "$fichier" -c:v:0 libvpx-vp9 -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
				fi
			else	# $fichier ne sera pas traité.
				echoBlue "$fichier ne sera pas traité."
			fi
			echo
		fi
	elif [ "${fichier: -1}" == '-' ] || [ "${fichier: -14}" == '.webm-à_effacer' ]
	then
		if [[ $suppression_automatique == 1 ]]
		then #le fichier.webm+ existe alors on efface le fichier
			echoBlue "Effacement de $fichier"
			rm -f "$fichier"
		else
			echoGreen "SIMULATION SUPPRESSION de $fichier"
		fi
	fi
done
echoGreen "Fini."
read -r -p "Appuyer sur une la touche Entrée pour continuer."
exit

# je suis obligé de retirer les sous-titres télétextes de mes vidéos si je veux que le script convertit toutes les vidéos. C'est embarrassant, car j'aimais
#bien avoir les sous-titres disponibles si je dois passer la vidéo à quelqu'un qui entend mal et qui se sert des sous-titrages pour «sourds et malentendants».

#Ce point sera éventuellement à rétablir par la suite (option -sn de ffmpeg).

C'est vachement mieux un clavier bépo et un écran 24 pouces plutôt que le smartphone 5 pouces avec rdesktop (mais ça dépanne).

Bonne soirée smile

Dernière modification par Compte supprimé (Le 22/11/2021, à 17:54)