🦁

3分でマスター:RustでFFmpegをエレガントに使う方法

に公開

はじめに

音声や動画の処理は一見難しそうですが、開発の現場では動画の形式変換、編集、透かしの追加、音声の抽出など、さまざまなニーズに直面します。

FFmpegは業界標準として、ほぼ万能なツールであり、VLC、YouTube、OBSなどの人気ソフトウェアがその恩恵を受けています。しかし、FFmpegには開発者を悩ませる点もあります:

  1. 学習のハードルが高く、多重化/逆多重化、コーデック、ピクセルフォーマット、サンプリングレートなどの概念を理解する必要があります。
  2. C言語で実装されており、直接呼び出す際にはメモリ管理の落とし穴に陥りやすく、メモリリーク、不正アクセス、プログラムのクラッシュなどの問題を引き起こす可能性があります。
  3. コードが低レベルで、メンテナンスが難しく、ちょっとしたミスでデバッグの悪夢に陥ることがあります。

Rustはメモリ安全性と高いパフォーマンスで知られていますが、RustでFFmpegをシンプルかつ安全に、かつ私たちの習慣に合った方法で使えるでしょうか?

ez-ffmpeg:RustプログラマがFFmpegをエレガントに使えるように

ez-ffmpeg は、まるで普通のRustコードを書くように、チェーン呼び出しでFFmpegのタスクを作成し、実行できるようにします。

FFIを使ってFFmpegの低レベルのCコードを呼び出し、メモリを自動管理してくれるので、C言語にありがちなメモリ安全性の問題を心配する必要はありません。

クイックスタート:Rustで形式変換

動画(または音声、画像)の形式を変換する必要があるとします。ez-ffmpeg を使えば、数行のコードで実現できます:

1. FFmpegのインストール

環境にFFmpegがまだインストールされていない場合は、以下の方法でインストールできます:

macOS:

brew install ffmpeg

Windows:

vcpkg install ffmpeg
# 初めてvcpkgをインストールする場合は、環境変数 VCPKG_ROOT を設定する必要があります

2. Rustの依存関係を追加

Cargo.tomlez-ffmpeg を追加します:

[dependencies]
ez-ffmpeg = "*"

3. コードの実行

use ez_ffmpeg::FfmpegContext;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 1. FFmpegコンテキストの構築
    let context = FfmpegContext::builder()
        .input("input.mp4")   // 入力ファイル
        .output("output.mov") // 出力ファイル
        .build()?;

    // 2. タスクの開始と完了待ち
    context.start()?.wait()?;
    Ok(())
}

これだけです!入力と出力に注目するだけで、ez-ffmpeg が形式変換を完了します。

形式変換だけじゃない

ez-ffmpeg動画の編集、音声/動画の抽出、フィルターの追加、RTMPプッシュストリーミング、GPUアクセラレーション などの機能も簡単に実現できます。

公式のサンプルを参照してください:examples

まとめ

FFmpegのコマンドライン方式と比較して、ez-ffmpeg はRust開発者がシームレスに FFmpegコマンドをコードに変換できるようにし、C言語を学ぶ必要はありません

さらに、カスタムフィルターや入出力 をサポートし、Rustで直接実装できるため、C言語の拡張の複雑さから解放され、FFmpegのコンパイルの苦痛も避けられます。

🔗 オープンソースプロジェクトez-ffmpeg

Discussion