3分で学ぶオーディオ・ビデオ情報取得 | RustでFFmpegをエレガントに統合する



## **はじめに**

オーディオ・ビデオ処理の世界では、メディアファイルの詳細情報（再生時間、フォーマット、メタデータ、オーディオ・ビデオストリームのエンコードパラメータなど）を取得することがよくあります。これらの情報は、メディア管理、トランスコードのスケジューリング、再生制御などのシーンで不可欠です。

しかし、FFmpegのコマンドラインツールやネイティブAPIを直接使用すると、以下のような課題が生じます：

- **コマンドラインツールの複雑さ**：FFmpegのコマンドライン引数は非常に多く、使い方を間違えるとエラーが発生します。例えば、スペースを含むファイル名を扱う場合、適切なエスケープや引用符の使用に注意しないと、ファイル名が認識されない問題が起こります。  
- **ネイティブAPIの複雑さ**：FFmpegは多くのデータ構造と関数呼び出しを必要とし、学習が難しいです。  
- **メモリ管理の複雑さ**：低レベルのCインターフェースを直接操作すると、メモリリークやセキュリティ上の問題を引き起こす可能性があります。  
- **メンテナンスコストの高さ**：異なるバージョン間の互換性問題を処理する必要があり、開発とメンテナンスの難易度が上がります。  

そのため、Rustエコシステムでは、FFmpegをシンプルで安全かつ効率的に統合する方法が求められています。

## **より良い解決策**

これらの問題を解決するために、**`ez-ffmpeg`**ライブラリが登場しました。このライブラリはFFI（外部関数インターフェース）を通じてFFmpegの低レベルCコードを呼び出し、Rust開発者に安全で使いやすいインターフェースを提供します。FFmpegの複雑なネイティブAPIを直接操作することなく、開発の難易度を下げ、効率を高めることが目的です。

## **クイックスタート：Rustでオーディオ・ビデオ情報を取得**

メディアファイルの再生時間、フォーマット、メタデータ、オーディオ・ビデオストリームの情報を取得する方法を、たった数行のコードで紹介します：

### **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::container_info::{get_duration_us, get_format, get_metadata};
use ez_ffmpeg::stream_info::{find_all_stream_infos, find_audio_stream_info, find_video_stream_info};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let file_path = "test.mp4";

    // メディアファイルの再生時間（マイクロ秒）を取得
    let duration = get_duration_us(file_path)?;
    println!("再生時間: {} マイクロ秒", duration);

    // メディアファイルのフォーマットを取得
    let format = get_format(file_path)?;
    println!("フォーマット: {}", format);

    // メディアファイルのメタデータを取得
    let metadata = get_metadata(file_path)?;
    println!("メタデータ:");
    for (key, value) in metadata {
        println!("{}: {}", key, value);
    }

    // ビデオストリームの情報を取得
    if let Some(video_info) = find_video_stream_info(file_path)? {
        println!("ビデオストリーム情報: {:?}", video_info);
    } else {
        println!("ビデオストリームが見つかりません。");
    }

    // オーディオストリームの情報を取得
    if let Some(audio_info) = find_audio_stream_info(file_path)? {
        println!("オーディオストリーム情報: {:?}", audio_info);
    } else {
        println!("オーディオストリームが見つかりません。");
    }

    // すべてのストリームの情報を取得
    let all_stream_infos = find_all_stream_infos(file_path)?;
    println!("すべてのストリーム情報:");
    for stream_info in all_stream_infos {
        println!("{:?}", stream_info);
    }

    Ok(())
}
```

このコードでは：

- `get_duration_us(file_path)`：メディアファイルの再生時間をマイクロ秒単位で取得。  
- `get_format(file_path)`：メディアファイルのフォーマット名を取得。  
- `get_metadata(file_path)`：メディアファイルのメタデータを取得。  
- `find_video_stream_info(file_path)`：メディアファイルの最初のビデオストリーム情報を取得。  
- `find_audio_stream_info(file_path)`：メディアファイルの最初のオーディオストリーム情報を取得。  
- `find_all_stream_infos(file_path)`：メディアファイルのすべてのストリーム情報を取得。  

このコードを実行すると、メディアファイルの詳細情報（再生時間、フォーマット、メタデータ、各ストリーム情報）が出力されます。

## **まとめ**

`ez-ffmpeg`を使えば、Rust開発者はFFmpegのコマンドラインツールやネイティブAPIを直接操作することなく、安全かつ効率的にメディアファイルの情報を取得できます。これにより、開発プロセスが簡素化され、エラーのリスクが低減し、ビジネスロジックの実装に集中できるようになります。

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