mirror of
https://github.com/rustdesk/rustdesk.git
synced 2024-12-27 06:58:00 +08:00
52 lines
1.3 KiB
Rust
52 lines
1.3 KiB
Rust
extern crate scrap;
|
|
|
|
fn main() {
|
|
use scrap::{Capturer, Display};
|
|
use std::io::ErrorKind::WouldBlock;
|
|
use std::io::Write;
|
|
use std::process::{Command, Stdio};
|
|
|
|
let d = Display::primary().unwrap();
|
|
let (w, h) = (d.width(), d.height());
|
|
|
|
let child = Command::new("ffplay")
|
|
.args(&[
|
|
"-f",
|
|
"rawvideo",
|
|
"-pixel_format",
|
|
"bgr0",
|
|
"-video_size",
|
|
&format!("{}x{}", w, h),
|
|
"-framerate",
|
|
"60",
|
|
"-",
|
|
])
|
|
.stdin(Stdio::piped())
|
|
.spawn()
|
|
.expect("This example requires ffplay.");
|
|
|
|
let mut capturer = Capturer::new(d, false).unwrap();
|
|
let mut out = child.stdin.unwrap();
|
|
|
|
loop {
|
|
match capturer.frame(0) {
|
|
Ok(frame) => {
|
|
// Write the frame, removing end-of-row padding.
|
|
let stride = frame.len() / h;
|
|
let rowlen = 4 * w;
|
|
for row in frame.chunks(stride) {
|
|
let row = &row[..rowlen];
|
|
out.write_all(row).unwrap();
|
|
}
|
|
}
|
|
Err(ref e) if e.kind() == WouldBlock => {
|
|
// Wait for the frame.
|
|
}
|
|
Err(_) => {
|
|
// We're done here.
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|