mp4forge 0.8.0

Rust library and CLI for inspecting, probing, extracting, muxing, and rewriting MP4 structures
Documentation
#[cfg(feature = "mux")]
fn main() {
    use std::io::Cursor;

    use mp4forge::mux::sample_reader::PlannedSampleReader;
    use mp4forge::mux::{
        MuxInterleavePolicy, MuxStagedMediaItem, MuxTrackConfig, plan_staged_media_items,
    };

    let plan = plan_staged_media_items(
        vec![MuxStagedMediaItem::new(0, 7, 0, 1_000, 4, 4).with_sync_sample(true)],
        MuxInterleavePolicy::DecodeTime,
    )
    .unwrap();
    let track_configs = [MuxTrackConfig::new_text(7, 1_000, 0, 0, Vec::new())
        .with_language(*b"eng")
        .with_handler_name("CaptionTrack")];
    let mut sources = [Cursor::new(b"HEADwvttTAIL".to_vec())];
    let mut reader =
        PlannedSampleReader::new_with_track_configs(&mut sources, &plan, &track_configs);
    let mut sample_bytes = Vec::new();

    while let Some(metadata) = reader.next_sample_into(&mut sample_bytes).unwrap() {
        let track = metadata.track().unwrap();
        println!(
            "track {} {:?} {} at output {} -> {} bytes",
            metadata.track_id(),
            track.kind(),
            std::str::from_utf8(&track.language()).unwrap(),
            metadata.output_offset(),
            sample_bytes.len()
        );
    }
}

#[cfg(not(feature = "mux"))]
fn main() {
    eprintln!("enable the `mux` feature to run this example");
}