跳转到主要内容

Crate windows_capture

搜索

Crate windows_capture 

源码
展开描述

§Windows 截图 Rust 库

Windows Capture 是一个高效的 Rust 和 Python 库,可让您使用 Graphics Capture API 轻松地捕获屏幕。该库让您能够轻松地捕获基于 Windows 的计算机屏幕,并将其用于各种用途, 例如制作教学视频、截图或录制游戏过程。凭借其直观的界面和强大的功能,Windows Capture 是任何寻求可靠且易用的屏幕捕获解决方案的人的绝佳选择。

§特性

  • 仅在需要时更新帧
  • 高性能
  • 易于使用
  • 使用最新的 Windows Graphics Capture API
  • 支持 DXGI Desktop Duplication API
  • 经过增强的、硬件加速的视频编码器,具有稳定的音频时序

§安装

将此库添加到您的 Cargo.toml

[dependencies]
windows-capture = "2.0.0"

或运行以下命令:

cargo add windows-capture

§用法

use std::io::{self, Write};
use std::time::Instant;

use windows_capture::capture::{Context, GraphicsCaptureApiHandler};
use windows_capture::encoder::{
    AudioSettingsBuilder, ContainerSettingsBuilder, VideoEncoder, VideoSettingsBuilder,
};
use windows_capture::frame::Frame;
use windows_capture::graphics_capture_api::InternalCaptureControl;
use windows_capture::graphics_capture_picker::GraphicsCapturePicker;
use windows_capture::settings::{
    ColorFormat, CursorCaptureSettings, DirtyRegionSettings, DrawBorderSettings,
    MinimumUpdateIntervalSettings, SecondaryWindowSettings, Settings,
};

// 处理捕获事件。
struct Capture {
    // 用于编码帧的视频编码器。
    encoder: Option<VideoEncoder>,
    // 用于测量捕获已运行的时间
    start: Instant,
}

impl GraphicsCaptureApiHandler for Capture {
    // 用于从设置中获取值的类型标志,此处为宽度和高度。
    type Flags = (i32, i32);

    // `CaptureControl` 和 `start` 函数可能返回的错误类型。
    type Error = Box<dyn std::error::Error + Send + Sync>;

    // 创建新实例时调用的函数。标志可以从设置中传递。
    fn new(ctx: Context<Self::Flags>) -> Result<Self, Self::Error> {
        // 如果我们不想从设置中获取尺寸,可以在 on_frame_arrived 函数中使用
        // frame.width() 和 frame.height(),但需要在其中创建编码器。
        let encoder = VideoEncoder::new(
            VideoSettingsBuilder::new(ctx.flags.0 as u32, ctx.flags.1 as u32),
            AudioSettingsBuilder::default().disabled(true),
            ContainerSettingsBuilder::default(),
            "video.mp4",
        )?;

        Ok(Self { encoder: Some(encoder), start: Instant::now() })
    }

    // 每当有新帧可用时被调用。
    fn on_frame_arrived(
        &mut self,
        frame: &mut Frame,
        capture_control: InternalCaptureControl,
    ) -> Result<(), Self::Error> {
        print!("\r录制时长: {} 秒", self.start.elapsed().as_secs());
        io::stdout().flush()?;

        // 将帧发送到视频编码器
        self.encoder.as_mut().unwrap().send_frame(frame)?;

        // 该帧还有其他用途,例如,您可以按如下方式将单帧保存到文件:
        // frame.save_as_image("frame.png", ImageFormat::Png)?;
        // 或者按如下方式获取原始数据以便完全控制:let data = frame.buffer()?;

        // 6 秒后停止捕获
    if self.start.elapsed().as_secs() >= 6 {
            // 完成编码器并保存视频。
            self.encoder.take().unwrap().finish()?;

            capture_control.stop();

            // 因为之前的 print 没有包含换行符。
            println!();
        }

        Ok(())
    }

    // 当捕获项(通常是窗口)关闭时调用的可选处理函数。
    fn on_closed(&mut self) -> Result<(), Self::Error> {
        println!("捕获会话已结束");

        Ok(())
    }
}

// 打开一个对话框以选择要捕获的窗口或屏幕;其他捕获项请参考文档。
let item = GraphicsCapturePicker::pick_item().expect("选择项目失败");

// 如果用户取消了选择,则退出。
let Some(item) = item else {
    println!("未选择任何项目");
    return;
};

// 获取项目的大小以传递给设置。
let size = item.size().expect("获取项目大小失败");

let settings = Settings::new(
    // 要捕获的项目
    item,
    // 捕获光标设置
    CursorCaptureSettings::Default,
    // 绘制边框设置
    DrawBorderSettings::Default,
    // 次级窗口设置,如果要将次级窗口包含在捕获中
    SecondaryWindowSettings::Default,
    // 最小更新间隔,如果要更改帧率限制(默认为 60 FPS 或 16.67 毫秒)
    MinimumUpdateIntervalSettings::Default,
    // 脏区域设置
    DirtyRegionSettings::Default,
    // 捕获帧所需的颜色格式。
    ColorFormat::Rgba8,
    // 将传递给用户定义的 `new` 函数的捕获设置的附加标志。
    size,
);

// 启动捕获并接管当前线程。
// 处理函数 trait 中的错误将出现在这里。
Capture::start(settings).expect("屏幕捕获失败");

模块§

capture
包含主要的捕获功能,包括 crate::capture::GraphicsCaptureApiHandler trait 和相关类型。
d3d11
Direct3D 11 相关功能的内部模块。
dxgi_duplication_api
包含与 DXGI Desktop Duplication API 相关的类型和函数。 DXGI Desktop Duplication API 封装层。
encoder
包含用于编码捕获帧的编码器功能,包括 crate::encoder::VideoEncoder
frame
包含 crate::frame::Frame 结构体以及用于表示捕获帧的相关类型。
graphics_capture_api
包含与 Graphics Capture API 相关的类型和函数。
graphics_capture_picker
包含用于显示选择器以选择要捕获的窗口或屏幕的功能: crate::graphics_capture_picker::GraphicsCapturePicker
monitor
包含用于处理显示器和屏幕信息的功能: crate::monitor::Monitor。 用于查询和操作显示显示器的实用工具。
settings
包含 crate::settings::Settings 结构体以及用于配置捕获设置的相关类型。
window
包含用于处理窗口和捕获特定窗口的功能: crate::window::Window。 用于查询和操作顶级窗口的实用工具。

结构体§

GraphicsCaptureItem
为 trait 约束而导出