Skip to main content

screen_capture

PyPI version License: gpl-3.0

A Python module for efficient screen capture and stripe-based JPEG encoding, designed for performance and flexibility.

This module provides a Python interface to a high-performance screen capture library. It captures screen regions and encodes them into JPEG stripes, delivering them via a callback mechanism. This stripe-based approach can be beneficial for streaming or processing screen capture data efficiently.

Installation

Due to its reliance on a native module, installation is slightly different from typical Python packages.

  1. Prerequisites: Ensure you have CMake, x11 dev files, xxhash dev files, libext dev files, and libjpeg-turbo dev files installed on your system.

  2. Install via pip:

    sudo apt-get update && \
    sudo apt-get install -y \
      cmake \
      g++ \
      gcc \
      libjpeg62-turbo-dev \
      libx11-dev \
      libxext-dev \
      libxxhash-dev \
      make \
      python3-dev
    
    pip install screen_capture
    

    This command will:

    • Build the native screen_capture_module.so library using CMake during the installation process.
    • Install the Python wrapper and the compiled shared library.

Note: This package is currently designed and tested for Linux environments as indicated in the setup.py classifiers.

Usage

Basic Capture

Here's a basic example of how to use the screen_capture module to start capturing the screen and process the encoded JPEG stripes.

import ctypes
from screen_capture import CaptureSettings, ScreenCapture

def my_stripe_callback(result_ptr, user_data):
    """Callback function to process encoded JPEG stripes."""
    result = result_ptr.contents
    if result.data:
        data_bytes = ctypes.cast(
            result.data, ctypes.POINTER(ctypes.c_ubyte * result.size)
        ).contents
        jpeg_stripe_data = bytes(data_bytes)
        # Process the jpeg_stripe_data here (e.g., save to file, stream, etc.)
        print(f"Received JPEG stripe: y_start={result.stripe_y_start}, height={result.stripe_height}, size={result.size} bytes")
    else:
        print("Callback received empty stripe data.")

# Configure capture settings
capture_settings = CaptureSettings()
capture_settings.capture_width = 1920  # Example: Capture width
capture_settings.capture_height = 1080 # Example: Capture height
capture_settings.capture_x = 0        # Capture from top-left corner
capture_settings.capture_y = 0
capture_settings.target_fps = 30.0
capture_settings.jpeg_quality = 75

# Instantiate the ScreenCapture module
module = ScreenCapture()

try:
    module.start_capture(capture_settings, my_stripe_callback)
    input("Press Enter to stop capture...") # Keep capture running until Enter is pressed
finally:
    module.stop_capture()
    print("Capture stopped.")

Capture Settings

The CaptureSettings class allows you to configure various parameters for screen capture:

class CaptureSettings(ctypes.Structure):
    _fields_ = [
        ("capture_width", ctypes.c_int),          # Width of the capture region
        ("capture_height", ctypes.c_int),         # Height of the capture region
        ("capture_x", ctypes.c_int),              # X coordinate of the top-left corner of the capture region
        ("capture_y", ctypes.c_int),              # Y coordinate of the top-left corner of the capture region
        ("target_fps", ctypes.c_double),          # Target frames per second
        ("jpeg_quality", ctypes.c_int),           # JPEG quality for standard encoding (0-100)
        ("paint_over_jpeg_quality", ctypes.c_int), # JPEG quality when "paint-over" detection triggers (0-100)
        ("use_paint_over_quality", ctypes.c_bool), # Enable/disable paint-over quality adjustment
        ("paint_over_trigger_frames", ctypes.c_int),# Number of frames to trigger paint-over quality
        ("damage_block_threshold", ctypes.c_int),   # Threshold for damage detection (motion detection)
        ("damage_block_duration", ctypes.c_int),    # Duration to consider damage blocks for paint-over
    ]

Adjust these settings to fine-tune capture performance and quality based on your needs.

Stripe Callback

The start_capture function requires a callback function of type StripeCallback. This callback is invoked by the native module whenever a JPEG encoded stripe is ready.

StripeCallback = ctypes.CFUNCTYPE(
    None, ctypes.POINTER(StripeEncodeResult), ctypes.c_void_p
)

Your Python callback function should accept two arguments:

  • result_ptr: A ctypes pointer to a StripeEncodeResult structure containing the encoded JPEG stripe data and metadata.
  • user_data: Currently unused in the start_capture signature (set to None in the example).

Inside the callback, you are responsible for processing the StripeEncodeResult data. Crucially, you do not need to manually free the memory of result.data as the Python wrapper handles this by calling free_stripe_encode_result_data after your callback returns.

Features

  • Efficient Screen Capture: Leverages a native module for optimized screen capture performance.
  • Stripe-Based JPEG Encoding: Encodes captured frames into horizontal stripes based on system core count. The end result being minimal system load at high framerates.
  • Configurable Capture Region: Specify the exact region of the screen to capture.
  • Adjustable FPS and JPEG Quality: Control the capture frame rate and JPEG compression level.
  • Paint-Over Detection and Quality Adjustment: Dynamically adjusts JPEG quality based on screen content changes for optimized bandwidth usage.
  • Direct Callback Mechanism: Provides captured data directly to your Python code via a callback function for real-time processing.

Example

For a more complete example of using screen_capture for streaming over WebSockets, please refer to the examples directory. This example demonstrates:

  • Setting up a WebSocket server.
  • Using the screen_capture module to capture screen and encode JPEG stripes.
  • Sending the JPEG stripes to connected WebSocket clients for real-time streaming.
  • Serving a basic HTML page to view the stream.

Once the module is installed it can be run with:

cd example
python3 screen_to_browser.py

Then land on http://localhost:9001

License

This project is licensed under the MIT License.

Metadata

Release files for x11-screen-capture 0.1.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for x11-screen-capture 0.1.2
File Size Uploaded
x11_screen_capture-0.1.2.tar.gz 88.7 kB Details

Release files / x11_screen_capture-0.1.2.tar.gz

Download URL x11_screen_capture-0.1.2.tar.gz
Size 88.7 kB
Tags Source
SHA-256 checksum
How to use checksums
b82eb7b534c98e51feadce1b79f09cd536a3bba2385f3690438e9a13294a532e
BLAKE2b-256 checksum
How to use checksums
639d317baa6d1e6a30430c9fb991c5bf747a39b77a9f9eac5f23c16f070ad8b8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.11.2

Release history Release notifications | RSS feed

This release

0.1.2 This release

1 release file

0.1.1

1 release file

0.1.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page