前回 の続きです。ffmeg を用いた一連のシェルスクリプトにしてみました。
#!/bin/bash sdoc=\ "make_mp4 \n"\ " mp3音声ファイルと1枚の静止画像より\n"\ " mp4動画ファイルを作成します\n\n"\ " [option] \n"\ " audio=音声ファイル\n"\ " image=画像ファイル(720x480ピクセル)\n"\ " output=動画ファイル(.mp4)\n"\ "\n\n\n" export sdoc audio=`getparstr $# "$*" "audio"` image=`getparstr $# "$*" "image"` output=`getparstr $# "$*" "output"` # 必要な引数の確認 for var in audio image output do if [ -z ${!var} ] then usage printf "関数 %s の変数 ${var} に値がありません\n" `basename $0` exit fi done # 必要なファイルの存在確認 for var in audio image do if [ ! -e ${!var} ] then printf "ファイル %s が存在しません\n" ${!var} exit fi done # 画像サイズの確認 size=`identify ${image} | awk -F" " '{print $3}'` if [ ${size} != "720x480" ] then printf "画像のサイズが%sです\n" ${size} while : do printf "続行する場合は y を押して下さい。\n" nonewline "中止する場合は n を押して下さい。 " read RESP char=`echo $RESP | cut -c1` case $char in y|Y) break;; n|N) exit;; ?) echo "もう一度お願いします" ;; esac done fi # 音声ファイルの時間の確認 duration=`ffprobe ${audio} 2>&1 |\ grep "Duration:" |\ awk '{print $2}' |\ sed -e "s/,//g"` min=`echo ${duration} | awk -F":" '{print $1*60+$2+$3/60}' ` if [ `echo "${min} > 15" | bc` -eq 1 ] then printf "音声のサイズが%sです\n" ${duration} while : do printf "続行する場合は y を押して下さい。\n" nonewline "中止する場合は n を押して下さい。 " read RESP char=`echo $RESP | cut -c1` case $char in y|Y) break;; n|N) exit;; ?) echo "もう一度お願いします" ;; esac done fi ffmpeg \ -loop 1 \ -i ${image} -i ${audio} \ -vcodec libx264 \ -pix_fmt yuv420p \ -shortest \ ${output}
画像のようにして使用します。静止画が720x480ピクセルでなかったり、音声サイズが15分を超えるとワーニングが表示されますが、構わず続行するとffmpegが起動して動画が作成されます。