web-dev-qa-db-fra.com

Durée totale de la vidéo dans un répertoire

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.

7
PleaseHelp

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)}'
9
Sylvain Pineau

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

enter image description here

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

6
souravc