mirror of
https://github.com/rustdesk/rustdesk.git
synced 2024-12-22 17:27:50 +08:00
89150317e1
Signed-off-by: 21pages <pages21@163.com>
59 lines
1.5 KiB
Rust
59 lines
1.5 KiB
Rust
use std::time::Duration;
|
|
|
|
use scrap::{Frame, TraitPixelBuffer};
|
|
|
|
extern crate scrap;
|
|
|
|
fn main() {
|
|
use scrap::{Capturer, Display, TraitCapturer};
|
|
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).unwrap();
|
|
let mut out = child.stdin.unwrap();
|
|
|
|
loop {
|
|
match capturer.frame(Duration::from_millis(0)) {
|
|
Ok(frame) => {
|
|
// Write the frame, removing end-of-row padding.
|
|
let Frame::PixelBuffer(frame) = frame else {
|
|
return;
|
|
};
|
|
let stride = frame.stride()[0];
|
|
let rowlen = 4 * w;
|
|
for row in frame.data().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;
|
|
}
|
|
}
|
|
}
|
|
}
|