A Rust-based command-line application for extracting frames from video files using FFmpeg, supporting both sequential and parallel processing modes.
- Features
- Usage
- Command Line Arguments
- Requirements
- Development
- Building and Testing
- Contributing
- Troubleshooting
- Support for parallel processing using multiple CPU cores
- Optional output image resizing
- PNG compression and JPEG quality controls
- Robust error handling for file operations and FFmpeg interactions
- Comprehensive test suite for core functionality
The application provides several command-line options to control frame extraction.
To extract frames from a video file using default settings (every 30th frame):
cargo run -- --file input.mp4The extracted frames will be saved as PNG files in the frames directory.
To resize extracted frames to 640 pixels wide while preserving aspect ratio:
cargo run -- --file input.mp4 --output-width 640To write JPEG frames with a smaller file size:
cargo run -- --file input.mp4 --output-format jpeg --jpeg-quality 75To use stronger PNG compression:
cargo run -- --file input.mp4 --png-compression bestPNG compression is optimized losslessly with oxipng.
To extract one frame per second using the seek-based method:
cargo run -- --file input.mp4 --use-seekTo enable parallel processing by splitting the video into segments and processing them concurrently:
cargo run -- --file input.mp4 --multicore--file <PATH>: Specify input video file (default: "video.mp4")--use-seek: Enable seek-based frame extraction (one frame per second)--multicore: Enable parallel processing using multiple CPU cores--frames-between <N>: Number of frames to skip between extracted frames (default: 30)--output-width <PIXELS>: Resize output images to this width--output-height <PIXELS>: Resize output images to this height--output-format <png|jpeg>: Output image format (default:png)--jpeg-quality <1-100>: JPEG quality when writing JPEGs (default: 90)--png-compression <fast|default|best>: PNG compression level (default:default)
- FFmpeg installed and available in system PATH
- Rust toolchain (including cargo)
To contribute to this project, you'll need:
- Rust toolchain (nightly version recommended)
just init-macosorjust init-linux
- Clone the repository
- Run
just buildto compile the application - Run
just testto execute the test suite - Run
cargo run -- --helpto see command-line options
You need to install these packages:
sudo apt install libavcodec-dev libavformat-dev libswscale-dev libavfilter-dev libavdevice-dev libavutil-dev yasmContributions are welcome! Please submit pull requests with clear descriptions of changes and ensure that all tests pass before submitting.
- If you encounter issues with FFmpeg, ensure it's installed and available in your system's PATH.
- If you experience errors during parallel processing, verify that your system has sufficient resources (CPU cores and memory).
- For other issues, please check the issues page or submit a new issue with detailed information about your problem.