(Rustで)動画ファイルから音声データを抜き出す


はじめに

FFmpegを使えば、コマンドラインから動画ファイルの様々な操作が可能

FFmpeg の導入が面倒な場合は、ffmpeg_sidecar クレートを使えば、FFmpeg を自動でダウンロードして、各種処理が可能 (ez-ffmpeg などもあるが、こちらはバイナリの自動ダウンロードなどはしてくれない)


プロジェクト準備

mkdir ffmpeg
cd ffmpeg
cargo init

Cargo.tomlffmpeg_sidecar の依存を定義

[dependencies]
ffmpeg_sidecar = "2.2.0"


ffmpeg_sidecar の利用

ffmpeg_sidecar は FFmpeg CLI のラッパとなっており、Fluent な API で操作できる。

src/main.rs を以下に編集

use ffmpeg_sidecar::command::FfmpegCommand;

fn main() -> Result<(), Box<dyn std::error::Error>> {

    // プラットフォームに応じた ffmpeg を自動ダウンロード
    ffmpeg_sidecar::download::auto_download()?;
    
    let input_file  = "input.mp4";
    let output_file = "output.aac";

    // ffmpeg -i input.mp4 -vn -c:a copy -y output.aac
    FfmpegCommand::new()
        .input(input_file)   // "-i", input_file
        .no_video()          // "-vn"             Video No : ビデオストリームを無視
        .codec_video("copy") // "-c:a", "copy"    Codec Audio: copy : 音声ストリームを再エンコードせずコピー
        .overwrite()         // "-y"              出力ファイルが既に存在する場合、確認なしで上書き
        .output(output_file)
        .spawn()?;
    Ok(())
}


実行

$ ls
Cargo.lock  Cargo.toml  input.mp4  src/  target/

$ cargo run
   Compiling ez-ffmpeg v0.1.0 (...)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.24s
     Running `target\debug\ez-ffmpeg.exe`

$ ls
Cargo.lock  Cargo.toml  input.mp4  output.aac  src/  target/

初回は ffmpeg のダウンロードで少し時間がかかる

音声ファイル output.aac が抽出される