54 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use std::time::Duration;
 | |
| 
 | |
| 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, false).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 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;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |