GR DIGITAL:S連写/M連写
1/7.5秒の間隔で連写された912x684の画像が縦横4x4個、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の640x480の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