• #cloudflare
  • #r2
  • #video
  • #batch-generation
  • #ffmpeg
未分類

QQQ銘柄 動画バッチ生成・R2配信計画

背景

/financial-quiz/proportional-animation-qqqページでは、100銘柄の財務アニメーションを動画としてダウンロードできる機能がある。現在はブラウザ上でリアルタイム生成しているが、以下の理由から事前生成に切り替える。

  1. ユーザー体験向上: 即座にダウンロード開始
  2. 一貫性: 誰がダウンロードしても同じ動画
  3. 負荷軽減: ブラウザでの重いレンダリング処理を排除

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直接レンダリングが複雑な場合の代替案として、以下がある。

  1. ローカルでdev server起動
  2. Puppeteerで各銘柄ページを開く
  3. 「ダウンロード」ボタンをクリック
  4. WebMファイルを収集
  5. FFmpegでMP4に変換

メリット: 既存のレンダリングロジックをそのまま使用 デメリット: 時間がかかる(100銘柄 × 約30秒 = 約50分)

次のアクション

  1. R2 バケット作成
  2. 動画生成スクリプト実装
  3. MP4変換スクリプト実装
  4. R2 アップロードスクリプト実装
  5. フロントエンド修正
  6. デプロイ・検証