Inspect
Structured ffprobe JSON, normalized into a stable typed model.
video.metadataFFmpeg, without the shell games.
A modern Node.js interface for probing, transforming, and exporting media—with native promises, safe arguments, and zero runtime dependencies.
import ffmpeg from 'ffmpeg'
const video = await ffmpeg(input)
video.on('progress', ({ percent }) => {
console.log(`${percent.toFixed(1)}%`)
})
await video
.setVideoCodec('libx264')
.setVideoSize('1280x?', true)
.save(output)One focused abstraction.
No command interpolation. No bundled binary. No legacy promise library. Just a precise TypeScript API over the FFmpeg tools you already trust.
One fluent pipeline
Structured ffprobe JSON, normalized into a stable typed model.
video.metadataChain codecs, dimensions, metadata, filters, and additional inputs.
.setVideoSize()Track start, stderr, progress, completion, aborts, and failures.
.on('progress')Export safely through process arguments—never through a shell string.
await .save()Native Promise and AbortSignal
ESM and CommonJS
First-party TypeScript types
Progress and lifecycle events
Remote protocol inputs
A modern core, a familiar surface
const video = await create(input)const video = await new ffmpeg(input)new ffmpeg(input, (error, video) => {})