mp4forge 0.2.0

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

use mp4forge::FourCc;
use mp4forge::boxes::iso14496_12::Tkhd;
use mp4forge::extract::extract_box_with_payload;
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(path) = env::args().nth(1) else {
        return Err("usage: cargo run --example extract_track_ids -- <input.mp4>".into());
    };

    let mut file = File::open(path)?;
    let boxes = extract_box_with_payload(
        &mut file,
        None,
        BoxPath::from([
            FourCc::from_bytes(*b"moov"),
            FourCc::from_bytes(*b"trak"),
            FourCc::from_bytes(*b"tkhd"),
        ]),
    )?;

    for entry in boxes {
        let Some(tkhd) = entry.payload.as_any().downcast_ref::<Tkhd>() else {
            return Err("expected tkhd payload".into());
        };
        println!("track ID: {}", tkhd.track_id);
    }

    Ok(())
}