ff-preview
Real-time video preview and proxy workflow for Rust. Provides frame-accurate seek, audio-master A/V sync, a FrameSink trait for custom renderers, RGBA pixel delivery, and proxy generation with auto-substitution.
ff-preview adds a real-time, A/V-synchronised playback and seek loop on top of the decode primitives, converting frames to RGBA via libswscale for display. Decoding is delegated to ff-decode; this crate owns the playback clock, frame-accurate seek, and a FrameSink trait for custom renderers. Errors are typed and chain their source (PreviewError), so a failure reads as an actionable message rather than a raw FFmpeg return code.
It is an independent crate: use it on its own, or combine it with the other ff-* crates to build any media app or editing model. The ff-* crates are model-free primitives that impose no editing model; avio is one editing engine built on top of them. See the library comparison to choose the right layer.
Installation
[]
= "0.18"
# Enable async support
= { = "0.18", = ["tokio"] }
# Enable proxy generation
= { = "0.18", = ["proxy"] }
Quick Start
Playback with a custom RGBA sink
PreviewPlayer::open probes the file and prepares the pipeline. Call split()
to obtain an exclusive PlayerRunner (owns the decode pipeline; register the
sink and drive it with run()) and a cloneable PlayerHandle (non-blocking
play / pause / seek / stop controls).
use thread;
use ;
Frame-accurate seek
use Path;
use Duration;
use ;
Proxy generation
Requires the proxy feature (--features proxy). A file goes in, a
lower-resolution proxy file comes out at {output_dir}/{stem}_proxy_{res}.mp4.
use Path;
use ;
Feature Flags
| Feature | What it enables |
|---|---|
| (default) | PreviewPlayer, PlayerRunner, PlayerHandle, DecodeBuffer, PlaybackClock, FrameSink, RgbaSink, RgbaFrame, seek |
tokio |
AsyncPreviewPlayer |
proxy |
ProxyGenerator, ProxyJob, ProxyResolution |
timeline |
Scene, ScenePlayer, SceneRunner |
Error Handling
Common variants (not exhaustive):
| Variant | When it occurs |
|---|---|
PreviewError::FileNotFound |
The media file was not found |
PreviewError::NoVideoStream |
The file has no video stream |
PreviewError::SeekFailed |
A seek operation failed |
PreviewError::Decode |
Wrapped DecodeError from the decode stage |
PreviewError::Io |
An I/O error during file operations |
PreviewError implements ff_format::MediaError, so err.is_recoverable() / err.is_fatal() work uniformly with the other ff-* crates.
MSRV
Rust 1.93.0 (edition 2024).
License
MIT OR Apache-2.0