HiÐΞClassic

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

SHOGAKU
11 days ago
YouTube動画フレーム抽出ツール レポート導入主な活用シーン概要主な機能使用技術実装詳細セットアップ設定パラメータ必要なライブラリのインポートYouTube動画のダウンロードフレーム抽出プロセス画像結合処理画像のダウンロード(Colab専用機能)使用方法注意点今後の改善点

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の利用規約に準拠した使用を心がけてください

今後の改善点

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

コメント
いいね
投げ銭
最新順
人気順
SHOGAKU
11 days ago
コメント
いいね
投げ銭
最新順
人気順
トピック
アプリ

Astar Network

DFINITY / ICP

NFT

DAO

DeFi

L2

メタバース

BCG

仮想通貨 / クリプト

ブロックチェーン別

プロジェクト

目次
Tweet
ログイン