npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

ffmpeg-forge

v0.4.0

Published

A modern, type-safe FFmpeg wrapper for Node.js with zero dependencies

Readme

ffmpeg-forge

A modern, type-safe FFmpeg wrapper for Node.js with hardware acceleration and zero dependencies.

npm version TypeScript License: MIT Test Coverage

Features

  • Type-Safe: Full TypeScript support with comprehensive type definitions
  • Hardware Acceleration: Auto-detect and use GPU encoding (NVIDIA, Intel, AMD, VAAPI, VideoToolbox, V4L2)
  • Zero Dependencies: Uses only Node.js built-ins
  • Configuration-Based: Immutable, serializable configs instead of method chaining
  • 17 Filters: Video and audio filters with full type support
  • 15 Presets: Pre-configured settings for common platforms
  • Batch Processing: Parallel processing with configurable concurrency
  • Progress Tracking: Real-time progress with events
  • Flexible I/O: Support for file paths, Buffers, and ReadStreams
  • Media Extraction: Screenshots, thumbnails, and trailer generation

Installation

npm install ffmpeg-forge

Requirements:

Tested On:

  • FFmpeg: 7.1.1
  • Node.js: 18+
  • Platforms: Linux, macOS (should work on Windows)

Quick Start

import { FFmpeg, VideoCodec, AudioCodec } from 'ffmpeg-forge';

const ffmpeg = new FFmpeg();

// Simple conversion
await ffmpeg.convert({
  input: 'input.mp4',
  output: 'output.mp4',
  video: {
    codec: VideoCodec.H264,
    bitrate: '2M',
    size: '1920x1080',
  },
  audio: {
    codec: AudioCodec.AAC,
    bitrate: '128k',
  },
});

Documentation

Core Features

Video Conversion

await ffmpeg.convert({
  input: 'input.mp4',
  output: 'output.mp4',
  video: {
    codec: VideoCodec.H264,
    bitrate: '2M',
    fps: 30,
    size: '1920x1080',
    preset: 'medium',
  },
  audio: {
    codec: AudioCodec.AAC,
    bitrate: '128k',
    sampleRate: 48000,
  },
});

Hardware Acceleration

// Auto-detect and use GPU
await ffmpeg.convert({
  input: 'input.mp4',
  output: 'output.mp4',
  video: {
    codec: VideoCodec.H264, // Automatically uses h264_nvenc if available
  },
  hardwareAcceleration: {
    enabled: true,
    preferredType: 'auto', // or 'nvidia', 'intel', 'amd'
  },
});

// Check hardware capabilities
const hwInfo = await ffmpeg.getHardwareAccelerationInfo();
console.log('Available:', hwInfo.available);
console.log('Types:', hwInfo.types);

Filters & Effects

await ffmpeg.convert({
  input: 'input.mp4',
  output: 'output.mp4',
  video: {
    codec: VideoCodec.H264,
    filters: {
      scale: { width: 1920, height: 1080, algorithm: 'lanczos' },
      sharpen: { luma_amount: 1.5 },
      color: { brightness: 0.05, contrast: 1.1 },
      denoise: { luma_spatial: 4 },
      watermark: { image: 'logo.png', x: 10, y: 10, opacity: 0.8 },
    },
  },
  audio: {
    codec: AudioCodec.AAC,
    filters: {
      volume: { level: 150 },
      denoise: { amount: 0.5 },
    },
  },
});

Screenshots

// Single screenshot
await ffmpeg.extractScreenshot({
  input: 'video.mp4',
  output: 'screenshot.jpg',
  time: 10, // 10 seconds
  size: '1920x1080',
});

// Multiple screenshots
const result = await ffmpeg.extractScreenshots({
  input: 'video.mp4',
  folder: 'screenshots',
  filename: 'frame-%i.jpg',
  count: 5, // 5 evenly spaced screenshots
});

Thumbnails

// Extract thumbnails using different strategies
const thumbnails = await ffmpeg.extractThumbnails({
  input: 'video.mp4',
  output: 'thumbnails/thumb-%d.jpg',
  strategy: 'interval', // 'time', 'count', 'interval', 'scene', or 'quality'
  count: 10,
  size: '320x180',
});

Video Concatenation

