ffmpeg_sidecar/
version.rs

1//! Utilities for checking local FFmpeg version string.
2
3use anyhow::Context;
4
5use crate::command::BackgroundCommand;
6use crate::{event::FfmpegEvent, log_parser::FfmpegLogParser, paths::ffmpeg_path};
7use std::ffi::OsStr;
8use std::process::{Command, Stdio};
9
10/// Alias for `ffmpeg -version`, parsing the version number and returning it.
11pub fn ffmpeg_version() -> anyhow::Result<String> {
12  ffmpeg_version_with_path(ffmpeg_path())
13}
14
15/// Lower level variant of `ffmpeg_version` that exposes a customized path
16/// to the ffmpeg binary.
17pub fn ffmpeg_version_with_path<S: AsRef<OsStr>>(path: S) -> anyhow::Result<String> {
18  let mut cmd = Command::new(&path)
19    .create_no_window()
20    .arg("-version")
21    .stdout(Stdio::piped()) // not stderr when calling `-version`
22    .spawn()?;
23  let stdout = cmd.stdout.take().context("No standard output channel")?;
24  let mut parser = FfmpegLogParser::new(stdout);
25
26  let mut version: Option<String> = None;
27  while let Ok(event) = parser.parse_next_event() {
28    match event {
29      FfmpegEvent::ParsedVersion(v) => version = Some(v.version),
30      FfmpegEvent::LogEOF => break,
31      _ => {}
32    }
33  }
34  let exit_status = cmd.wait()?;
35  if !exit_status.success() {
36    anyhow::bail!("ffmpeg -version exited with non-zero status");
37  }
38  version.context("Failed to parse ffmpeg version")
39}