mp4e 1.0.3

A simple MP4 muxer library for pure Rust.
# mp4e

A simple MP4 muxer library for pure Rust.

## Introduction

`mp4e` is a simple MP4 muxing library that allows you to create standard MP4 files and fragmented MP4 (fMP4) files. It supports both H.264/AVC and H.265/HEVC video codecs as well as AAC and Opus audio codecs.

## Implementation Reference

This library's implementation is partially inspired by [minimp4](https://github.com/lieff/minimp4).

## License

This project is licensed under the MIT License.

## Usage Examples

Add this to your Cargo.toml:

```toml
[dependencies]
mp4e = "1.0"
```

### Creating a Standard MP4 File

```rust
use std::fs::File;
use std::io::BufWriter;
use mp4e::{Mp4e, Codec};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Create output file
    let file = File::create("output.mp4")?;
    let mut writer = BufWriter::new(file);
    
    // Create MP4 muxer
    let mut muxer = Mp4e::new(&mut writer);
    
    // Set up video track (H.264, 1920x1080)
    muxer.set_video_track(1920, 1080, Codec::AVC);
    
    // Set up audio track (AAC, 48kHz, stereo)
    muxer.set_audio_track(48000, 2, Codec::AACLC);
    
    // Write video frame data (assuming you have encoded NALU data)
    let video_frame_data = vec![/* your video frame data */];
    muxer.encode_video(&video_frame_data, 33)?; // 33ms per frame (~30fps) or encode_video_with_pts
    
    // Write audio frame data
    let audio_frame_data = vec![/* your audio frame data */];
    muxer.encode_audio(&audio_frame_data, 1024)?; // 1024 samples 
    
    // Finish writing
    muxer.flush()?;
    
    Ok(())
}
```

### Creating a Fragmented MP4 File (fMP4)

```rust
use std::fs::File;
use std::io::BufWriter;
use mp4e::{Mp4e, Codec};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Create output file
    let file = File::create("output.m4s")?;
    let mut writer = BufWriter::new(file);
    
    // Create fragmented MP4 muxer
    let mut muxer = Mp4e::new_with_fragment(&mut writer);
    
    // Set up video track
    muxer.set_video_track(1920, 1080, Codec::HEVC);
    
    // Set up audio track
    muxer.set_audio_track(48000, 2, Codec::AACLC);
    
    // Write media data
    let video_data = vec![/* video data */];
    muxer.encode_video(&video_data, 33)?;
    
    let audio_data = vec![/* audio data */];
    muxer.encode_audio(&audio_data, 1024)?;
    
    // Finish writing
    muxer.flush()?;
    
    Ok(())
}
```

## Supported Codecs

### Video Codecs
- H.264/AVC
- H.265/HEVC



### Audio Codecs
- AAC-LC
- AAC-Main
- AAC-SSR
- AAC-LTP
- HE-AAC
- HE-AAC-v2
- Opus


## Limitations

The current version of mp4e only supports the following track configuration:
- Up to 1 video track
- Up to 1 audio track (optional)
- Only supports audio data with original sample bits of 16 (PCM 16-bit)