mp4/
lib.rs

1//! `mp4` is a Rust library to read and write ISO-MP4 files.
2//!
3//! This package contains MPEG-4 specifications defined in parts:
4//!    * ISO/IEC 14496-12 - ISO Base Media File Format (QuickTime, MPEG-4, etc)
5//!    * ISO/IEC 14496-14 - MP4 file format
6//!    * ISO/IEC 14496-17 - Streaming text format
7//!
8//! See: [mp4box] for supported MP4 atoms.
9//!
10//! ### Example
11//!
12//! ```
13//! use std::fs::File;
14//! use std::io::{BufReader};
15//! use mp4::{Result};
16//!
17//! fn main() -> Result<()> {
18//!     let f = File::open("tests/samples/minimal.mp4").unwrap();
19//!     let size = f.metadata()?.len();
20//!     let reader = BufReader::new(f);
21//!
22//!     let mp4 = mp4::Mp4Reader::read_header(reader, size)?;
23//!
24//!     // Print boxes.
25//!     println!("major brand: {}", mp4.ftyp.major_brand);
26//!     println!("timescale: {}", mp4.moov.mvhd.timescale);
27//!
28//!     // Use available methods.
29//!     println!("size: {}", mp4.size());
30//!
31//!     let mut compatible_brands = String::new();
32//!     for brand in mp4.compatible_brands().iter() {
33//!         compatible_brands.push_str(&brand.to_string());
34//!         compatible_brands.push_str(",");
35//!     }
36//!     println!("compatible brands: {}", compatible_brands);
37//!     println!("duration: {:?}", mp4.duration());
38//!
39//!    // Track info.
40//!    for track in mp4.tracks().values() {
41//!        println!(
42//!            "track: #{}({}) {} : {}",
43//!            track.track_id(),
44//!            track.language(),
45//!            track.track_type()?,
46//!            track.box_type()?,
47//!        );
48//!    }
49//!    Ok(())
50//! }
51//! ```
52//!
53//! See [examples] for more examples.
54//!
55//! # Installation
56//!
57//! Add the following to your `Cargo.toml` file:
58//!
59//! ```toml
60//! [dependencies]
61//! mp4 = "0.7.0"
62//! ```
63//!
64//! [mp4box]: https://github.com/alfg/mp4-rust/blob/master/src/mp4box/mod.rs
65//! [examples]: https://github.com/alfg/mp4-rust/tree/master/examples
66#![doc(html_root_url = "https://docs.rs/mp4/*")]
67
68use std::fs::File;
69use std::io::BufReader;
70
71mod error;
72pub use error::Error;
73
74pub type Result<T> = std::result::Result<T, Error>;
75
76mod types;
77pub use types::*;
78
79mod mp4box;
80pub use mp4box::*;
81
82mod track;
83pub use track::{Mp4Track, TrackConfig};
84
85mod reader;
86pub use reader::Mp4Reader;
87
88mod writer;
89pub use writer::{Mp4Config, Mp4Writer};
90
91pub fn read_mp4(f: File) -> Result<Mp4Reader<BufReader<File>>> {
92    let size = f.metadata()?.len();
93    let reader = BufReader::new(f);
94    let mp4 = reader::Mp4Reader::read_header(reader, size)?;
95    Ok(mp4)
96}