web-dev-qa-db-ja.com

ディレクトリ内の合計ビデオ時間

ディレクトリ内のすべてのビデオファイルの合計継続時間を(再帰的に)出力するスクリプト(bash、pythonなど)はありますか?

たとえば、次の実行:

script mypath

x minutes/hoursを提供します。

7
PleaseHelp

最初にmediainfoをインストールします:

Sudo apt-get install mediainfo

次のonelinerを使用して、ディレクトリの合計ビデオ時間を取得できるようになりました。

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)}'

findコマンドは、すべてのファイルに対してmediainfoを再帰的に呼び出し、ビデオの長さをミリ秒単位で取得します。

次に、awk部分はそれらの値を合計し、HH:MM形式で合計時間を返します。


Updateavprobemediainfoよりも確かに高速です(ありがとう@ souravc

より良い結果を得るには、代わりに以下のコマンドを使用してください(最初に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

次のスクリプトを使用して、ディレクトリ内のすべてのビデオファイルの合計期間を再帰的に知ることができますlibav-toolsに付属する次のスクリプトで avprobe を使用しました

libav-toolsとしてインストール、

Sudo apt-get install libav-tools

スクリプトget_video_duration.sh(say)として保存します。端末から実行許可を与える

chmod u+x get_video_duration.sh

スクリプトの実行方法

ディレクトリ/full/path/to/videodirの合計ビデオ時間を知るには、引数を付けて実行します

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

または、引数なしで実行されている現在のディレクトリの合計ビデオ時間を知るには

./get_video_duration.sh .

Recursionの場合、ディレクトリパスの後に-Rまたは-rまたは-recursiveまたは--recursiveを追加します。たとえば、/full/path/to/videodirディレクトリの合計ビデオ時間を再帰的に知る(/full/path/to/videodir内のすべてのフォルダーも検索する)

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

スクリプトは次のとおりです:

#!/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

スクリプト実行のスクリーンショット

enter image description here

注:ホームディレクトリに.mkvまたは.aviファイルがないためスクリーンショットの最後の2行は、期間0Hr 0Min 0Secで表示されました

6
souravc