Video Frames Skill - ffmpegによる動画フレーム抽出機能
Clawdbot向けVideo Frames Skillを利用して、動画ファイルから静止画フレームを抽出し、サムネイル生成や映像分析を実現する方法を解説します。
Video Frames Skill - ffmpegによる動画フレーム抽出機能
動画コンテンツから特定のフレームを静止画として抽出する作業は、サムネイル生成、シーン分析、品質検証など、さまざまな用途で必要とされる。手動でのスクリーンショット取得は非効率であり、大量の動画を処理する場合には自動化が不可欠である。
Clawdbot向けVideo Frames Skillは、ffmpeg(オープンソースの動画処理ツール)を活用し、コマンドラインから動画の任意のフレームを抽出する機能を提供する。本記事では、その技術仕様、実装方法、実用例について解説する。
選定基準
本記事の執筆にあたり、以下の基準でSkillを評価した。
- ffmpeg公式ドキュメント(https://ffmpeg.org)に基づく仕様確認
- 画像形式(JPEG、PNG)の選択基準の検証
- 実際の動画処理ワークフローにおける実用性
技術的仕様
システム要件
Video Frames Skillは以下の環境で動作する。
- 必須コマンド:
ffmpeg - 対応プラットフォーム: Linux、macOS、Windows(WSL含む)
インストール方法
ffmpegは、各プラットフォームのパッケージマネージャーを使用してインストールする。
macOS(Homebrew):
brew install ffmpeg
Ubuntu/Debian:
sudo apt update
sudo apt install ffmpeg
Windows(Chocolatey):
choco install ffmpeg
対応動画形式
ffmpegは、以下を含む多数の動画形式に対応している。
- MP4、MOV、AVI、MKV
- WebM、FLV、WMV
- MPEG、3GP、VOB
主要機能
最初のフレームの抽出
動画の冒頭フレームをサムネイルとして保存する。
{baseDir}/scripts/frame.sh /path/to/video.mp4 --out /tmp/frame.jpg
デフォルトでは、JPEG形式で保存される。
特定のタイムスタンプからの抽出
動画の任意の時点(例: 10秒時点)のフレームを抽出する。
{baseDir}/scripts/frame.sh /path/to/video.mp4 --time 00:00:10 --out /tmp/frame-10s.jpg
タイムスタンプは HH:MM:SS 形式で指定する。
高品質画像の抽出(PNG)
UI解析や高精度の画像処理が必要な場合、PNG形式での保存が推奨される。
{baseDir}/scripts/frame.sh /path/to/video.mp4 --time 00:01:30 --out /tmp/frame-90s.png
JPEG vs PNG の選択基準:
- JPEG: ファイルサイズが小さく、共有やプレビューに適する
- PNG: 可逆圧縮で画質が高く、テキストやUIの解析に適する
実装例
例1: 動画全体から等間隔でフレームを抽出
#!/bin/bash
# 10秒ごとにフレームを抽出
VIDEO_FILE="/path/to/video.mp4"
OUTPUT_DIR="/tmp/frames"
INTERVAL=10 # 秒
mkdir -p "$OUTPUT_DIR"
# 動画の長さを取得
DURATION=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$VIDEO_FILE")
DURATION_INT=${DURATION%.*}
for ((t=0; t<DURATION_INT; t+=INTERVAL)); do
timestamp=$(printf "%02d:%02d:%02d" $((t/3600)) $((t%3600/60)) $((t%60)))
output_file="$OUTPUT_DIR/frame-${t}s.jpg"
{baseDir}/scripts/frame.sh "$VIDEO_FILE" --time "$timestamp" --out "$output_file"
echo "Extracted frame at $timestamp -> $output_file"
done
例2: サムネイル画像の自動生成(バッチ処理)
#!/bin/bash
# ディレクトリ内の全動画からサムネイルを生成
VIDEO_DIR="/videos"
THUMBNAIL_DIR="/thumbnails"
mkdir -p "$THUMBNAIL_DIR"
for video in "$VIDEO_DIR"/*.{mp4,mov,avi}; do
if [ -f "$video" ]; then
filename=$(basename "$video")
name="${filename%.*}"
{baseDir}/scripts/frame.sh "$video" --time 00:00:05 --out "$THUMBNAIL_DIR/${name}.jpg"
echo "Thumbnail created: ${name}.jpg"
fi
done
例3: 動画の品質チェック用のサンプルフレーム抽出
#!/bin/bash
# 先頭、中間、末尾のフレームを抽出して品質確認
VIDEO_FILE="/path/to/video.mp4"
OUTPUT_DIR="/tmp/quality-check"
mkdir -p "$OUTPUT_DIR"
# 動画の長さを取得
DURATION=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$VIDEO_FILE")
DURATION_INT=${DURATION%.*}
MID_TIME=$((DURATION_INT / 2))
# 先頭フレーム
{baseDir}/scripts/frame.sh "$VIDEO_FILE" --time 00:00:00 --out "$OUTPUT_DIR/start.png"
# 中間フレーム
mid_timestamp=$(printf "%02d:%02d:%02d" $((MID_TIME/3600)) $((MID_TIME%3600/60)) $((MID_TIME%60)))
{baseDir}/scripts/frame.sh "$VIDEO_FILE" --time "$mid_timestamp" --out "$OUTPUT_DIR/middle.png"
# 末尾フレーム(最後から5秒前)
end_time=$((DURATION_INT - 5))
end_timestamp=$(printf "%02d:%02d:%02d" $((end_time/3600)) $((end_time%3600/60)) $((end_time%60)))
{baseDir}/scripts/frame.sh "$VIDEO_FILE" --time "$end_timestamp" --out "$OUTPUT_DIR/end.png"
echo "Quality check frames saved to $OUTPUT_DIR"
例4: 動画シーンの変化検出用フレーム抽出
#!/bin/bash
# 1秒ごとにフレームを抽出し、画像認識AIで分析
VIDEO_FILE="/path/to/video.mp4"
OUTPUT_DIR="/tmp/scene-analysis"
mkdir -p "$OUTPUT_DIR"
DURATION=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$VIDEO_FILE")
DURATION_INT=${DURATION%.*}
for ((t=0; t<DURATION_INT; t+=1)); do
timestamp=$(printf "%02d:%02d:%02d" $((t/3600)) $((t%3600/60)) $((t%60)))
output_file="$OUTPUT_DIR/frame-${t}.jpg"
{baseDir}/scripts/frame.sh "$VIDEO_FILE" --time "$timestamp" --out "$output_file"
done
echo "Scene analysis frames saved to $OUTPUT_DIR"
# 後続処理: 画像認識AIでシーン分類
例5: 動画プレビュー用のコンタクトシート生成
#!/bin/bash
# 6x6グリッドでサムネイルを並べたコンタクトシートを作成
VIDEO_FILE="/path/to/video.mp4"
OUTPUT_DIR="/tmp/contact-sheet"
GRID_SIZE=36 # 6x6
mkdir -p "$OUTPUT_DIR"
DURATION=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$VIDEO_FILE")
DURATION_INT=${DURATION%.*}
INTERVAL=$((DURATION_INT / GRID_SIZE))
for ((i=0; i<GRID_SIZE; i++)); do
t=$((i * INTERVAL))
timestamp=$(printf "%02d:%02d:%02d" $((t/3600)) $((t%3600/60)) $((t%60)))
output_file="$OUTPUT_DIR/frame-${i}.jpg"
{baseDir}/scripts/frame.sh "$VIDEO_FILE" --time "$timestamp" --out "$output_file"
done
# ImageMagick等で6x6グリッド画像に結合
montage "$OUTPUT_DIR"/frame-*.jpg -tile 6x6 -geometry 200x150+2+2 /tmp/contact-sheet.jpg
echo "Contact sheet created: /tmp/contact-sheet.jpg"
ユースケース
動画サムネイルの自動生成
動画共有プラットフォームやコンテンツ管理システムにおいて、アップロードされた動画から自動的にサムネイル画像を生成する用途。
映像品質の検証
エンコード処理後の動画について、複数のフレームを抽出して画質や色味を確認する用途。ブロックノイズや色ズレ等の問題を早期に発見できる。
シーン分析・コンテンツ分類
機械学習モデルによる画像認識と組み合わせて、動画内のシーン(風景、人物、テキスト等)を自動分類する用途。
教育・トレーニング資料の作成
講義動画やチュートリアル動画から重要なシーンを抽出し、スライド資料や配布資料に活用する用途。
監視カメラ映像の分析
セキュリティカメラの録画映像から定期的にフレームを抽出し、異常検知や人物追跡に活用する用途。
制限事項・セキュリティ考慮事項
処理時間
動画ファイルのサイズやコーデックによって、フレーム抽出にかかる時間は変動する。4K動画や高ビットレート動画では、数秒程度の処理時間が必要となる場合がある。
ディスクスペース
大量のフレームを抽出する場合、出力画像の総容量がディスク容量を圧迫する可能性がある。PNG形式は特にファイルサイズが大きくなるため、ストレージの空き容量に注意する必要がある。
コーデックの対応状況
ffmpegは多数のコーデックに対応しているが、一部の独自形式(ProRes RAW、H.266/VVC等)は追加のライブラリやビルドオプションが必要となる場合がある。
著作権とプライバシー
動画ファイルが第三者の著作物や個人情報を含む場合、フレーム抽出および保存には適切な権利処理が必要。特に顔認識や監視カメラ映像の処理には、プライバシー保護法令(GDPR、個人情報保護法等)の遵守が求められる。
精度の限界
フレーム抽出は指定されたタイムスタンプに最も近いキーフレームを取得する仕組みであるため、厳密なタイムスタンプとは若干のズレが生じる可能性がある。
参考リンク
- ffmpeg公式サイト: https://ffmpeg.org
- ffmpeg公式ドキュメント: https://ffmpeg.org/documentation.html
- Homebrew: https://brew.sh
- ImageMagick(画像結合ツール): https://imagemagick.org
本記事の情報は2026年2月15日時点のものです。各ツールの機能や仕様は変更される可能性があります。最新情報は各公式サイトをご確認ください。
Related Articles
OpenClaw Skills Ranking February 2026: Planning Skills and Security Suite Dominate Top 10
GitHub OpenClaw skills ranking shows awesome-openclaw-skills (16,139 stars), Manus-style planning implementation planning-with-files (14,000 stars), and Obsidian integration (9,998 stars) claiming top 3 positions.
OpenClaw v2026.2.17: Claude Sonnet 4.6 Support, 1M Context, Slack/Telegram Enhancements
OpenClaw releases major update with Claude Sonnet 4.6 and 1M context window support, Slack native streaming, Telegram inline button styles, iOS Share Extension, and critical security fixes (OC-09) among 100+ changes.
Popular Articles
Claude Code v2.1.93 Released - Deferred Permission Decisions, Flicker-Free Rendering, and More
Anthropic releases Claude Code v2.1.93 with deferred permission decisions for PreToolUse hooks, flicker-free rendering option, PermissionDenied hook, and named subagent typeahead support.
Claude Code v2.1.92 Released - forceRemoteSettingsRefresh, Bedrock Setup Wizard, and More
Anthropic releases Claude Code v2.1.92 with forceRemoteSettingsRefresh policy setting, AWS Bedrock setup wizard, /cost command improvements, and numerous bug fixes.
Claude Code v2.1.84 Release - PowerShell Tool Preview and Environment Configuration Enhancements
Claude Code v2.1.84 introduces PowerShell tool for Windows, new environment variable overrides for model selection, idle session handling improvements, and various stability fixes.
Latest Articles
Claude Code v2.1.93 Released - Deferred Permission Decisions, Flicker-Free Rendering, and More
Anthropic releases Claude Code v2.1.93 with deferred permission decisions for PreToolUse hooks, flicker-free rendering option, PermissionDenied hook, and named subagent typeahead support.
Claude Code v2.1.92 Released - forceRemoteSettingsRefresh, Bedrock Setup Wizard, and More
Anthropic releases Claude Code v2.1.92 with forceRemoteSettingsRefresh policy setting, AWS Bedrock setup wizard, /cost command improvements, and numerous bug fixes.
Claude Code v2.1.91 Released - MCP Tool Result Persistence and Improved Edit Tool
Claude Code v2.1.91 introduces MCP tool result persistence override, improved shell execution controls, and enhanced Edit tool efficiency.