A Rust library for high-quality screen recordings that leverages native OS APIs for optimal performance: Apple's ScreenCaptureKit on macOS, Graphics.Capture APIs on Windows and Pipewire on Linux.
🚧 WIP. Unsuitable for production use, APIs are being iterated on.
- Cross-platform support: Windows, Mac and Linux!
- Check for support and user permissions.
- Utilize native OS APIs for screen capture.
- Different capture modes: Display or Windows.
We found most of Rust's tooling around screen capture either non-performant, outdated or very platform-specific. This project is our attempt to change that. Contributions, PRs and Issues are most welcome!
If you'd like to develop, here's a kickstart guide:
- Clone the repo and run it with
cargo run
. - Explore the API and library code in lib.rs.
- Platform-specific code is in the
win
,mac
andlinux
modules. - There's a small program in main.rs that "consumes" the library for dev-testing.
use scap::{
capturer::{CGPoint, CGRect, CGSize, Capturer, Options},
frame::Frame,
};
fn main() {
// Check if the platform is supported
let supported = scap::is_supported();
if !supported {
println!("❌ Platform not supported");
return;
} else {
println!("✅ Platform supported");
}
// Check if we have permission to capture screen
// If we don't, request it.
if !scap::has_permission() {
println!("❌ Permission not granted. Requesting permission...");
if !scap::request_permission() {
println!("❌ Permission denied");
return;
}
}
println!("✅ Permission granted");
// Get recording targets (WIP)
let targets = scap::get_targets();
println!("🎯 Targets: {:?}", targets);
// Create Options
let options = Options {
fps: 60,
targets,
show_cursor: true,
show_highlight: true,
excluded_targets: None,
output_type: scap::frame::FrameType::BGRAFrame,
output_resolution: scap::capturer::Resolution::_720p,
source_rect: Some(CGRect {
origin: CGPoint { x: 0.0, y: 0.0 },
size: CGSize {
width: 2000.0,
height: 1000.0,
},
}),
..Default::default()
};
// Create Recorder
let mut capturer = Capturer::new(options);
// Start Capture
capturer.start_capture();
let mut input = String::new();
std::io::stdin().read_line(&mut input).unwrap();
// Stop Capture
capturer.stop_capture();
}
The code in this repository is open-sourced under the MIT license. However, it may rely on dependencies that are licensed differently. Please consult their documentations for exact terms.
Pranav Joglekar 💻 |
Rohan Punjani 💻 |
Siddharth 💻 |
NiiightmareXD 💻 |
MAlba124 💻 |
Anubhav Singhal 💻 |
This project builds on top of the fabulous work done by @svtlabs and @NiiightmareXD.
- screencapturekit-rs: Rust bindings for Apple's ScreencaptureKit API.
- windows-capture: Rust library for Windows.Graphics.Capture.