diff --git a/crates/store/re_video/src/decode/ffmpeg.rs b/crates/store/re_video/src/decode/ffmpeg.rs index 2b2c52469076..3d90b7444879 100644 --- a/crates/store/re_video/src/decode/ffmpeg.rs +++ b/crates/store/re_video/src/decode/ffmpeg.rs @@ -19,7 +19,7 @@ use super::{AsyncDecoder, Chunk, Frame, OutputCallback}; #[derive(thiserror::Error, Debug)] pub enum Error { - #[error("Requires an install of FFmpeg, none has been found in PATH.")] + #[error("Couldn't find an installation of the FFmpeg executable.")] FfmpegNotInstalled { /// Download URL for the latest version of `FFmpeg` on the current platform. /// None if the platform is not supported. diff --git a/crates/store/re_video/src/decode/mod.rs b/crates/store/re_video/src/decode/mod.rs index 6b50ac7a87bb..9acf12336ed8 100644 --- a/crates/store/re_video/src/decode/mod.rs +++ b/crates/store/re_video/src/decode/mod.rs @@ -88,6 +88,8 @@ mod webcodecs; use crate::Time; +pub use ffmpeg::Error as FfmpegError; + #[derive(thiserror::Error, Debug, Clone)] pub enum Error { #[error("Unsupported codec: {0}")] @@ -115,7 +117,7 @@ pub enum Error { #[cfg(with_ffmpeg)] #[error(transparent)] - Ffmpeg(std::sync::Arc), + Ffmpeg(std::sync::Arc), #[error("Unsupported bits per component: {0}")] BadBitsPerComponent(usize), diff --git a/crates/viewer/re_data_ui/src/video.rs b/crates/viewer/re_data_ui/src/video.rs index 2cd4c69a4eea..8ef1f876efcb 100644 --- a/crates/viewer/re_data_ui/src/video.rs +++ b/crates/viewer/re_data_ui/src/video.rs @@ -154,6 +154,18 @@ pub fn show_video_blob_info( Err(err) => { ui.error_label_long(&err.to_string()); + + if let re_renderer::video::VideoPlayerError::Decoding( + re_video::decode::Error::Ffmpeg(ffmpeg), + ) = err + { + if let re_video::decode::FfmpegError::FfmpegNotInstalled { + download_url: Some(url), + } = ffmpeg.as_ref() + { + ui.markdown_ui(&format!("You can download a build of `FFmpeg` [here]({url}). For Rerun to be able to use it, its binaries need to be reachable from `PATH`.")); + } + } } } }