rustdesk/libs/scrap/examples/ffplay.rs

59 lines
1.5 KiB
Rust
Raw Normal View History

use std::time::Duration;
use scrap::{Frame, TraitPixelBuffer};
2021-03-29 15:59:14 +08:00
extern crate scrap;
fn main() {
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.");
let mut capturer = Capturer::new(d).unwrap();
2021-03-29 15:59:14 +08:00
let mut out = child.stdin.unwrap();
loop {
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 Frame::PixelBuffer(frame) = frame else {
return;
};
let stride = frame.stride()[0];
2021-03-29 15:59:14 +08:00
let rowlen = 4 * w;
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;
}
}
}
}