未分類
QQQ銘柄 動画バッチ生成・R2配信計画
背景
/financial-quiz/proportional-animation-qqqページでは、100銘柄の財務アニメーションを動画としてダウンロードできる機能がある。現在はブラウザ上でリアルタイム生成しているが、以下の理由から事前生成に切り替える。
- ユーザー体験向上: 即座にダウンロード開始
- 一貫性: 誰がダウンロードしても同じ動画
- 負荷軽減: ブラウザでの重いレンダリング処理を排除
Cloudflare R2 料金体系
無料枠(月額)
| 項目 | 無料枠 |
|---|---|
| ストレージ | 10 GB |
| Class A操作(書き込み) | 100万リクエスト |
| Class B操作(読み込み) | 1,000万リクエスト |
| エグレス(転送量) | 無料(制限なし) |
重要: 無料枠はアカウント単位で適用される。バケット単位やプロジェクト単位ではなく、Cloudflareアカウント全体で10GBを共有。
有料になる条件
| 項目 | 超過料金 |
|---|---|
| ストレージ | $0.015/GB/月 |
| Class A操作 | $4.50/100万リクエスト |
| Class B操作 | $0.36/100万リクエスト |
R2の技術的な制限
| 項目 | 制限 |
|---|---|
| バケット数/アカウント | 100万個 |
| ストレージ容量/バケット | 無制限 |
| 単一オブジェクトサイズ | 最大5TiB |
| カスタムドメイン/バケット | 50個 |
本プロジェクトの見積もり
| 項目 | 値 |
|---|---|
| 銘柄数 | 100 |
| 1銘柄あたりサイズ | 約3MB(MP4) |
| 合計 | 約300MB |
| 無料枠に対する割合 | 3% |
→ 余裕で無料枠内。エグレス無料のため、ダウンロード数が増えても追加コストなし。
参考:
技術設計
1. 動画生成フロー
financial-data.ts (データ)
↓ [Node.js スクリプト]
Canvas + Chart.js でレンダリング
↓ [FFmpeg]
WebM → MP4 変換・最適化
↓ [wrangler r2]
Cloudflare R2 にアップロード
2. 動画仕様
| 項目 | 値 |
|---|---|
| 解像度 | 1920 × 1080 |
| フォーマット | MP4 (H.264) |
| フレームレート | 30fps |
| 期間数 | 11期(2015〜LTM) |
| 各期間表示時間 | 1.5秒 |
| 総時間 | 約17秒 |
| 予想サイズ | 5〜15MB/ファイル |
3. ファイル構成
R2 bucket: financial-videos
├── AAPL.mp4
├── GOOGL.mp4
├── MSFT.mp4
├── ... (100銘柄)
└── metadata.json # 生成日時、バージョン情報
4. ダウンロードURL構成
https://r2.eurekapu.com/financial-videos/{ticker}.mp4
または Cloudflare Pages 経由でプロキシ。
実装ステップ
Step 1: Canvas直接レンダリングスクリプト
Node.js + canvas パッケージで、Vue コンポーネントの描画ロジックを再現。
cd apps/web
node scripts/generate-financial-videos.mjs
Step 2: WebM → MP4 変換
Python + FFmpeg で一括変換。
python scripts/convert-to-mp4.py
Step 3: R2 アップロード
wrangler r2 object put financial-videos/{ticker}.mp4 \
--file ./videos/{ticker}.mp4
Step 4: フロントエンド変更
AnimationExportButton.vue を修正し、事前生成動画への直リンクに変更。
代替案: Puppeteer による生成
Canvas直接レンダリングが複雑な場合の代替案として、以下がある。
- ローカルでdev server起動
- Puppeteerで各銘柄ページを開く
- 「ダウンロード」ボタンをクリック
- WebMファイルを収集
- FFmpegでMP4に変換
メリット: 既存のレンダリングロジックをそのまま使用 デメリット: 時間がかかる(100銘柄 × 約30秒 = 約50分)
次のアクション
- R2 バケット作成
- 動画生成スクリプト実装
- MP4変換スクリプト実装
- R2 アップロードスクリプト実装
- フロントエンド修正
- デプロイ・検証