YouTube動画フレーム抽出ツール

# YouTube動画フレーム抽出ツール レポート

## 導入
動画コンテンツの急増に伴い、効率的な視覚的要約ツールの需要が高まっています。本ツールは、YouTube動画から一定間隔でフレームを抽出し、それらを単一の画像にまとめることで、動画の内容を一目で把握できるようにします。

### 主な活用シーン
- **コンテンツ分析**: クリエイターやマーケターが動画の構成や視覚的一貫性を分析
- **教育用資料**: 授業や講演の重要な瞬間を捉えた視覚的サマリーの作成
- **映像研究**: 映画やアニメーションの色彩パレット、シーン遷移、構図の変化の研究
- **タイムラプス観察**: 自然現象や建設プロジェクトなどの経時変化の視覚化
- **ストーリーボード作成**: 既存動画からストーリーボードのベースとなる画像の抽出
- **プレゼンテーション**: 動画コンテンツを静止画として効果的に資料に組み込む

本ツールはGoogle Colaboratory上で動作し、プログラミングの詳細な知識がなくても、数クリックで簡単に使用できることが特徴です。

## 概要
このレポートでは、YouTube動画から特定の間隔でフレームを抽出し、それらを横に並べて単一の画像として出力するPythonツールについて説明します。このツールはGoogle Colaboratory環境での使用を想定しており、簡単な設定で動画の視覚的な要約を作成することができます。

## 主な機能
- YouTube動画のダウンロード（yt-dlpを使用）
- 指定した間隔でのフレーム抽出
- 抽出したフレームを横に並べた一枚の画像生成
- 結果画像のダウンロード

## 使用技術
- yt-dlp: YouTube動画のダウンロード
- OpenCV (cv2): 動画処理とフレーム抽出
- PIL (Python Imaging Library): 画像結合と保存
- NumPy: 画像データの配列操作

## 実装詳細

### セットアップ
```python
# @title セットアップ { display-mode: "form" }
# @markdown 必要なライブラリのインストール
!pip install yt-dlp opencv-python-headless
```

### 設定パラメータ
```python
# --- 設定 ---
youtube_url = "任意のYouTube URL"
output_image_path = "output_frames.png"
temp_video_path = "temp_video.mp4"
frame_interval = 30  # 何フレームごとに抽出するか (1秒あたり約30フレームなら、30で約1秒ごと)
```

### 必要なライブラリのインポート
```python
import yt_dlp
import cv2
import numpy as np
from PIL import Image
import os
```

### YouTube動画のダウンロード
```python
# --- yt-dlp のオプション設定 ---
ydl_opts = {
    'format': 'bestvideo[ext=mp4]/best[ext=mp4]/best', # 音声なしでOK
    'outtmpl': temp_video_path,
    'noplaylist': True,
}

# --- YouTube動画のダウンロード ---
try:
    with yt_dlp.YoutubeDL(ydl_opts) as ydl:
        ydl.download([youtube_url])
except yt_dlp.utils.DownloadError as e:
    print(f"ダウンロードエラー: {e}")
    exit()
```

### フレーム抽出プロセス
```python
# --- 動画の読み込み ---
cap = cv2.VideoCapture(temp_video_path)
if not cap.isOpened():
    print("動画ファイルを開けませんでした")
    exit()

# --- フレームの抽出と結合 ---
frame_count = 0
all_frames = []  # 抽出したフレームを一時的に保存するリスト
while True:
    ret, frame = cap.read()
    if not ret:
        break  # フレームがなくなったら終了
    frame_count += 1
    # 指定した間隔でフレームを抽出
    if frame_count % frame_interval == 0:
        all_frames.append(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) # OpenCV -> PIL互換形式

cap.release()
os.remove(temp_video_path)  # 一時動画ファイルは削除
```

### 画像結合処理
```python
# --- 画像の結合 (横に並べる) ---
if not all_frames:
    print("フレームが抽出されませんでした")
    exit()

# 最初のフレームから、サイズを取得
frame_height = all_frames[0].shape[0]
frame_width = all_frames[0].shape[1]

# 全体の画像のサイズを計算
total_width = frame_width * len(all_frames)
total_height = frame_height

# 新しい画像を作成
final_image = Image.new("RGB", (total_width, total_height))

# 各フレームを貼り付け
x_offset = 0
for frame_array in all_frames:
  frame_img = Image.fromarray(frame_array)
  final_image.paste(frame_img, (x_offset, 0))
  x_offset += frame_width

# --- 画像の保存 ---
final_image.save(output_image_path)
print(f"画像を {output_image_path} に保存しました。")
```

### 画像のダウンロード（Colab専用機能）
```python
# --- ダウンロード (Colab用) ---
# @markdown 生成された画像をダウンロードします。
from google.colab import files
files.download(output_image_path)
```

## 使用方法
1. Google Colaboratoryでノートブックを開く
2. 上記のコードをセルに貼り付ける
3. 必要に応じて設定パラメータを変更する
   - `youtube_url`: 処理したいYouTube動画のURL
   - `frame_interval`: フレームの抽出間隔（数値が小さいほど多くのフレームが抽出され、結果画像が大きくなる）
4. セルを実行する
5. 処理完了後、生成された画像が自動的にダウンロードされる

## 注意点
- 抽出するフレーム数が多い場合、生成される画像のサイズが非常に大きくなる可能性があります
- 動画の長さやフレームレートによっては処理に時間がかかる場合があります
- YouTubeの利用規約に準拠した使用を心がけてください

## 今後の改善点
- 画像サイズの調整機能の追加
- フレーム間の時間表示の追加
- グリッドレイアウト（複数行）での表示オプション
- 抽出するフレーム数の上限設定