さとまたwiki
1

Phase 1: 基盤構築

プロジェクトセットアップとFFmpeg統合

このフェーズの目標

  • Tauri + SvelteKitプロジェクトの作成
  • FFmpegとの基本連携
  • 動画ファイルの読み込みとメタデータ取得
  • 基本的なUI骨格の構築

Step 1: プロジェクト作成

# Claude Codeへの指示

"Tauri 2.0 + SvelteKit 5 + Tailwind CSSでデスクトップアプリプロジェクトを作成して。
プロジェクト名: video-editor
TypeScriptを使用して。"

# 手動で行う場合
npm create tauri-app@latest video-editor
cd video-editor
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p

Step 2: FFmpeg連携の実装

# Claude Codeへの指示

"src-tauri/src/にffmpeg.rsを作成して。
以下のTauriコマンドを実装:
- get_video_info: 動画ファイルのメタデータを取得
- probe_file: ffprobeでファイル情報を取得
FFmpegはstd::process::Commandで呼び出す。"

// src-tauri/src/ffmpeg.rs
use std::process::Command;
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize)]
pub struct VideoInfo {
    pub duration: f64,
    pub width: u32,
    pub height: u32,
    pub fps: f64,
    pub codec: String,
}

#[tauri::command]
pub fn get_video_info(path: &str) -> Result<VideoInfo, String> {
    let output = Command::new("ffprobe")
        .args([
            "-v", "quiet",
            "-print_format", "json",
            "-show_format",
            "-show_streams",
            path
        ])
        .output()
        .map_err(|e| e.to_string())?;

    // JSONパース処理...
    Ok(VideoInfo { /* ... */ })
}

Step 3: 基本UIの構築

# Claude Codeへの指示

"src/routes/+page.svelteにメインエディタUIを作成して。
レイアウト:
- 上部: ツールバー
- 左: メディアブラウザ
- 中央: プレビューエリア
- 下部: タイムライン(プレースホルダー)
Tailwind CSSでスタイリング。ダークモード対応。"

Step 4: ファイル読み込み

# Claude Codeへの指示

"動画ファイルをドラッグ&ドロップでインポートできるようにして。
- Tauriのファイルダイアログも使用可能に
- インポート後、get_video_infoでメタデータを取得
- メディアブラウザにサムネイルを表示"

Phase 1 完成イメージ

ツールバー
メディア
プレビュー
タイムライン(プレースホルダー)

完了チェックリスト

  • npm run tauri dev で起動できる
  • 動画ファイルをドロップできる
  • メタデータが表示される
  • ダークモード切り替えが動作する

実体験: Tauri + Claude Codeの落とし穴

実際に起きた問題

Tauri + SvelteKitで動画編集ソフトを開発し、統合・デプロイ・起動まで成功。 しかしClaude Code CLIで編集しようとすると非常に時間がかかり、どうしようもない状態になった。 結果、Tauriを外してSvelteKitのみの構成に変更した。

# 問題の構造

src/App.svelte           2,726行(モノリシック)
src-tauri/src/*.rs       Rust複数ファイル
src-tauri/Cargo.toml     依存関係
src-tauri/tauri.conf.json 設定
────────────────────────────────
Claude Codeの負荷: 実質4,000-5,000行相当

原因1: デュアル言語

TypeScript + Rustの両方を理解・生成する必要があり、 コンテキスト消費が2倍以上。Rustは所有権・ライフタイムの理解も必要。

原因2: モノリシック構造

1ファイルに2,726行が集中。小さな変更でも全体を読み込む必要があり、 Claude Codeの処理時間が膨大に。

原因3: Rustコンパイル

Rustの初回ビルドは2-5分、増分でも30秒-2分。 試行錯誤のサイクルが非常に遅くなる。

解決策

ファイルを100-300行単位に分割し、 Rustは最小限(FFmpegラッパーのみ)にすることで Claude Codeの負荷を1/10以下に削減可能。

Tauriだけで動画編集ソフトは作れるか?

結論: 可能だが、設計次第

TauriでLinux対応の安定した動画編集ソフトを開発することは可能。 ただし、Claude Codeと相性よく開発するにはRustを最小限に抑える設計が必須。

推奨アーキテクチャ: Thin Rust Layer

Rustはシステムとの橋渡しのみ担当。ロジックは全てTypeScript側に。

// src-tauri/src/main.rs - これだけでOK(約50行)

#[tauri::command]
fn run_ffmpeg(args: Vec<String>) -> Result<String, String> {
    std::process::Command::new("ffmpeg")
        .args(&args)
        .output()
        .map(|o| String::from_utf8_lossy(&o.stdout).to_string())
        .map_err(|e| e.to_string())
}

#[tauri::command]
fn run_ffprobe(path: &str) -> Result<String, String> {
    std::process::Command::new("ffprobe")
        .args(["-v", "quiet", "-print_format", "json",
               "-show_format", "-show_streams", path])
        .output()
        .map(|o| String::from_utf8_lossy(&o.stdout).to_string())
        .map_err(|e| e.to_string())
}

Thin Rust Layer のメリット

Rustは50行程度で済む
FFmpegコマンドはTS側で構築
Claude CodeはTS編集に集中
Rustコンパイルが高速
Linux/Windows/macOS全対応
WebKitGTKでネイティブ統合

TypeScript側でFFmpegコマンドを構築

// src/lib/utils/ffmpeg.ts
export function buildCutCommand(
  input: string,
  output: string,
  start: number,
  end: number
): string[] {
  return [
    '-i', input,
    '-ss', start.toFixed(3),
    '-to', end.toFixed(3),
    '-c', 'copy',
    '-avoid_negative_ts', 'make_zero',
    output
  ];
}

// 使用時
const args = buildCutCommand(inputPath, outputPath, 10.5, 25.0);
const result = await invoke('run_ffmpeg', { args });

Claude Code対応のファイル構造

避けるべき構造

src/
├── App.svelte     ← 2,000行以上
src-tauri/
├── src/
│   ├── main.rs    ← 500行以上
│   ├── ffmpeg.rs  ← 300行
│   └── ...

推奨構造

src/
├── App.svelte           ← 80行
├── lib/components/      ← 各150-300行
├── lib/utils/ffmpeg.ts  ← 200行
src-tauri/
├── src/main.rs          ← 50行のみ

ポイント: 各ファイルを100-300行に保つことで、Claude Codeは必要なファイルだけを読み込み、 高速に編集できる。Tauriを使っても、この構造なら問題なく開発可能。

この記事はClaude Opus 4.6によって作成されました