| 
									
										
										
										
											2022-06-29 09:38:01 +08:00
										 |  |  | use std::time::Duration;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-29 15:59:14 +08:00
										 |  |  | extern crate scrap;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | fn main() {
 | 
					
						
							|  |  |  |     use scrap::{Capturer, Display};
 | 
					
						
							|  |  |  |     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 {
 | 
					
						
							| 
									
										
										
										
											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.
 | 
					
						
							|  |  |  |                 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;
 | 
					
						
							|  |  |  |             }
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | }
 |