ディレクトリ内のすべてのビデオファイルの合計継続時間を(再帰的に)出力するスクリプト(bash、pythonなど)はありますか?
たとえば、次の実行:
script mypath
x minutes/hours
を提供します。
最初に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
形式で合計時間を返します。
Update:avprobe
はmediainfo
よりも確かに高速です(ありがとう@ 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)}'
次のスクリプトを使用して、ディレクトリ内のすべてのビデオファイルの合計期間を再帰的に知ることができます。 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
スクリプト実行のスクリーンショット
注:ホームディレクトリに.mkv
または.avi
ファイルがないためスクリーンショットの最後の2行は、期間0Hr 0Min 0Secで表示されました