#ffmpeg #video #audio-video #file-input #audio

ffmpeg-cli

Wraps the ffpmeg cli, using -progress to report progress

1 unstable release

0.1.0 Apr 11, 2021

#334 in Multimedia

Download history 2/week @ 2024-11-13 10/week @ 2024-11-20 15/week @ 2024-11-27 20/week @ 2024-12-04 58/week @ 2024-12-11 15/week @ 2024-12-18 20/week @ 2025-01-01 16/week @ 2025-01-08 35/week @ 2025-01-15 17/week @ 2025-01-22 19/week @ 2025-01-29 36/week @ 2025-02-05 41/week @ 2025-02-12 9/week @ 2025-02-19 31/week @ 2025-02-26

122 downloads per month

GPL-2.0-or-later

20KB
277 lines

Wraps the ffpmeg cli, using -progress to report progress

Sometimes you just want a simple way to use ffmpeg. Most crates just use ffi, leading to complicated interfaces. ffmpeg_cli avoids this by wrapping the cli, for when you don't need the flexibility the real ffmpeg api gives you.

use std::process::Stdio;

use ffmpeg_cli::{FfmpegBuilder, File, Parameter};
use futures::{future::ready, StreamExt};

#[tokio::main]
async fn main() {
    let builder = FfmpegBuilder::new()
        .stderr(Stdio::piped())
        .option(Parameter::Single("nostdin"))
        .option(Parameter::Single("y"))
        .input(File::new("input.mkv"))
        .output(
            File::new("output.mp4")
                .option(Parameter::KeyValue("vcodec", "libx265"))
                .option(Parameter::KeyValue("crf", "28")),
        );

    let ffmpeg = builder.run().await.unwrap();

    ffmpeg
        .progress
        .for_each(|x| {
            dbg!(x.unwrap());
            ready(())
        })
        .await;

    let output = ffmpeg.process.wait_with_output().unwrap();

    println!(
        "{}\nstderr:\n{}",
        output.status,
        std::str::from_utf8(&output.stderr).unwrap()
    );
}

Dependencies

~3–12MB
~127K SLoC