// the find
cshum/imagorvideo
imagor video thumbnail server in Go and ffmpeg C bindings
imagorvideo extends the imagor image processing server to handle video thumbnails via ffmpeg C bindings. It streams a limited number of frames, picks the best one using RMSE histogram comparison to avoid black frames, then hands off to libvips for the usual crop/resize/filter pipeline. Aimed at teams already using imagor who need video thumbnail generation without standing up a separate service.
The RMSE-based frame selection is the right call — black frames at video starts are a real annoyance and this handles it without requiring callers to guess a good timestamp. The seek() vs frame() distinction is well thought out and documented with a concrete example of why you'd need each. CGo bindings to ffmpeg mean you get the full codec support without shelling out to a subprocess. The metadata endpoint that reads only headers (no frame decode) for dimension/duration/FPS data is a nice touch for clients that need to know what they're working with before requesting a thumbnail.
229 stars and 16 forks after what appears to be a few years of existence suggests limited adoption — the imagor ecosystem itself is niche, and this is a plugin for it, so you're betting on a small base. The CGo dependency on ffmpeg makes cross-compilation painful and the Docker images will be large; there's no pure-Go fallback. Memory buffering for non-seekable sources (HTTP, S3) means a 2GB video file could exhaust your container before you get a frame — the README doesn't mention any size limits or safeguards. Configuration is minimal: one flag (-ffmpeg-fallback-image) beyond what imagor already exposes, so tuning frame extraction behavior (timeout, memory cap, codec allowlist) requires forking.