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日時点のものです。各ツールの機能や仕様は変更される可能性があります。最新情報は各公式サイトをご確認ください。
関連記事
BlueBubbles Skill - ClawdbotでiMessageを統合
Clawdbot向けBlueBubbles Skillを利用して、Apple iMessageおよびSMS経由でのメッセージ送受信を実現する方法を解説します。
ClawdHub Skill - Clawdbotスキル管理を効率化
ClawdHub CLIを利用して、Clawdbotスキルの検索、インストール、更新、公開を効率化する方法を解説します。
Gemini Skill - ClawdbotでGoogle Gemini APIを活用
Clawdbot向けGemini Skillを利用して、Google Gemini APIをワンショットQ&A、要約、生成タスクに活用する方法を解説します。
人気記事
ChatGPT(OpenAI)とClaude(Anthropic)の機能比較 2026年版。コーディング・長文解析・コスト・API料金の違いを検証
ChatGPT(GPT-4o/o3)とClaude(Sonnet 4.6/Opus 4.5)を2026年時点の最新情報で比較する。コーディング能力、長文処理、日本語品質、API料金、無料プランの違いをSWE-benchなどのベンチマーク結果とともに解説する。
【2026年2月20日 所感】「AIがコードを書く」は仮説から現実になった——しかし私たちはその意味をまだ消化できていない
2026年2月20日に観測したコーディングエージェント関連ニュースの総括と所感。Anthropicの自律性研究、cmux、MJ Rathbunのエージェント事故、HN「外骨格 vs チーム」論争、Stripe Minions週1000件PR、Taalas 17k tokens/sec——朝から夜までの流れを通じて見えてきた「AIがコードを書く時代」の実相を考察する。
868のスキルをnpx 1コマンドで——「Antigravity Awesome Skills」が主要AIコーディングエージェントの共通スキル基盤になりつつある
Claude Code・Gemini CLI・Codex CLI・Cursor・GitHub Copilotなど主要AIコーディングアシスタントを横断する868以上のスキルライブラリ「Antigravity Awesome Skills」(v5.4.0)を詳細分析。Anthropic・Vercel・OpenAI・Supabase・Microsoftの公式スキルを統合した設計思想、ロール別バンドル・ワークフロー機能、SKILL.mdによる相互運用性のアーキテクチャを解説する。
最新記事
AIエージェント間通信の標準化競争が始まる——AquaとAgent Semantic Protocolが同日登場
2026年2月23日、Hacker Newsに2つのAIエージェント通信プロジェクトが同日掲載された。Go製CLI「Aqua」とセマンティックルーティングを実装する「Agent Semantic Protocol」は、MCPが解決できないP2P・非同期通信の課題に取り組む。
Claude Sonnet 4.6、無料・Proプランのデフォルトモデルに——社内テストでOpus 4.5を59%の確率で上回る
Anthropicは2026年2月17日にリリースしたClaude Sonnet 4.6を、claude.aiの無料・Proプランのデフォルトモデルに設定した。価格はSonnet 4.5と同額の$3/$15 per 1Mトークン。社内評価ではコーディングエージェント用途でOpus 4.5を上回る結果が出ている。
GoogleがOpenClaw経由のGemini利用ユーザーのアカウントを永久停止——月額$250請求継続のまま
2026年2月23日、Hacker Newsで140pt/107コメントを集めたレポートによると、GoogleはOpenClaw(サードパーティクライアント)経由でGeminiを使用していたGoogle AI Pro/Ultraユーザーを予告なしに永久停止した。技術的・経済的背景を整理する。