// Simple concatenation (same codec, no re-encode)
await ffmpeg.concatenate({
  inputs: ['video1.mp4', 'video2.mp4', 'video3.mp4'],
  output: 'combined.mp4',
  method: 'concat',
});

// With normalization and transitions
await ffmpeg.concatenate({
  inputs: ['video1.mp4', 'video2.mp4'],
  output: 'combined.mp4',
  method: 'complex',
  normalize: {
    enabled: true,
    video: {
      codec: VideoCodec.H264,
      size: '1920x1080',
    },
  },
  transitions: {
    enabled: true,
    type: 'crossfade',
    duration: 1,
  },
});

Trailer Generation

// Generate video trailer from segments
const trailer = await ffmpeg.generateTrailer({
  input: 'movie.mp4',
  output: 'trailer.mp4',
  strategy: 'segments', // 'segments', 'duration', 'scenes', or 'highlights'
  maxDuration: 30, // 30 seconds max
  segmentCount: 5, // Extract 5 segments
});

Batch Processing

// Sequential processing
await ffmpeg.convertBatch([
  { input: 'video1.mp4', output: 'output1.mp4', video: { codec: VideoCodec.H264 } },
  { input: 'video2.mp4', output: 'output2.mp4', video: { codec: VideoCodec.H264 } },
]);

// Parallel processing
await ffmpeg.convertBatchParallel(
  [
    { input: 'video1.mp4', output: 'output1.mp4', video: { codec: VideoCodec.H264 } },
    { input: 'video2.mp4', output: 'output2.mp4', video: { codec: VideoCodec.H264 } },
  ],
  {
    concurrency: 3, // Process 3 at a time
    onProgress: (file, progress) => {
      console.log(`${file}: ${progress.percent}%`);
    },
  }
);

Progress Tracking

ffmpeg.on('progress', (progress) => {
  console.log(`Progress: ${progress.percent}%`);
  console.log(`FPS: ${progress.currentFps}`);
  console.log(`Time: ${progress.timemark}`);
});

ffmpeg.on('end', () => {
  console.log('Conversion complete!');
});

ffmpeg.on('error', (error) => {
  console.error('Conversion failed:', error);
});

await ffmpeg.convert({ ... });

Conversion Analysis

// Get conversion suggestions based on input file
const suggestions = await ffmpeg.getConversionSuggestions('input.mp4');
console.log('Compatible formats:', suggestions.formats);
console.log('Available codecs:', suggestions.videoCodecs);

// Check if conversion is possible
const compatible = await ffmpeg.checkConversionCompatibility({
  input: 'input.mp4',
  outputFormat: 'webm',
  videoCodec: VideoCodec.VP9,
  audioCodec: AudioCodec.OPUS,
});

// Get common settings for specific use cases
const recommendation = await ffmpeg.getConversionRecommendation('input.mp4', 'web');
// Returns settings commonly used for web streaming

Presets

import { presets } from 'ffmpeg-forge';

// Use built-in preset configuration
await ffmpeg.convert({
  input: 'input.mp4',
  output: 'output.mp4',
  ...presets.youtube, // Pre-configured settings
});

// Available presets:
// - youtube, instagramPost, instagramStory, tiktok, twitter
// - webStreaming, mobile, archive, smallFile, dvd
// - audioOnly, podcast, gif, upscale4K

Advanced Features

// Picture-in-picture
await ffmpeg.pictureInPicture({
  main: 'main-video.mp4',
  overlay: 'webcam.mp4',
  output: 'pip.mp4',
  position: 'bottom-right',
  overlaySize: '320x180',
});

// Side-by-side comparison
await ffmpeg.sideBySide({
  left: 'original.mp4',
  right: 'processed.mp4',
  output: 'comparison.mp4',
  orientation: 'horizontal',
});

// Merge audio tracks
await ffmpeg.merge({
  inputs: [
    { source: 'video.mp4', type: 'video' },
    { source: 'audio.mp3', type: 'audio' },
  ],
  output: 'merged.mp4',
});

Available Filters

