3分で学ぶ動画編集 | RustでFFmpegをエレガントに統合する方法



## **はじめに**

現代のショートビデオ全盛期において、**効率的な動画編集**はコンテンツクリエイターや開発者にとって必須のスキルとなっています。動画の冒頭や終わりをカットしたり、印象的なシーンを切り出したり、GIFを作成したり、広告を取り除いたりと、編集が必要な場面は数え切れません。

しかし、**大量の動画を一括で処理する**のは簡単なことではありません。よくある課題を挙げてみましょう：

- **手動での編集**：時間と労力がかかり、効率が悪い。
- **プロ向けソフト（PremiereやAfter Effectsなど）**：高度な編集には最適ですが、自動化や一括処理には不向き。
- **FFmpegのコマンドライン**：非常に強力ですが、パラメータが複雑でミスが起こりやすい。

Rustを愛用する開発者なら、こんな疑問を抱くかもしれません。「プログラム内で**動画編集をスマートに実装**し、自動化と高効率を実現するにはどうすればいいのか？」と。

## **Rustでの動画編集の壁**

FFmpegは、動画編集やフォーマット変換などで広く使われる頼もしいツールです。しかし、RustからFFmpegのC言語APIを直接呼び出すには、いくつかのハードルがあります：

- **複雑さ**：FFmpegの内部実装やパラメータを深く理解する必要があり、学習に時間がかかる。
- **メモリ管理**：C言語APIをそのまま使うと、メモリリークや不正アクセスのリスクが高まり、プログラムの安定性が損なわれる。
- **開発効率**：煩雑なインターフェースや設定作業が、開発スピードを落とし、エラーを誘発する原因に。

## **解決策：RustでFFmpegをスマートに活用**

こうした課題をクリアするため、Rustコミュニティは便利なラッパーライブラリを提供しています。その一つが**`ez-ffmpeg`**です。このライブラリは、FFIを通じてFFmpegのCコードを呼び出しつつ、Rust開発者に安全で使いやすいインターフェースを提供します。複雑なネイティブAPIに直接触れることなく、開発のハードルを下げ、効率をアップさせるのが狙いです。

## **実践：Rustで動画をサクッと編集**

たとえば、`test.mp4`という動画から**5秒目から3秒間**を切り出し、`output.mp4`として保存したい場合、以下のように進めます：

### **1. FFmpegをインストール**

まだFFmpegを環境に導入していない場合、次の方法でインストールしてください：

#### macOS：

```bash
brew install ffmpeg
```

#### Windows：

```bash
vcpkg install ffmpeg
# 初めてvcpkgを使う場合、環境変数 VCPKG_ROOT の設定が必要です
```

### **2. Rustの依存関係を設定**

`Cargo.toml`に`ez-ffmpeg`を追加します：

```toml
[dependencies]
ez-ffmpeg = "*"
```

### **3. コードを書いて実行**

```rust
use ez_ffmpeg::{FfmpegContext, Input, Output};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // FFmpegコンテキストを作り、5秒目から3秒間を切り出す
    FfmpegContext::builder()
        .input(Input::from("test.mp4")
            .set_start_time_us(5_000_000) // 5秒から開始（マイクロ秒単位）
            .set_recording_time_us(3_000_000)) // 3秒間を抽出
        .output("output.mp4")
        .build()?
        .start()?
        .wait()?;
    Ok(())
}
```

## **コードを紐解く**

このコードの流れを簡単に解説します：

1. **入力動画を指定**

   ```rust
   .input(Input::from("test.mp4")
   ```

   `test.mp4`が編集したい元動画です。

2. **編集時間を決める**

   ```rust
   .set_start_time_us(5_000_000) // 5秒からスタート
   .set_recording_time_us(3_000_000) // 3秒間を切り出し
   ```

   - `set_start_time_us(5_000_000)`：**5秒目**から編集開始。
   - `set_recording_time_us(3_000_000)`：**3秒分**を抽出。

3. **出力先を設定**

   ```rust
   .output("output.mp4")
   ```

   完成した動画は`output.mp4`に保存されます。

4. **編集を実行**

   ```rust
   .build()?.start()?.wait()?;
   ```

   - **タスクを構築**。
   - **編集を開始**。
   - **完了を待つ**。

## **応用編：いろんな編集を楽しむ**

### **1. 最初の10秒だけを残す**

動画の**冒頭10秒**だけを切り出したい場合：

```rust
.input(Input::from("test.mp4").set_recording_time_us(10_000_000))
```

これで**10秒間**の`output.mp4`が完成します。

### **2. 10秒目から最後までを保存**

**最初の10秒をカット**して残りを保存：

```rust
.input(Input::from("test.mp4").set_start_time_us(10_000_000))
```

### **3. GIFに変身**

編集した動画を**GIFに変換**するなら、出力先をこう変更：

```rust
FfmpegContext::builder()
    .input(Input::from("test.mp4")
        .set_start_time_us(5_000_000)
        .set_recording_time_us(3_000_000))
    .output("output.gif") // GIF形式で出力
    .build()?
    .start()?
    .wait()?;
```

これで**3秒のGIF**が`output.gif`として生まれます。

## **おわりに**

Rustで`ez-ffmpeg`のようなラッパーライブラリを活用すれば、こんなメリットが手に入ります：

- **簡単操作**：数行のコードで動画編集が完結。
- **安全性**：Rustのメモリ管理が、C言語APIのリスクを回避。
- **効率アップ**：FFmpegの細かい設定に悩まず、アイデアに集中。

ショートビデオやライブ配信、コンテンツ制作に関わるRustプロジェクトに取り組んでいるなら、`ez-ffmpeg`があなたの強い味方になるはずです。

🔗 **プロジェクトページ**：[ez-ffmpeg](https://github.com/YeautyYE/ez-ffmpeg)