動画から静止画を抽出する(2)

動画で撮ったものも静止画で管理したいけど最初のフレームのサムネイルだとイマイチ。前から3割くらいの場所にしたいよー。という話の続き。

使ってるツール:

  • 動画から静止画を抽出: ffmpeg
  • 動画の時間を調べて任意の倍率を計算: timecalc
  • Exif情報の書き込み: jhead

で、これらを使ったシェルスクリプトを書きました。

  • 動画ファイルの任意の時間から静止画を抽出: vid2jpg
$ for i in /nobu/201?_??_??/*.{mp4,AVI} ; do vid2jpg -p 0.3 $i ; done

という感じで使います。処理の流れは:

  1. コマンドラインを解釈。-pオプションが指定されてればその倍率の時間を使う。ビデオファイル名は常に最後。
  2. ビデオの長さの0.1倍、または-pで指定された倍率の時間をtimecalcにより計算。
  3. 計算で出たポジションの静止画をffmpegにより抽出。
  4. 静止画のタイムスタンプをビデオファイルのタイムスタンプに合わせる。
  5. 静止画のExifの時間をjheadによりタイムスタンプ時間に合わせる。

という感じです。エラー処理は:

  • ファイルが存在するか
  • -pで指定された割合が0-1の範囲か
  • ファイルがビデオファイルかどうか(ビデオファイルじゃなければtimecalcからエラーを貰ってexit)
  • 変換後のJPGが既に存在しないか(存在してれば何もせず終了)

といったところ。
自分的にはこれで十分。やっぱUnix的に単一の機能をきっちり果たすツールを組み合わせるのが楽ですな。その文脈で言えば、timecalcはビデオファイルの情報を取るだけのツールと時間の計算をするだけのツールに分割すべきかも。