Video Filters (12)

  • scale - Resize with 10 algorithms (Lanczos, Bicubic, etc.)
  • crop - Position-aware cropping
  • pad - Letterboxing/pillarboxing
  • deinterlace - 3 modes (YADIF, BWDIF, W3FDIF)
  • denoise - 4 algorithms (HQDN3D, NLMeans, etc.)
  • sharpen - Unsharp mask
  • color - Brightness, contrast, saturation, gamma
  • rotate - Any angle rotation
  • flip - Horizontal/vertical
  • text - Text overlay with styling
  • fade - Fade in/out effects
  • custom - Any FFmpeg filter string

Audio Filters (5)

  • volume - Volume control
  • denoise - Audio noise reduction
  • equalizer - Multi-band EQ
  • tempo - Speed without pitch change
  • pitch - Pitch shift

See full filter documentation

Hardware Acceleration

Supports 6 hardware acceleration platforms:

  • NVIDIA NVENC - H.264, H.265, AV1
  • Intel Quick Sync - H.264, H.265, AV1, VP9
  • AMD AMF - H.264, H.265
  • VAAPI (Linux) - H.264, H.265, VP8, VP9, AV1
  • VideoToolbox (macOS) - H.264, H.265
  • V4L2 (ARM) - H.264

Hardware acceleration guide

Comparison with fluent-ffmpeg

Note: This package was created as a modern alternative to fluent-ffmpeg, which is no longer actively maintained.

| Feature | fluent-ffmpeg | ffmpeg-forge | | --------------------- | ---------------- | --------------------------- | | TypeScript | Type definitions | Native | | Dependencies | 3 packages | 0 | | Bundle Size | ~45KB gzipped | 25.5KB gzipped | | Hardware Acceleration | No | Yes (6 platforms) | | Batch Processing | No | Yes (sequential & parallel) | | Configuration API | Chaining | Config objects | | Presets | No | 15 built-in | | Status | Deprecated | Active |

Note: Both packages are wrappers around FFmpeg. This package focuses on TypeScript support and modern API design.

Configuration

Manual FFmpeg/FFprobe Path

import { FFmpeg } from 'ffmpeg-forge';

FFmpeg.setFFmpegPath('/custom/path/to/ffmpeg');
FFmpeg.setFFprobePath('/custom/path/to/ffprobe');

const ffmpeg = new FFmpeg();

Buffer I/O

import { readFileSync } from 'fs';

// Input from Buffer
const inputBuffer = readFileSync('input.mp4');
await ffmpeg.convert({
  input: inputBuffer,
  output: 'output.mp4',
  video: { codec: VideoCodec.H264 },
});

// Output to Buffer
const outputBuffer = await ffmpeg.convertToBuffer({
  input: 'input.mp4',
  video: { codec: VideoCodec.H264 },
  format: 'mp4',
});

Dry Run

// Preview command without executing
const command = ffmpeg.buildCommand({
  input: 'input.mp4',
  output: 'output.mp4',
  video: { codec: VideoCodec.H264, bitrate: '2M' },
});
console.log('FFmpeg command:', command);

Testing

# Run tests
npm test

# Run with coverage
npm run test:coverage

# Run examples
npm run example
npm run example:hardware
npm run example:thumbnails

API Reference

Complete API documentation

Contributing

Contributions are welcome! Please read our contributing guidelines and submit pull requests.

License

MIT © Parth Jansari

Tested Environment

This package has been tested on the following configuration:

Software:

  • FFmpeg: 7.1.1
  • Node.js: 18+
  • Operating System: Ubuntu 25.04 (Linux kernel 6.14)

Hardware:

  • CPU: AMD Ryzen 5 5600X (6-Core, 12 threads)
  • GPU: NVIDIA GeForce RTX 4070 (12GB VRAM, Driver 580.65)
  • RAM: 60GB

Note: The package should work on any system with FFmpeg 4.0+ and Node.js 16+. Hardware acceleration features depend on your specific GPU and drivers.

Acknowledgments

This package was inspired by fluent-ffmpeg, which has been the go-to FFmpeg wrapper for Node.js for many years. As fluent-ffmpeg is no longer actively maintained and has deprecated dependencies, ffmpeg-forge was created to provide a modern, type-safe alternative with zero dependencies and contemporary JavaScript/TypeScript features.

This is a TypeScript wrapper around FFmpeg, the powerful multimedia framework that does all the heavy lifting.

Built with:

Special thanks to the fluent-ffmpeg contributors for pioneering FFmpeg wrappers in Node.js.