Skip to content

Instantly share code, notes, and snippets.

@hirokai
Last active August 11, 2019 12:15
Show Gist options
  • Save hirokai/807d05ddd9f749100e1b96f9d0422e66 to your computer and use it in GitHub Desktop.
Save hirokai/807d05ddd9f749100e1b96f9d0422e66 to your computer and use it in GitHub Desktop.
FFmpegで動画から一定時間間隔のスナップショットを取得する

FFmpegで動画から一定時間間隔のスナップショットを取得する

FFmpegは動画の変換や静止画との変換などが行えるコマンドラインツール。様々なフォーマットに対応しているので便利。

インストール

  • ここからバイナリをダウンロードして適当なフォルダに置き、パスを通す。
  • あるいはMacPortsやHomeBrewを使っているならば、sudo port install ffmpegbrew install ffmpegでも良い。

私自身は、バイナリをダウンロードして使用している。

使用方法

以下のコマンドで、input.mpgから1秒ごとにスナップショットをPNGとして保存する。mpg, png以外にも様々なフォーマットが使用可能。

ffmpeg -i input.mpg -r 1 output%04d.png

ここに説明があるように、出力ファイル名のoutput%04d.pngのところがoutput0000.png, output0001.png,... というように展開される。

発展形:フォルダ内の動画ファイルから一括でスナップショット取得

以下は余談だが、Pythonでバッチ処理したいときにはこのような感じにする。

  • src_dir内の各.aviファイルに対し、
  • カレントフォルダのslices以下に、拡張子を除いたファイル名と同じ名前のフォルダを作って
  • その中に連番で保存
from subprocess import call
import os
import glob


# Make a folder if it does not exist.
def ensure_exists(folder):
    if not os.path.exists(folder):
        os.makedirs(folder)


def basename_noext(path):
    return os.path.splitext(os.path.basename(path))[0]

src_dir = '/path/to/folder'

files = list(glob.glob(os.path.join(src_dir,'*.avi')))

for in_path in files:
    out_folder = os.path.join('slices',basename_noext(in_path))
    ensure_exists(out_folder)
    out_path = os.path.join(out_folder,'%04d.png')

    call(['ffmpeg','-i', in_path, '-r', '1', out_path])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment