Tempo total de vídeo em um diretório

6

Existe um script (bash, python etc.) que produz o tempo total de duração de todos os arquivos de vídeo em um diretório (recursivamente)?

Por exemplo, ao executar o seguinte:

script mypath

x minutes/hours .

    
por atulgangwar 23.03.2015 / 16:04

2 respostas

7

Primeiro, instale mediainfo com:

sudo apt-get install mediainfo

Agora você pode usar o seguinte oneliner para obter o tempo total de vídeo de um diretório:

find . -type f -exec mediainfo --Inform="General;%Duration%" "{}" \; 2>/dev/null | awk '{s+=/1000} END {h=s/3600; s=s%3600; printf "%.2d:%.2d\n", int(h), int(s/60)}'

O comando find irá chamar mediainfo para todos os arquivos recursivamente e obterá a duração do vídeo em ms.

Em seguida, a parte awk soma esses valores e retorna o tempo total no formato HH:MM .

Atualizar : avprobe é realmente mais rápido que mediainfo (obrigado @ souravc )

Para melhores resultados, use o comando abaixo (você precisará sudo apt-get install libav-tools primeiro)

find . -type f -exec avprobe -v quiet -show_format_entry duration "{}" \; | awk '{s+=} END {h=s/3600; s=s%3600; printf "%.2d:%.2d\n", int(h), int(s/60)}'
    
por Sylvain Pineau 23.03.2015 / 17:44
6

Você pode usar o script a seguir para saber Duração total de todos os arquivos de vídeo em um diretório recursivamente . Eu usei avprobe no seguinte script que vem com libav-tools

Instale libav-tools como,

sudo apt-get install libav-tools

Salve o script como get_video_duration.sh (digamos). Dê permissão de execução a partir de um terminal como

chmod u+x get_video_duration.sh

Como executar o script

Para saber a duração total do vídeo do diretório /full/path/to/videodir , execute com argumento como

./get_video_duration.sh /full/path/to/videodir

Ou para saber a duração total do vídeo do diretório atual, sem nenhum argumento,

./get_video_duration.sh .

Para recursão acrescente -R ou -r ou -recursive ou --recursive após o caminho do diretório. Por exemplo, para saber a duração total do vídeo do diretório /full/path/to/videodir recursivamente (também procure todas as pastas dentro de /full/path/to/videodir )

./get_video_duration.sh /full/path/to/videodir -R

O script é o seguinte:

#!/bin/bash
mysep="======================================================================================"
mysmallsep="--------------------------------------------------------------------------------------"
if [ -n "" ];then
    mypath=""
else
    mypath="$(pwd)"
fi
declare -a my_path_array
get_duration(){
    /usr/bin/avprobe "" 2>&1 | grep Duration | awk -F[:,] '{print int(*3600+*60+)}'
}
print_duration(){
    awk -v var="" '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 ""
    echo $mysmallsep
    j=0
    for i in ""/{*.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 ""/{*.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 ""/{*.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 "" 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

Captura de tela da execução do script

Observação: Como não tenho nenhum arquivo .mkv ou .avi no meu diretório home, as duas últimas linhas da captura de tela apareceram com duração 0Hr 0Min 0Sec

    
por souravc 23.03.2015 / 18:56