1
0
Fork 0
mirror of https://github.com/alfg/mp4-rust.git synced 2024-05-08 11:32:56 +00:00
🎥 MP4 reader and writer library in Rust! 🦀
Go to file
Nathan Fiedler 56cc260a5c
fix: minimize assertions in non-test code (#56)
Initial effort to reduce or eliminate the use of assertions in the
production code (i.e. not test code). See issue 43 for an example of how
this can cause an application (thread) to panic when reading an unusual
file. Not all of the changes were as simple as returning an Err, since some
functions did not return a Result. Also, the error type used (InvalidData)
is just a catch-all with a message, and in some cases a more refined error
type may be in order.

cargo test passes
2021-07-12 17:28:39 -07:00
.github/workflows Create rust.yml 2020-07-24 20:00:09 -07:00
benches add criterion for benchmarking performance. 2020-08-26 20:45:18 -07:00
examples Add mpeg_aac_decoder example (#50) 2021-02-01 17:11:35 -08:00
src fix: minimize assertions in non-test code (#56) 2021-07-12 17:28:39 -07:00
tests Add support for reading/writing fragmented mp4 (fMP4) boxes. 2020-09-03 21:33:45 -07:00
.gitignore Remove Cargo.lock and add to .gitignore. 2020-07-28 22:13:15 -07:00
.travis.yml Add basic integration test (#10) 2020-07-25 20:07:39 -07:00
Cargo.toml 0.8.2 2021-04-04 12:01:21 -07:00
LICENSE Change main.rs to lib.rs and create example mp4info project. Update readme and license. 2020-01-12 19:33:26 -08:00
README.md 0.8.2 2021-04-04 12:01:21 -07:00

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 Build Status 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().iter() {
        println!(
            "track: #{}({}) {} : {}",
            track.track_id(),
            track.language(),
            track.track_type()?,
            track.box_type()?,
        );
    }
    Ok(())
}

See examples/ for more examples.

Install

Add to your Cargo.toml:

mp4 = "0.8.2"

Documentation

Development

Requirements

Build

cargo build

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 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