YouTube動画フレーム抽出ツール
SHOGAKU
10日前
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)
使用方法
- Google Colaboratoryでノートブックを開く
- 上記のコードをセルに貼り付ける
- 必要に応じて設定パラメータを変更する
youtube_url
: 処理したいYouTube動画のURLframe_interval
: フレームの抽出間隔(数値が小さいほど多くのフレームが抽出され、結果画像が大きくなる)
- セルを実行する
- 処理完了後、生成された画像が自動的にダウンロードされる
注意点
- 抽出するフレーム数が多い場合、生成される画像のサイズが非常に大きくなる可能性があります
- 動画の長さやフレームレートによっては処理に時間がかかる場合があります
- YouTubeの利用規約に準拠した使用を心がけてください
今後の改善点
- 画像サイズの調整機能の追加
- フレーム間の時間表示の追加
- グリッドレイアウト(複数行)での表示オプション
- 抽出するフレーム数の上限設定
コメント
いいね
投げ銭
最新順
人気順
コメント
いいね
投げ銭
最新順
人気順