Remove static binding to ffmpeg and use command instead
Signed-off-by: trivernis <trivernis@protonmail.com>pull/4/head
parent
bdc3ae07ac
commit
9ad9ccf778
@ -0,0 +1,58 @@
|
||||
use crate::error::ThumbError;
|
||||
use crate::ThumbResult;
|
||||
use std::ffi::OsStr;
|
||||
use std::io::ErrorKind;
|
||||
use std::process::{Command, Stdio};
|
||||
|
||||
const FFMPEG: &str = "ffmpeg";
|
||||
|
||||
/// Runs ffmpeg to retrieve a png video frame
|
||||
pub fn get_png_frame(video_file: &str, index: usize) -> ThumbResult<Vec<u8>> {
|
||||
ffmpeg([
|
||||
"-loglevel",
|
||||
"panic",
|
||||
"-i",
|
||||
video_file,
|
||||
"-vf",
|
||||
format!("select=eq(n\\,{})", index).as_str(),
|
||||
"-vframes",
|
||||
"1",
|
||||
"-c:v",
|
||||
"png",
|
||||
"-movflags",
|
||||
"empty_moov",
|
||||
"-f",
|
||||
"image2pipe",
|
||||
"pipe:1",
|
||||
])
|
||||
}
|
||||
|
||||
/// Runs ffmpeg with the given args
|
||||
fn ffmpeg<I: IntoIterator<Item = S>, S: AsRef<OsStr>>(args: I) -> ThumbResult<Vec<u8>> {
|
||||
let child = Command::new(FFMPEG)
|
||||
.args(args)
|
||||
.stdout(Stdio::piped())
|
||||
.spawn()?;
|
||||
|
||||
let output = child.wait_with_output()?;
|
||||
if output.status.success() && output.stdout.len() > 0 {
|
||||
Ok(output.stdout)
|
||||
} else {
|
||||
Err(ThumbError::FFMPEG(
|
||||
String::from_utf8_lossy(&output.stderr[..]).to_string(),
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_ffmpeg_installed() -> bool {
|
||||
match Command::new("ffmpeg").args(["-loglevel", "quiet"]).spawn() {
|
||||
Ok(_) => true,
|
||||
Err(e) => {
|
||||
if let ErrorKind::NotFound = e.kind() {
|
||||
false
|
||||
} else {
|
||||
true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1 @@
|
||||
pub mod ffmpeg_cli;
|
Loading…
Reference in New Issue