use std::error::Error;
use std::time::Duration;
use unbundle::{FrameRange, MediaFile};
fn main() -> Result<(), Box<dyn Error>> {
let input_path = std::env::args()
.nth(1)
.unwrap_or_else(|| "input.mp4".to_string());
println!("Opening {input_path}...");
let mut unbundler = MediaFile::open(&input_path)?;
let metadata = unbundler.metadata();
if let Some(video_metadata) = &metadata.video {
println!(
"Video: {}x{}, {:.2} fps, {} frames",
video_metadata.width,
video_metadata.height,
video_metadata.frames_per_second,
video_metadata.frame_count,
);
}
println!("Extracting first frame...");
let frame = unbundler.video().frame(0)?;
frame.save("frame_first.png")?;
println!("Saved frame_first.png");
println!("Extracting frame at 5 seconds...");
let frame = unbundler.video().frame_at(Duration::from_secs(5))?;
frame.save("frame_5s.png")?;
println!("Saved frame_5s.png");
println!("Extracting every 30th frame...");
let frames = unbundler.video().frames(FrameRange::Interval(30))?;
for (index, frame) in frames.iter().enumerate() {
let filename = format!("frame_interval_{index}.png");
frame.save(&filename)?;
}
println!("Saved {} interval frames", frames.len());
println!("Extracting specific frames [0, 50, 100]...");
let frames = unbundler
.video()
.frames(FrameRange::Specific(vec![0, 50, 100]))?;
for (index, frame) in frames.iter().enumerate() {
let filename = format!("frame_specific_{index}.png");
frame.save(&filename)?;
}
println!("Saved {} specific frames", frames.len());
println!("Done!");
Ok(())
}