Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/alfg/mp4-rust
MP4 reader + writer library in Rust! 🎥🦀
https://github.com/alfg/mp4-rust
isobmff mp4 qt reader rust video writer
Last synced: 2 days ago
JSON representation
MP4 reader + writer library in Rust! 🎥🦀
- Host: GitHub
- URL: https://github.com/alfg/mp4-rust
- Owner: alfg
- License: mit
- Created: 2020-01-08T05:32:00.000Z (about 5 years ago)
- Default Branch: master
- Last Pushed: 2024-06-15T05:18:14.000Z (8 months ago)
- Last Synced: 2025-01-30T08:09:35.458Z (9 days ago)
- Topics: isobmff, mp4, qt, reader, rust, video, writer
- Language: Rust
- Homepage: https://crates.io/crates/mp4
- Size: 506 KB
- Stars: 304
- Watchers: 8
- Forks: 85
- Open Issues: 34
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# 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:
* [ISO/IEC 14496-12](https://en.wikipedia.org/wiki/ISO/IEC_base_media_file_format) - ISO Base Media File Format (QuickTime, MPEG-4, etc)
* [ISO/IEC 14496-14](https://en.wikipedia.org/wiki/MPEG-4_Part_14) - MP4 file format
* ISO/IEC 14496-17 - Streaming text formathttps://crates.io/crates/mp4
[![Crates.io](https://img.shields.io/crates/v/mp4)](https://crates.io/crates/mp4)
[![Crates.io](https://img.shields.io/crates/d/mp4)](https://crates.io/crates/mp4)
[![Docs](https://img.shields.io/badge/docs-online-5023dd.svg?style=flat-square)](https://docs.rs/mp4)
[![Rust](https://github.com/alfg/mp4-rust/workflows/Rust/badge.svg)](https://github.com/alfg/mp4-rust/actions)#### Example
```rust
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/](examples/) for more examples.
#### Install
```
cargo add mp4
```
or add to your `Cargo.toml`:
```toml
mp4 = "0.14.0"
```#### Documentation
* https://docs.rs/mp4/## Development
#### Requirements
* [Rust](https://www.rust-lang.org/)#### Build
```
cargo build
```#### Lint and Format
```
cargo clippy --fix
cargo fmt --all
```#### Run Examples
* `mp4info`
```
cargo run --example mp4info
```* `mp4dump`
```
cargo run --example mp4dump
```#### 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](https://github.com/alfg/mp4-inspector) project as a reference for using this library in Javascript via Web Assembly.## Related Projects
* https://github.com/mozilla/mp4parse-rust
* https://github.com/pcwalton/rust-media
* https://github.com/alfg/mp4## License
MIT[docs]: https://docs.rs/mp4
[docs-badge]: https://img.shields.io/badge/docs-online-5023dd.svg?style=flat-square