Automate Video Frame to MPEG Conversion with FFmpeg
Overview
FFmpeg is a command-line tool that can convert image sequences (individual video frames) into MPEG-formatted video files (e.g., MPEG-1, MPEG-2, MPEG-4 / MP4 with MPEG codecs). Automation uses shell scripts, batch files, or simple programs to process many sequences or apply consistent settings.
Basic command
Convert a sequence of JPEG frames named frame001.jpg, frame002.jpg, … into an MPEG-4 file:
Code
ffmpeg -framerate 30 -i frame%03d.jpg -c:v libx264 -pix_fmt yuv420p output.mp4
- -framerate 30: input frame rate (frames per second).
- -i frame%03d.jpg: input pattern with zero-padded numbers.
- -c:v libx264: use H.264 encoder (widely compatible).
- -pixfmt yuv420p: ensures broad player compatibility.
For true MPEG-1 or MPEG-2:
Code
ffmpeg -framerate 30 -i frame%03d.png -c:v mpeg1video -qscale:v 2 output.mpg ffmpeg -framerate 25 -i frame%03d.png -c:v mpeg2video -qscale:v 2 output.mpg
Common options and how to use them
- Input pattern variations: frame_%04d.png for four digits; use image2pipe for stdin streaming.
- Variable frame rates / timestamps: use -r after -i to set output framerate separately.
- Quality control: -qscale:v N (lower is better for MPEG-⁄2), or -crf N for libx264 (18–23 typical).
- Bitrate control: -b:v 2M sets target bitrate.
- Audio: add -f lavfi -i anullsrc -shortest to add silent audio if needed for players expecting audio.
- Scaling/cropping: -vf “scale=1280:720” or combined filters: -vf “crop=…,scale=…”
- Pixel format conversion: -pixfmt yuv420p for compatibility.
Automation examples
- Bash loop to process multiple folders:
Code
for d in sequences//; do ffmpeg -framerate 30 -i “\(d"frame%03d.png -c:v libx264 -crf 20 -pix_fmt yuv420p "\){d%/}.mp4” done
- Windows batch (cmd):
Code
for /d %%D in (sequences) do ( ffmpeg -framerate 30 -i “%%Drame%%03d.png” -c:v libx264 -crf 20 -pixfmt yuv420p “%%~nD.mp4” )
- Python script using subprocess for finer control, logging, and retries.
Performance and reliability tips
- Use -threads N to limit cores if running many jobs.
- Use CRF + preset (e.g., -preset veryfast) for speed/quality tradeoffs.
- Generate a small test clip first to validate settings:
Code
ffmpeg -framerate 30 -start_number 1 -i frame%03d.jpg -frames:v 150 -c:v libx264 test.mp4
- When input filenames are non-sequential, create a text file list and use ffmpeg -f concat -safe 0 -i list.txt -c:v libx264 output.mp4.
Troubleshooting
- “Could not find codec parameters”: check input pattern and start number (-start_number).
- Incorrect order: ensure filenames sort numerically (zero-padded).
- Color issues: add -pix_fmt yuv420p or use -colorspace/ -color_primaries if needed.
Recommended presets for common goals
- Fast conversion, reasonable quality:
-c:v libx264 -crf 23 -preset fast -pix_fmt yuv420p - High quality:
-c:v libx264 -crf 18 -preset slow -pix_fmt yuv420p - Small size (MPEG-⁄2):
-c:v mpeg1video -qscale:v 3
If you want, I can generate a ready-to-run script tailored to your filenames, target MPEG format, framerate, and platform.
Leave a Reply