静止画と音声ファイルの結合

前回 の続きです。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が起動して動画が作成されます。