Files
scottokeebs/Extras/ScottoScripts/OLED Video/extract_frames.py
T
2026-01-15 15:52:37 -05:00

67 lines
1.6 KiB
Python

#!/usr/bin/env python3
import argparse
import os
import subprocess
# Arguments
parser = argparse.ArgumentParser(description="Extract frames from video for QMK OLED")
parser.add_argument("input", help="Path to input video file")
parser.add_argument(
"--fps", type=float, default=15, help="Frames per second (default: 15)"
)
parser.add_argument(
"--width", type=int, default=128, help="Output frame width (default: 128)"
)
parser.add_argument(
"--height", type=int, default=64, help="Output frame height (default: 64)"
)
parser.add_argument(
"--frames",
type=int,
default=120,
help="Number of frames to extract (default: 120)",
)
parser.add_argument(
"--format",
default="gray",
choices=["gray", "rgb24", "monow"],
help="Output pixel format (default: gray)",
)
parser.add_argument(
"--speed",
type=float,
default=1.0,
help="Playback speed, maps to setpts (default: 1.0)",
)
args = parser.parse_args()
# Create output directory
os.makedirs("frames", exist_ok=True)
# Create ffmpeg command
output_pattern = os.path.join(args.output, "out_%03d.png")
# setpts expression: PTS = 1/speed * PTS
setpts_expr = f"setpts={1/args.speed}*PTS"
ffmpeg_cmd = [
"ffmpeg",
"-i",
args.input,
"-filter:v",
f"{setpts_expr},fps={args.fps},scale={args.width}:{args.height},format={args.format}",
"-frames:v",
str(args.frames),
output_pattern,
]
# Print command for debugging
print("Running command:\n", " ".join(ffmpeg_cmd))
# Run command
subprocess.run(ffmpeg_cmd, check=True)
print(f"Frames exported to {args.output}")