この記事の著者について:フルスタックエンジニア/AI統合開発専門家として、AI動画生成技術の研究開発を行っています。
ポートフォリオサイト:https://snamo.jp/
はじめに
Runway Gen-4 Turboは画像から高品質な動画を生成できる素晴らしいAIモデルですが、最大10秒(または5秒)までしか生成できないという制限があります。
「もっと長い動画を作りたい...」
そんな時、ふと思いつきました。
「動画の最終フレームをキャプチャして、それを次の動画の入力画像として使えば、連鎖的に長い動画が作れるのでは?」
ただし、通常の動画エンコードでは圧縮を繰り返すと品質劣化が蓄積します。懸念していたのは:
- 🤔 3回も繰り返したら画質がボロボロになるのでは?
- 🤔 ノイズが増えて見られたものじゃなくなるのでは?
実際に試してみたところ、予想を完全に覆す結果となりました。
TL;DR(結論)
- ✅ Gen-4 Turboで5秒×3回の連鎖生成を実施
- ✅ 品質劣化は全く見られなかった(驚き!)
- ✅ 画質、色彩、エッジの鮮明さ、全て維持
- 💰 Google Veoシリーズの1/3〜1/8の価格(コスパ最強!)
- ⚠️ コストは回数分かかる(5秒×3回 = $0.75)
- 💡 実用的な手法として十分使える
実装内容
アーキテクチャ
- フロントエンド: Next.js 15 (App Router)
- API: Runway API (Gen-4 Turbo)
-
主要機能:
- 画像アップロード
- 動画生成(ポーリング)
- 最終フレームのPNGキャプチャ ← 今回のキーポイント
主要コード
1. 最終フレームキャプチャ機能
// 動画の最後のフレームをキャプチャ
function captureLastFrame() {
const video = document.querySelector("video");
if (!video) return;
// 動画を最後まで移動
video.currentTime = video.duration;
// 少し待ってからキャプチャ(シークが完了するまで)
video.onseeked = () => {
const canvas = document.createElement("canvas");
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
const ctx = canvas.getContext("2d");
if (!ctx) return;
// ビデオの現在のフレームをcanvasに描画
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
// PNGとしてデータURLを生成
const imageDataUrl = canvas.toDataURL("image/png");
setCapturedImage(imageDataUrl);
// 自動ダウンロード
const link = document.createElement("a");
link.href = imageDataUrl;
link.download = `last-frame-${taskId || "capture"}.png`;
link.click();
};
}
2. Runway API呼び出し(Image to Video)
export async function POST(request: Request) {
const apiKey = process.env.RUNWAY_API_KEY;
const form = await request.formData();
const image = form.get("image");
const duration = Number(form.get("duration") || "5");
const ratio = form.get("resolution") || "1280:720";
const prompt = form.get("prompt") || "";
// 画像をBase64に変換
const arrayBuffer = await (image as Blob).arrayBuffer();
const base64 = Buffer.from(arrayBuffer).toString("base64");
const dataUrl = `data:image/png;base64,${base64}`;
const payload = {
model: "gen4_turbo",
promptImage: dataUrl,
ratio,
duration,
...(prompt ? { promptText: prompt } : {}),
};
const resp = await fetch("https://api.dev.runwayml.com/v1/image_to_video", {
method: "POST",
headers: {
Authorization: `Bearer ${apiKey}`,
"Content-Type": "application/json",
"X-Runway-Version": "2024-11-06",
},
body: JSON.stringify(payload),
});
const data = await resp.json();
return Response.json({ taskId: data.id });
}
3. UI(動画プレビューとキャプチャボタン)
{videoUrl && (
<div className="mt-6">
<video src={videoUrl} controls className="w-full" crossOrigin="anonymous" />
<div className="mt-3 flex gap-3 flex-wrap">
<a href={videoUrl} download className="text-blue-600 underline text-sm">
動画をダウンロード
</a>
<button
onClick={captureLastFrame}
className="bg-green-600 text-white px-4 py-1.5 rounded text-sm hover:bg-green-700"
>
📸 最後のフレームをPNG保存
</button>
</div>
{capturedImage && (
<div className="mt-4 p-3 bg-green-50 border border-green-200 rounded">
<p className="text-sm font-semibold text-green-700 mb-2">
最後のフレームをキャプチャしました:
</p>
<img src={capturedImage} alt="最後のフレーム" className="w-full border rounded" />
</div>
)}
</div>
)}
セットアップ方法
# 環境変数の設定
echo "RUNWAY_API_KEY=your_api_key_here" > .env.local
# 依存関係のインストール
npm install
# 開発サーバー起動
npm run dev
実験:5秒×3回の連鎖生成
実験手順
- 1回目: 初期画像(キャラクターのイラスト)→ 5秒動画生成
- 最終フレームキャプチャ: 1回目の動画の最後のフレームをPNG保存
- 2回目: キャプチャした画像 → 5秒動画生成
- 最終フレームキャプチャ: 2回目の動画の最後のフレームをPNG保存
- 3回目: キャプチャした画像 → 5秒動画生成
- 結合: 3本の動画を動画編集ソフトで結合(計15秒)
使用設定
- モデル: Gen-4 Turbo
- 時間: 5秒 × 3回
- 解像度: 1280:720
- プロンプト: あり(各回で調整)
- 総コスト: 5秒 × 3回 × $0.01 × 25 = $0.75
結果:品質劣化は全く見られなかった!
実際の動画(5秒×3回 = 15秒)
キャラクターの登場 → 光の柱の出現 → ハート形のエフェクト
動画をクリックすると、ブラウザで再生またはダウンロードできます。
動きが滑らかで品質劣化は全く見られません!
各段階のフレーム比較
以下は、1回目、2回目、3回目の動画からそれぞれ抽出したフレームです:
キャラクターと夜景の描写が非常に鮮明
光の柱が追加され、背景のディテールも保持
ハート形のエフェクト、グラデーションも美しく描写
品質分析
各項目を詳しく確認しました:
項目 | 評価 | 詳細 |
---|---|---|
画質の鮮明さ | ⭐⭐⭐⭐⭐ | キャラクターの髪の毛の細かいディテールまで保持 |
色彩の豊かさ | ⭐⭐⭐⭐⭐ | 青い夜空のグラデーション、月の白、光の青、全て鮮やか |
エッジの鮮明さ | ⭐⭐⭐⭐⭐ | 輪郭がシャープ、ぼやけやにじみなし |
ノイズ | ⭐⭐⭐⭐⭐ | ブロックノイズ、圧縮アーティファクトなし |
背景のディテール | ⭐⭐⭐⭐⭐ | 建物の窓、星、雪のパーティクルも鮮明 |
光のエフェクト | ⭐⭐⭐⭐⭐ | グローエフェクト、グラデーションに破綻なし |
結論: 3回の連鎖でも品質劣化は全く見られませんでした!
なぜ品質が落ちないのか?(考察)
従来の動画エンコードでは、繰り返すごとに品質が劣化していきます。しかし、今回の手法では劣化が見られませんでした。その理由を考察します:
1. PNG保存が鍵
動画1(MP4) → 最終フレーム → PNG保存(可逆圧縮)→ 動画2の入力
- MP4からPNGへの変換時点で非圧縮または可逆圧縮
- 次の生成時には高品質な静止画として入力
- 動画→動画の変換(トランスコード)ではないため、劣化の蓄積が起きない
2. 各生成が独立している
- 従来の動画エンコード: 前のフレームの情報を参照(差分圧縮)
- AI生成: 毎回静止画から新規に生成
- エラーや劣化が蓄積しない構造
3. Runwayの高品質なエンコード
- Gen-4 Turboでも非常に高品質
- 十分なビットレート
- 最新のエンコード技術
4. AIのノイズ除去能力?
- AI生成時に入力画像のノイズを自動的にクリーンアップしている可能性
- 劣化するどころか、むしろ改善されている可能性も?
コストと実用性
コスト計算
Gen-4 Turboの料金体系:
- 5秒: $0.01 × 25 credits = $0.25
- 10秒: $0.01 × 50 credits = $0.50
今回の実験(5秒×3回):
- $0.25 × 3 = $0.75
参考:10秒動画を3本繋げた場合(30秒):
- $0.50 × 3 = $1.50
💡 他のAI動画生成モデルとのコスパ比較
Runway Gen-4 Turbo vs Google Gemini Veo シリーズ
モデル | 価格(10秒動画) | 1秒あたり | コスト比較 |
---|---|---|---|
Runway Gen-4 Turbo | $0.50 | $0.05/秒 | 基準 |
Google Veo 3 Fast | $1.50 | $0.15/秒 | Runwayの3倍 |
Google Veo 3 | $4.00 | $0.40/秒 | Runwayの8倍 |
Google Veo 2 | $3.50 | $0.35/秒 | Runwayの7倍 |
Runway Gen-4 Turboの圧倒的な優位性:
- 🎯 コストパフォーマンスが圧倒的(Veo 3 Fastの1/3、Veo 3の1/8の価格!)
- ✅ APIがシンプルで実装しやすい
- ✅ 生成速度が速い
- ✅ 品質も十分高い(今回の実験で証明)
- ✅ 短時間動画なら最もコスト効率が良い
コスト計算例(30秒動画の場合):
- Runway Gen-4 Turbo(10秒×3): $1.50
- Veo 3 Fast(30秒): $4.50(3倍)
- Veo 3(30秒): $12.00(8倍)
結論: AI動画生成でコストを重視するなら、Runway Gen-4 Turboが圧倒的に最適な選択肢です!
⚠️ 注意: 価格は2025年9月時点の情報です。最新の価格は各サービスの公式サイトをご確認ください。
実用性の評価
✅ この手法が有効なケース
-
ストーリー性のある動画を作りたい
- 各生成でプロンプトを変えて展開を変えられる
- 例: キャラクター登場 → 何かが起こる → クライマックス
-
長めのループ動画を作りたい
- 15秒〜30秒のループ動画
-
プロトタイプ作成
- アニメーションの試作
- MVのイメージボード
⚠️ 注意すべき点
-
コストは回数分かかる
- 単純に動画を繋げたいだけなら、動画編集ソフトで結合する方が経済的
-
手動操作が必要
- 自動化も可能だが、実装が必要
-
より多くの回数での検証は今後の課題
- 10回、20回と増やした場合の品質は未検証
- どこかで劣化が始まる可能性はある
より良い代替手段との比較
動画編集ソフトで結合する場合
メリット:
- コストがかからない
- 高速
- 品質劣化なし
デメリット:
- 既存の動画を繋げるだけ
- 途中で展開を変えられない
今回の連鎖生成手法
メリット:
- 途中でストーリーを変えられる(プロンプト変更)
- AIが自然な繋がりを生成
- 創造的な表現が可能
デメリット:
- コストがかかる
- 生成時間がかかる
利用規約について
Runway APIの利用規約の確認
この手法は以下の点で適切です:
- ✅ 各API呼び出しに正当に料金を支払っている
- ✅ APIを正規の方法で使用
- ✅ 「制限回避」ではなく「APIの組み合わせ活用」
- ✅ 生成されたコンテンツの商用利用も可能
⚠️ 重要:必須のクレジット表記
Runway APIを使用したアプリには必ず以下の表記が必要です:
- ✅ 「Powered by Runway」の表記
- ✅ runwayml.comへのリンク(クリック可能)
- ✅ エンドユーザーへの利用規約の適用
今回のデモアプリには、この要件に従ってクレジット表記を実装しています。
公式ドキュメント: Runway API利用規約
今後の展望・検証したいこと
-
より多くの回数での連鎖
- 10回、20回でも品質は保たれるか?
- 劣化が始まる閾値はどこか?
-
異なる解像度での検証
- 高解像度の方が劣化しにくい?
- 低解像度では劣化が目立つ?
-
動きの激しいシーンでの検証
- アクションシーンでも品質は保たれるか?
-
自動化スクリプトの作成
- 複数回の生成を自動化
- 自動結合機能
まとめ
実験結果のまとめ
- 🎉 Gen-4 Turboで3回の連鎖生成を行っても品質劣化なし
- 🎉 予想を完全に覆す結果
- 🎉 実用的な手法として十分使える
- ⚠️ コスト面での検討は必要
この手法の意義
-
技術的な発見
- AI生成動画の品質の高さを実証
- 「劣化する」という先入観を覆した
-
創造的な可能性
- 長尺動画の新しい作り方
- ストーリーテリングの新しい手法
-
APIの賢い使い方
- 制限内で創造的に活用
- コストパフォーマンスを考えた運用
最後に
この実験を通じて、AIによる動画生成技術の成熟度の高さを実感しました。
「10秒制限」という制約も、工夫次第で乗り越えられることが分かりました。
皆さんもぜひ試してみてください!
参考リンク
GitHubリポジトリ
完全なコードはこちら:
https://github.com/nobu-suzuki345/runway-video-chaining-demo
👤 著者について
SNAMO - フルスタックエンジニア / AI統合開発専門家
Google AI・ChatGPT・Claude統合システムの設計・開発を専門としています。企業のDX推進やAI技術導入のコンサルティングも行っています。
🌐 ポートフォリオサイト
最新のプロジェクト実績や技術記事を公開しています。
💬 ご質問・ご相談について
この記事や関連技術について、ご質問やご相談がございましたら、お気軽にお問い合わせください。
- 無料相談受付中: 企業向けAI導入・技術コンサルティング
-
専門分野:
- Runway API等のAI動画生成技術
- Google AI・ChatGPT・Claude統合開発
- Next.js/React フルスタック開発
- レリバンスエンジニアリング
お気軽にご連絡ください!
質問やコメントもお待ちしています 💬