展开描述
§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::GraphicsCaptureApiHandlertrait 和相关类型。 - 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。 用于查询和操作顶级窗口的实用工具。
结构体§
- Graphics
Capture Item - 为 trait 约束而导出