A fluent, chainable API for programmatic video and audio editing using FFmpeg.
bun add lavalierFFmpeg must be installed and available in PATH.
import { video, audio } from "lavalier"
await video("input.mp4")
.trim({ start: 5, end: 15 })
.speed(2)
.flip("horizontal")
.text("Hello World", { position: "center", size: 48 })
.export("output.mp4")
await audio("input.mp3")
.trim({ start: 10, end: 30 })
.speed(1.5)
.volume(0.8)
.export("output.mp3")Create a new video instance from an input file path.
Create a new audio instance from an input file path. Supports .trim(), .speed(), .volume(), .concat(), and .export().
Crop video dimensions.
// Crop width only
.crop({ width: 1920 })
// Crop height only
.crop({ height: 1080 })
// Crop both with position
.crop({ width: 1920, height: 1080, x: 100, y: 50 })Flip video horizontally or vertically.
.flip("horizontal")
.flip("vertical")Scale video by a factor.
.scale(0.5) // 50% size
.scale(2) // 200% sizeChange playback speed. For video, affects both video and audio streams.
.speed(2) // 2x faster
.speed(0.5) // 2x slowerOverlay text on video.
.text("Hello World")
.text("Hello World", {
position: "center", // or { x: 100, y: 50 }
size: 48,
font: "Arial",
color: "white",
start: 2, // seconds
end: 10
})Trim duration.
.trim({ start: 5, end: 15 }) // seconds
.trim({ start: 5 }) // from 5s to end
.trim({ end: 10 }) // from start to 10sAdjust audio volume.
.volume(0.5) // 50% volume
.volume(2) // 200% volumeConcatenate another video or audio instance.
const intro = video("intro.mp4")
const main = video("main.mp4")
await main.concat(intro).export("output.mp4")
const a1 = audio("a.mp3")
const a2 = audio("b.mp3")
await a1.concat(a2).export("combined.mp3")Execute the operation chain and export to output file. Returns a Promise.
MIT