GR DIGITAL:S連写/M連写

1/7.5秒の間隔で連写された912×684の画像が縦横4×4個、16コマぶんつながって1つの画像ファイルになる、というのがS連写/M連射の仕様。Sはシャッターボタンを押してから1/7.5 x 16 = 約2.13秒間、Mはシャッターボタンを離してから1/7.5 x 16 = 約2.13秒間。1/7.5ということは、7.5fpsだ。

動画モードでは30fpsの640×480のMotionJPEGで撮れて音声も入るから、動画が欲しいならS/Mの連写を使うよりは動画のほうが断然良い。解像度はS/M連写のほうが1.425倍も良いが…S/Mではない普通の連写の場合はfpsはさらに悪化するが画素数が多いのでそこはメリットになると思う。

まあ、S/M連写してしまった画像を切り取って動画にすることを考えると、画像を分割して、ffmpegでエンコードすればよい。たとえばMotionJPEGの場合は以下の通り。

ffmpeg –r 7.5 –i “$tmpdir/$base%02d.jpg” –vcodec mjpeg –sameq out.avi

H.264の動画にする場合はvcodecを「libx264」あたりにすればよい。環境によっては「h264」かもしれない。

まとめると、以下のようなスクリプトに。

#! /bin/sh

split_jpg(){
  local xsplit=4
  local ysplit=4
  local infile=$1
  shift
  #local info=$(jpeginfo -l $infile)
  local info=$(jhead $infile | grep Reso)
  local xsz=$(echo $info | cut -f3 -d' ')
  local ysz=$(echo $info | cut -f5 -d' ')
  local xsz_out=$((xsz/xsplit))
  local ysz_out=$((ysz/ysplit))
  local x
  local y
  for ((y=0; y<ysplit; y++)); do
    for ((x=0; x<xsplit; x++)); do
      local x1=$((x*xsz_out))
      local y1=$((y*ysz_out))
      local out=${infile%%.jpg}-$(printf "%02d" $((y*xsplit+x))).jpg
      jpegtopnm $infile 2>/dev/null | pamcut $x1 $y1 $xsz_out $ysz_out | pnmtojpeg -optimize -quality=90 > $out
      #jpegtopnm $infile 2>/dev/null | pamcut $x1 $y1 $xsz_out $ysz_out | pnmtopng > $out
    done
  done
}

join_jpg(){
  local framerate=7.5
  local vcodec=mjpeg
  local infile=$1
  local infiles="${infile%%.jpg}-%02d.jpg"
  ffmpeg -r $framerate -i "$infiles" -vcodec mjpeg -sameq ${infile%%.jpg}.avi
}

for i; do
  split_jpg $i
  join_jpg $i
done

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です