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