0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2025-03-22

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

導入

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

主な活用シーン

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

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

概要

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

主な機能

  • YouTube動画のダウンロード(yt-dlpを使用)
  • 指定した間隔でのフレーム抽出
  • 抽出したフレームを横に並べた一枚の画像生成
  • 結果画像のダウンロード

使用技術

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

実装詳細

セットアップ

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

設定パラメータ

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

必要なライブラリのインポート

import yt_dlp
import cv2
import numpy as np
from PIL import Image
import os

YouTube動画のダウンロード

# --- 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()

フレーム抽出プロセス

# --- 動画の読み込み ---
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)  # 一時動画ファイルは削除

画像結合処理

# --- 画像の結合 (横に並べる) ---
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専用機能)

# --- ダウンロード (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の利用規約に準拠した使用を心がけてください

今後の改善点

  • 画像サイズの調整機能の追加
  • フレーム間の時間表示の追加
  • グリッドレイアウト(複数行)での表示オプション
  • 抽出するフレーム数の上限設定
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?