#!/bin/sh # # * 2005/10/22 (Yasuhiro MORIKAWA) Created # # 2005 年課題のサンプル解等 (森川 靖大の趣味が多大に入る) # # なお, このスクリプトを 2005 年度の情報実験機 3n+1, 3n+2 # (CPU: Intel Pentium 4 CPU 2.80GHz, Memory: 256MB) で用いると, # 2004/06/01 〜 2005/09/30 のデータ (時間ステップは 1 時間. # 欠損値を除き, ほぼ 10,000枚の jpeg 画像, サイズは 576 x 576px) # を mpeg に変換するのに 10 分ほどかかる. # # 出来あがる mpeg 画像のサイズは 216MB になる. # # # ########## ■ 固定値(できるだけ変更しない) ■ ########## # 参照する画像データのファイル名の月, 日, 時間の桁数 dirlen=2 jpglen=8 # データ形式 (拡張子) prefix="tmp" suffix=".jpg" mpgsuffix=".mpg" # 時刻の最初と最後 hour="0 23" ########## ■ デフォルトでのセッティング ■ ########## default_gms_dir="/work/inex_2005_kadai" default_year="2004 2005" #default_firstmonth=1 #default_firstday=1 #default_finalmonth=12 #default_finalday=31 #default_timestep=3 default_firstmonth=10 default_firstday=20 default_finalmonth=3 default_finalday=10 default_timestep=6 default_tmp_dir="./GMS_jpg" default_output_head="inex2005_cloud" ########## ■ ユーザインターフェース1 ■ ########## echo 画像が置かれているディレクトリを絶対パスで指定して下さい. echo -n ' ['${default_gms_dir}']: ' read gms_dir # ディレクトリの存在をチェック gms_dir=${gms_dir:-$default_gms_dir} if [ ! -d $gms_dir ] ; then echo ディレクトリ $gms_dir は存在しません. exit 1 fi echo 年を指定して下さい. \[2004, 2005\] echo -n ' '[${default_year}]': ' read year # 月のチェック year=${year:-$default_year} if [ "$year" != "2004" ] && [ "$year" != "2005" ] && \ [ "$year" != "2004 2005" ] ; then echo 2004, 2005 年以外は選択できません. exit 1 fi echo 開始月を指定して下さい. \(1 〜 12\) echo -n ' '[${default_firstmonth}]': ' read firstmonth # 月のチェック firstmonth=${firstmonth:-$default_firstmonth} if [ $firstmonth -lt 1 ] || [ $firstmonth -gt 12 ] ; then echo 月は 1 〜 12 の間で指定して下さい. exit 1 fi echo スタートする日付を指定して下さい. \(1 〜 29\) echo -n ' ['${default_firstday}']: ' read firstday # 日付をチェック firstday=${firstday:-$default_firstday} if [ $firstday -lt 1 ] || [ $firstday -gt 31 ] ; then echo 日付は 1 〜 31 の間で指定して下さい. exit 1 fi echo 終了月を指定して下さい. \(1 〜 12\) echo -n ' '[${default_finalmonth}]': ' read finalmonth # 月のチェック finalmonth=${finalmonth:-$default_finalmonth} if [ $finalmonth -lt 1 ] || [ $finalmonth -gt 12 ] ; then echo 月は 1 〜 12 の間で指定して下さい. exit 1 elif [ $finalmonth -lt $firstmonth ] && [ "$year" != "2004 2005" ]; then echo 終了月は開始月より後に設定して下さい. exit 1 fi echo 終了する日付を指定して下さい. \(1 〜 31\) echo -n ' ['${default_finalday}']: ' read finalday # 日付をチェック finalday=${finalday:-$default_finalday} if [ $finalday -lt 1 ] || [ $finalday -gt 31 ] ; then echo 日付は 1 〜 31 の間で指定して下さい. exit 1 elif [ $finalmonth -eq $firstmonth ] && [ $finalday -lt $firstday ] ; then echo 終了日は開始日より後に設定して下さい. exit 1 fi echo タイムステップを以下から指定して下さい. \(1, 2, 3, 6, 12, 24\) echo -n ' ['${default_timestep}']: ' read timestep # タイムステップをチェック timestep=${timestep:-$default_timestep} if [ $timestep -ne 1 ] && [ $timestep -ne 2 ] && \ [ $timestep -ne 3 ] && [ $timestep -ne 6 ] && \ [ $timestep -ne 12 ] && [ $timestep -ne 24 ] ; then echo タイムステップは 1, 2, 3, 6, 12, 24 の内から指定して下さい. exit 1 fi echo アニメーションに利用する画像を一時保存するディレクトリを指定して下さい. echo -n ' ['${default_tmp_dir}']: ' read tmp_dir tmp_dir=${tmp_dir:-$default_tmp_dir} ######## ■ 設定値の修正 ■ ######## # ディレクトリの最後尾のスラッシュは取り除く gms_dir=${gms_dir%/} tmp_dir=${tmp_dir%/} # 月は2桁で表示 firstmonth=0${firstmonth} firstmonth=${firstmonth:${#firstmonth}-$dirlen:$dirlen} finalmonth=0${finalmonth} finalmonth=${finalmonth:${#finalmonth}-$dirlen:$dirlen} # 日は2桁で表示 firstday=0${firstday} firstday=${firstday:${#firstday}-$dirlen:$dirlen} finalday=0${finalday} finalday=${finalday:${#finalday}-$dirlen:$dirlen} # 直接ファイルを指定するディレクトリパスの設定 gms_dir_path=${gms_dir} ########## ■ ユーザインターフェース2(出力ファイル指定) ■ ########## output_first=0${firstday} output_first=${output_first:${#output_first}-$dirlen:$dirlen} output_final=0${finalday} output_final=${output_final:${#output_final}-$dirlen:$dirlen} output_firstmonth=0${firstmonth} output_firstmonth=${output_firstmonth:${#output_firstmonth}-$dirlen:$dirlen} output_finalmonth=0${finalmonth} output_finalmonth=${output_finalmonth:${#output_finalmonth}-$dirlen:$dirlen} default_output=./${default_output_head}_${output_firstmonth}-${output_first}--${output_finalmonth}-${output_final}${mpgsuffix} echo mpeg 画像のファイル名を指定して下さい. echo -n ' ['$default_output']: ' read output output=${output:-$default_output} echo $output ######## ■ 一時保存用ディレクトリの作成 ■ ######## if [ ! -d $tmp_dir ]; then mkdir $tmp_dir elif [ -d $tmp_dir ] ; then rm -rf $tmp_dir mkdir $tmp_dir fi ######## ■ 必要となるファイルのシンボリックリンク ■ ######## counter=00000000 for Y in $year ;do YY=0$Y YY=${YY:${#YY}-$dirlen:$dirlen} if [ "$year" = "2004 2005" ] && [ "$YY" = "04" ] ; then month="$firstmonth 12" elif [ "$year" = "2004 2005" ] && [ "$YY" = "05" ] ; then month="1 $finalmonth" else month="$firstmonth $finalmonth" fi for MM in $(seq $month) ;do MM=0$MM MM=${MM:${#MM}-$dirlen:$dirlen} if [ "$MM" = "$finalmonth" ] && [ "$MM" = "$firstmonth" ] ; then day="$firstday $finalday" elif [ "$MM" = "$finalmonth" ]; then day="1 $finalday" elif [ "$MM" = "$firstmonth" ] ; then day="$firstday 31" else day="1 31" fi for DD in $(seq $day) ; do DD=0$DD DD=${DD:${#DD}-$dirlen:$dirlen} for hh in $(seq $hour) ; do test `expr $hh % $timestep` = 0 || continue hh=0$hh hh=${hh:${#hh}-$dirlen:$dirlen} file=$gms_dir/$Y/$MM/$DD/ql$YY$MM$DD$hh$suffix if [ -f $file ] ; then link=$prefix${counter:${#counter}-$jpglen:$jpglen}$suffix echo ln -s $file $tmp_dir/$link ln -s $file $tmp_dir/$link counter=00000000`expr $counter + 1` else echo $file is not found. fi done done done done ######## ■ jpeg2yuv, mpeg2enc でアニメ化 ■ ######## echo コピーが終了しました. jpeg から mpeg への変換を開始します..... jpeg2yuv -f 1 -I p -j $tmp_dir/$prefix%0"$jpglen"d$suffix \ | mpeg2enc -a 1 -f 3 -b 5000 -F 5 -q 1 -o $output ######## ■ mplayer を起動(選択式) ■ ######## echo mpeg の作成が終了しました. 完成したファイルを mplayer で見ますか? echo -n ' [Y/n]:' read player_on if [ -z "$player_on" ] || [ $player_on = 'Y' ] || [ $player_on = 'y' ] ; then mplayer -speed 0.5 $output else echo "" echo " " $output is generated echo "" fi exit 0