2022-06-29 09:38:01 +08:00
|
|
|
use std::time::Duration;
|
|
|
|
|
2023-10-27 15:44:07 +08:00
|
|
|
use scrap::TraitFrame;
|
|
|
|
|
2021-03-29 15:59:14 +08:00
|
|
|
extern crate scrap;
|
|
|
|
|
|
|
|
fn main() {
|
2022-07-21 20:04:39 +08:00
|
|
|
use scrap::{Capturer, Display, TraitCapturer};
|
2021-03-29 15:59:14 +08:00
|
|
|
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.");
|
|
|
|
|
2023-10-27 15:44:07 +08:00
|
|
|
let mut capturer = Capturer::new(d).unwrap();
|
2021-03-29 15:59:14 +08:00
|
|
|
let mut out = child.stdin.unwrap();
|
|
|
|
|
|
|
|
loop {
|
2022-06-29 09:38:01 +08:00
|
|
|
match capturer.frame(Duration::from_millis(0)) {
|
2021-03-29 15:59:14 +08:00
|
|
|
Ok(frame) => {
|
|
|
|
// Write the frame, removing end-of-row padding.
|
2023-10-27 15:44:07 +08:00
|
|
|
let stride = frame.stride()[0];
|
2021-03-29 15:59:14 +08:00
|
|
|
let rowlen = 4 * w;
|
2023-10-27 15:44:07 +08:00
|
|
|
for row in frame.data().chunks(stride) {
|
2021-03-29 15:59:14 +08:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|