scap 0.0.5

Modern, high-performance screen capture library for Rust. Cross-platform.
docs.rs failed to build scap-0.0.5
Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.

Github banner

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.

Discord


features

  1. Cross-platform support: Windows, Mac and Linux!
  2. Check for support and user permissions.
  3. Utilize native OS APIs for screen capture.
  4. Different capture modes: Display or Windows.

contributing

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:

  1. Clone the repo and run it with cargo run.
  2. Explore the API and library code in lib.rs.
  3. Platform-specific code is in the win, mac and linux modules.
  4. There's a small program in main.rs that "consumes" the library for dev-testing.

usage

use scap::{
    capturer::{Point, Area, Size, 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(Area {
            origin: Point { x: 0.0, y: 0.0 },
            size: Size {
                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();
}

license

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.

Contributors

credits

This project builds on top of the fabulous work done by @svtlabs and @NiiightmareXD.