Existe-t-il un script (bash, python etc.) qui affiche la durée totale de tous les fichiers vidéo d'un répertoire (récursivement)?
Par exemple, pour exécuter les tâches suivantes:
script mypath
cela donne x minutes/hours
.
Installez d'abord mediainfo
avec:
Sudo apt-get install mediainfo
Vous pouvez maintenant utiliser l'un des éléments suivants pour obtenir le temps total de la vidéo d'un répertoire:
find . -type f -exec mediainfo --Inform="General;%Duration%" "{}" \; 2>/dev/null | awk '{s+=$1/1000} END {h=s/3600; s=s%3600; printf "%.2d:%.2d\n", int(h), int(s/60)}'
La commande find
appelle mediainfo
pour chaque fichier de manière récursive et obtient la durée de la vidéo en ms.
Ensuite, la partie awk
additionnera ces valeurs et renverra la durée totale au format HH:MM
.
Mise à jour : avprobe
est en effet plus rapide que mediainfo
(merci @ souravc )
Pour de meilleurs résultats, utilisez la commande ci-dessous à la place (vous devez d'abord utiliser Sudo apt-get install libav-tools
)
find . -type f -exec avprobe -v quiet -show_format_entry duration "{}" \; | awk '{s+=$1} END {h=s/3600; s=s%3600; printf "%.2d:%.2d\n", int(h), int(s/60)}'
Vous pouvez utiliser le script suivant pour connaître la durée totale de tous les fichiers vidéo d'un répertoire de manière récursive . J'ai utilisé avprobe
dans le script suivant fourni avec libav-tools
Installez libav-tools
comme,
Sudo apt-get install libav-tools
Enregistrez le script sous le nom get_video_duration.sh
(par exemple). Donnez-lui l'autorisation d'exécution à partir d'un terminal en tant que
chmod u+x get_video_duration.sh
Comment exécuter le script
Pour connaître la durée totale de la vidéo du répertoire /full/path/to/videodir
, exécutez avec l’argument en tant que
./get_video_duration.sh /full/path/to/videodir
Ou connaître la durée totale de la vidéo du répertoire en cours s’exécutant sans aucun argument,
./get_video_duration.sh .
Pour la récursivité ajoutez -R
ou -r
ou -recursive
ou --recursive
après le chemin du répertoire. Par exemple, pour connaître la durée totale de la vidéo du répertoire /full/path/to/videodir
de manière récursive (recherchez également tous les dossiers de /full/path/to/videodir
).
./get_video_duration.sh /full/path/to/videodir -R
Le script est le suivant:
#!/bin/bash
mysep="======================================================================================"
mysmallsep="--------------------------------------------------------------------------------------"
if [ -n "$1" ];then
mypath="$1"
else
mypath="$(pwd)"
fi
declare -a my_path_array
get_duration(){
/usr/bin/avprobe "$1" 2>&1 | grep Duration | awk -F[:,] '{print int($2*3600+$3*60+$4)}'
}
print_duration(){
awk -v var="$1" 'BEGIN {print int(var/3600)"Hr "int((var%3600)/60)"Min "int(var%60)"Sec "}'
}
execute_it_now(){
echo -e "Video File\t\tVideo Duration"
echo $mysep
echo "$1"
echo $mysmallsep
j=0
for i in "$1"/{*.mp4,*.mkv,*.avi,*.flv} ## Put the existing video file extension you have
do
if [[ "$(get_duration "$i")" -ne "0" ]];then
echo -e "$(basename "$i")\t$(tput setaf 2)$(print_duration $(get_duration "$i"))$(tput sgr0)"
fi
let j=j+$(get_duration "$i") 2>/dev/null
done
echo $mysep
echo "Total Duration $(tput setaf 1)$(print_duration $j)$(tput sgr0)"
}
execute_these_now(){
for i in "$1"/{*.mp4,*.mkv,*.avi,*.flv} ## Put the existing video file extension you have
do
if [[ "$(get_duration "$i")" -ne "0" ]];then
echo -e "$(basename "$i")\t$(tput setaf 2)$(print_duration $(get_duration "$i"))$(tput sgr0)"
fi
done
}
add_these_now(){
j=0;
for i in "$1"/{*.mp4,*.mkv,*.avi,*.flv} ## Put the existing video file extension you have
do
let j=j+$(get_duration "$i") 2>/dev/null
done
echo $j
}
case "$2" in
-R|-r|-recursive|--recursive)
tmp=$(find $mypath -type d | xargs)
my_path_array=( $tmp )
echo -e "Video File\t\tVideo Duration"
echo $mysep
k=0;
for indx in $(seq ${#my_path_array[@]})
do
echo ${my_path_array[$(($indx-1))]}
echo $mysmallsep
execute_these_now ${my_path_array[$(($indx-1))]}
let k=k+$(add_these_now ${my_path_array[$(($indx-1))]})
done
echo $mysep
echo "Total Duration $(tput setaf 1)$(print_duration $k)$(tput sgr0)"
;;
*)
execute_it_now $mypath
;;
esac
Capture d'écran de l'exécution du script
Remarque: Comme je n'ai aucun fichier .mkv
ou .avi
dans mon répertoire personnel Les deux dernières lignes de la capture d'écran sont apparues avec la durée 0Hr 0Min 0Sec