2020-09-15 02:48:00 +00:00
|
|
|
# mp4
|
2020-09-05 20:38:55 +00:00
|
|
|
> MP4 Reader and Writer in Rust 🦀
|
2020-02-04 05:52:23 +00:00
|
|
|
|
2020-09-15 02:48:00 +00:00
|
|
|
`mp4` is a Rust library to read and write ISO-MP4 files. This package contains MPEG-4 specifications defined in parts:
|
2020-09-18 05:01:23 +00:00
|
|
|
* [ISO/IEC 14496-12](https://en.wikipedia.org/wiki/ISO/IEC_base_media_file_format) - ISO Base Media File Format (QuickTime, MPEG-4, etc)
|
2020-09-05 20:38:55 +00:00
|
|
|
* [ISO/IEC 14496-14](https://en.wikipedia.org/wiki/MPEG-4_Part_14) - MP4 file format
|
|
|
|
* ISO/IEC 14496-17 - Streaming text format
|
2020-02-04 05:52:23 +00:00
|
|
|
|
2020-09-15 01:05:34 +00:00
|
|
|
https://crates.io/crates/mp4
|
|
|
|
|
2020-02-04 05:56:55 +00:00
|
|
|
[![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)
|
2020-09-15 02:48:00 +00:00
|
|
|
[![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)
|
2020-07-26 03:07:39 +00:00
|
|
|
|
|
|
|
#### Example
|
|
|
|
```rust
|
2020-08-20 04:38:57 +00:00
|
|
|
use std::fs::File;
|
|
|
|
use std::io::{BufReader};
|
|
|
|
use mp4::{Result};
|
2020-07-26 03:07:39 +00:00
|
|
|
|
2020-08-20 04:38:57 +00:00
|
|
|
fn main() -> Result<()> {
|
2020-09-15 02:48:00 +00:00
|
|
|
let f = File::open("tests/samples/minimal.mp4").unwrap();
|
2020-07-31 17:18:06 +00:00
|
|
|
let size = f.metadata()?.len();
|
|
|
|
let reader = BufReader::new(f);
|
2020-07-26 03:07:39 +00:00
|
|
|
|
2020-08-20 04:38:57 +00:00
|
|
|
let mp4 = mp4::Mp4Reader::read_header(reader, size)?;
|
2020-07-26 03:07:39 +00:00
|
|
|
|
2020-08-20 04:38:57 +00:00
|
|
|
// Print boxes.
|
|
|
|
println!("major brand: {}", mp4.ftyp.major_brand);
|
|
|
|
println!("timescale: {}", mp4.moov.mvhd.timescale);
|
|
|
|
|
|
|
|
// Use available methods.
|
2020-07-31 17:18:06 +00:00
|
|
|
println!("size: {}", mp4.size());
|
2020-08-20 04:38:57 +00:00
|
|
|
|
|
|
|
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(())
|
2020-07-26 03:07:39 +00:00
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2020-08-20 04:38:57 +00:00
|
|
|
See [examples/](examples/) for more examples.
|
2020-07-26 03:07:39 +00:00
|
|
|
|
2020-09-15 01:05:34 +00:00
|
|
|
#### Install
|
|
|
|
Add to your `Cargo.toml`:
|
2020-09-15 02:48:00 +00:00
|
|
|
```toml
|
2022-06-02 04:24:42 +00:00
|
|
|
mp4 = "0.10.1"
|
2020-09-15 01:05:34 +00:00
|
|
|
```
|
|
|
|
|
2020-07-26 03:07:39 +00:00
|
|
|
#### Documentation
|
|
|
|
* https://docs.rs/mp4/
|
2020-01-08 06:53:15 +00:00
|
|
|
|
2020-01-13 03:33:26 +00:00
|
|
|
## Development
|
|
|
|
|
|
|
|
#### Requirements
|
|
|
|
* [Rust](https://www.rust-lang.org/)
|
|
|
|
|
|
|
|
#### Build
|
2020-01-08 06:53:15 +00:00
|
|
|
```
|
|
|
|
cargo build
|
2020-01-13 03:33:26 +00:00
|
|
|
```
|
|
|
|
|
2022-06-01 03:54:29 +00:00
|
|
|
#### Lint and Format
|
|
|
|
```
|
|
|
|
cargo clippy --fix
|
|
|
|
cargo fmt --all
|
|
|
|
```
|
|
|
|
|
2020-01-13 03:33:26 +00:00
|
|
|
#### Run Examples
|
|
|
|
* `mp4info`
|
|
|
|
```
|
|
|
|
cargo run --example mp4info <movie.mp4>
|
2020-01-08 06:53:15 +00:00
|
|
|
```
|
2020-02-04 05:52:23 +00:00
|
|
|
|
2020-09-05 20:38:55 +00:00
|
|
|
* `mp4dump`
|
|
|
|
```
|
|
|
|
cargo run --example mp4dump <movie.mp4>
|
|
|
|
```
|
|
|
|
|
2020-07-26 03:07:39 +00:00
|
|
|
#### Run Tests
|
|
|
|
```
|
|
|
|
cargo test
|
|
|
|
```
|
|
|
|
|
|
|
|
With print statement output.
|
|
|
|
```
|
|
|
|
cargo test -- --nocapture
|
|
|
|
```
|
|
|
|
|
2020-08-27 03:45:18 +00:00
|
|
|
#### Run Benchmark Tests
|
|
|
|
```
|
|
|
|
cargo bench
|
|
|
|
```
|
|
|
|
|
|
|
|
View HTML report at `target/criterion/report/index.html`
|
|
|
|
|
2020-09-15 02:48:00 +00:00
|
|
|
#### Generate Docs
|
|
|
|
```
|
|
|
|
cargo docs
|
|
|
|
```
|
|
|
|
|
|
|
|
View at `target/doc/mp4/index.html`
|
|
|
|
|
2020-09-05 20:38:55 +00:00
|
|
|
## 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.
|
2020-02-04 05:52:23 +00:00
|
|
|
|
2020-09-15 01:05:34 +00:00
|
|
|
## Related Projects
|
2020-09-05 20:43:48 +00:00
|
|
|
* https://github.com/mozilla/mp4parse-rust
|
|
|
|
* https://github.com/pcwalton/rust-media
|
|
|
|
* https://github.com/alfg/mp4
|
|
|
|
|
2020-02-04 05:52:23 +00:00
|
|
|
## License
|
|
|
|
MIT
|
2020-09-15 02:48:00 +00:00
|
|
|
|
|
|
|
[docs]: https://docs.rs/mp4
|
|
|
|
[docs-badge]: https://img.shields.io/badge/docs-online-5023dd.svg?style=flat-square
|