mp4forge 0.8.0

Rust library and CLI for inspecting, probing, extracting, muxing, and rewriting MP4 structures
Documentation
use std::env;
use std::error::Error;
use std::fs::File;

use mp4forge::FourCc;
use mp4forge::extract::{extract_box_bytes, extract_box_payload_bytes};
use mp4forge::walk::BoxPath;

fn main() {
    if let Err(error) = run() {
        eprintln!("{error}");
        std::process::exit(1);
    }
}

fn run() -> Result<(), Box<dyn Error>> {
    let Some(input_path) = env::args().nth(1) else {
        return Err("usage: cargo run --example extract_mdhd_bytes -- <input.mp4>".into());
    };

    let box_path = BoxPath::from([
        FourCc::from_bytes(*b"moov"),
        FourCc::from_bytes(*b"trak"),
        FourCc::from_bytes(*b"mdia"),
        FourCc::from_bytes(*b"mdhd"),
    ]);

    let mut file = File::open(input_path)?;
    let boxes = extract_box_bytes(&mut file, None, box_path.clone())?;
    let payloads = extract_box_payload_bytes(&mut file, None, box_path)?;

    for (index, (box_bytes, payload_bytes)) in boxes.iter().zip(payloads.iter()).enumerate() {
        println!(
            "match {index}: total_bytes={} payload_bytes={}",
            box_bytes.len(),
            payload_bytes.len()
        );
    }

    Ok(())
}