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; } } } }