mp4

MP4 reader and writer library in Rust

26 releases (13 breaking)

0.14.0 Aug 1, 2023
0.13.0 Feb 2, 2023
0.12.0 Jul 30, 2022
0.10.0 Mar 26, 2022
0.4.0 Feb 6, 2020

#8 in Video

Download history 8503/week @ 2024-06-19 6050/week @ 2024-06-26 6125/week @ 2024-07-03 30640/week @ 2024-07-10 49519/week @ 2024-07-17 26521/week @ 2024-07-24 44788/week @ 2024-07-31 38592/week @ 2024-08-07 22963/week @ 2024-08-14 51857/week @ 2024-08-21 17580/week @ 2024-08-28 25285/week @ 2024-09-04 28414/week @ 2024-09-11 29750/week @ 2024-09-18 30314/week @ 2024-09-25 26049/week @ 2024-10-02

118,606 downloads per month
Used in 21 crates (17 directly)

MIT license

310KB
9K SLoC

mp4

MP4 Reader and Writer in Rust 🦀

mp4 is a Rust library to read and write ISO-MP4 files. This package contains MPEG-4 specifications defined in parts:

https://crates.io/crates/mp4

Crates.io Crates.io Docs Rust

Example

use std::fs::File;
use std::io::{BufReader};
use mp4::{Result};

fn main() -> Result<()> {
    let f = File::open("tests/samples/minimal.mp4").unwrap();
    let size = f.metadata()?.len();
    let reader = BufReader::new(f);

    let mp4 = mp4::Mp4Reader::read_header(reader, size)?;

    // Print boxes.
    println!("major brand: {}", mp4.ftyp.major_brand);
    println!("timescale: {}", mp4.moov.mvhd.timescale);

    // Use available methods.
    println!("size: {}", mp4.size());

    let mut compatible_brands = String::new();
    for brand in mp4.compatible_brands().iter() {
        compatible_brands.push_str(&brand.to_string());
        compatible_brands.push_str(",");
    }
    println!("compatible brands: {}", compatible_brands);
    println!("duration: {:?}", mp4.duration());

    // Track info.
    for track in mp4.tracks().values() {
        println!(
            "track: #{}({}) {} : {}",
            track.track_id(),
            track.language(),
            track.track_type()?,
            track.box_type()?,
        );
    }
    Ok(())
}

See examples/ for more examples.

Install

cargo add mp4

or add to your Cargo.toml:

mp4 = "0.14.0"

Documentation

Development

Requirements

Build

cargo build

Lint and Format

cargo clippy --fix
cargo fmt --all

Run Examples

  • mp4info
cargo run --example mp4info <movie.mp4>
  • mp4dump
cargo run --example mp4dump <movie.mp4>

Run Tests

cargo test

With print statement output.

cargo test -- --nocapture

Run Cargo fmt

Run fmt to catch formatting errors.

rustup component add rustfmt
cargo fmt --all -- --check

Run Clippy

Run Clippy tests to catch common lints and mistakes.

rustup component add clippy
cargo clippy --no-deps -- -D warnings

Run Benchmark Tests

cargo bench

View HTML report at target/criterion/report/index.html

Generate Docs

cargo docs

View at target/doc/mp4/index.html

Web Assembly

See the mp4-inspector project as a reference for using this library in Javascript via Web Assembly.

License

MIT

Dependencies

~1.5–2.5MB
~53K SLoC