#ffmpeg #audio-video #rtmp #video #video-processing

ez-ffmpeg

A safe and ergonomic Rust interface for FFmpeg integration, designed for ease of use

2 releases

new 0.1.1 Mar 7, 2025
0.1.0 Mar 5, 2025

#39 in Multimedia

Download history 237/week @ 2025-03-02

237 downloads per month

WTFPL license

1MB
17K SLoC

Logo

Crates.io Documentation License: WTFPL Rust FFmpeg

Overview

ez-ffmpeg provides a safe and ergonomic Rust interface for FFmpeg integration, offering a familiar API that closely follows FFmpeg’s original logic and parameter structures.

This library:

  • Ensures full safety without using unsafe code
  • Keeps the execution logic and parameter conventions as close to FFmpeg as possible
  • Provides an intuitive and user-friendly API for media processing
  • Supports custom Rust filters and flexible input/output handling
  • Offers optional RTMP and OpenGL integration

By abstracting the complexity of the raw C API, ez-ffmpeg simplifies configuring media pipelines, performing transcoding and filtering, and inspecting media streams.

Version Requirements

  • Rust: Version 1.80.0 or higher.
  • FFmpeg: Version 7.0 or higher. (Other FFmpeg versions have not been thoroughly tested and are not recommended.)

Documentation

More information about this crate can be found in the crate documentation.

Quick Start

Installation Prerequisites

macOS

brew install ffmpeg

Windows

# For dynamic linking
vcpkg install ffmpeg

# For static linking (requires 'static' feature)
vcpkg install ffmpeg:x64-windows-static-md

# Set VCPKG_ROOT environment variable

Adding the Dependency

Add ez-ffmpeg to your project by including it in your Cargo.toml:

[dependencies]
ez-ffmpeg = "*"

Basic Usage

Below is a basic example to get you started. Create or update your main.rs with the following code:

use ez_ffmpeg::FfmpegContext;
use ez_ffmpeg::FfmpegScheduler;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 1. Build the FFmpeg context
    let context = FfmpegContext::builder()
        .input("input.mp4")
        .filter_desc("hue=s=0") // Example filter: desaturate (optional)
        .output("output.mov")
        .build()?;

    // 2. Run it via FfmpegScheduler (synchronous mode)
    let result = FfmpegScheduler::new(context)
        .start()?
        .wait();
    result?; // Propagate any errors that occur
    Ok(())
}

More examples can be found here.

Features

ez-ffmpeg offers several optional features that can be enabled in your Cargo.toml as needed:

  • opengl: Enables GPU-accelerated OpenGL filters for high-performance video processing.
  • rtmp: Includes an embedded RTMP server for local streaming scenarios.
  • flv: Provides support for FLV container parsing and handling.
  • async: Adds asynchronous functionality (allowing you to .await operations).
  • static: Enables static linking for FFmpeg libraries (via ffmpeg-next/static).

License

ez-ffmpeg is distributed under the WTFPL (Do What The F*ck You Want To Public License). Important: While ez-ffmpeg is freely usable, FFmpeg has its own licensing terms. Ensure your usage complies with FFmpeg's license when using its components.

Dependencies

~1–12MB
~146K SLoC