CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/npm-fluent-ffmpeg

A fluent API to FFMPEG for audio and video manipulation with chainable methods

Pending
Quality

Pending

Does it follow best practices?

Impact

Pending

No eval scenarios have been run

SecuritybySnyk

Pending

The risk profile of this skill

Overview
Eval results
Files

output-management.mddocs/

Output Management

Output management capabilities for configuring destinations, formats, seeking, duration, and stream mapping.

Capabilities

Output Target Configuration

Configure output destinations including files and streams.

/**
 * Add output target (file or stream)
 * @param target - Output file path or writable stream
 * @param pipeopts - Optional pipe options for streams
 * @returns FfmpegCommand instance for chaining
 */
output(target?, pipeopts?) // → FfmpegCommand
// Aliases: addOutput

Usage Examples:

const ffmpeg = require('fluent-ffmpeg');
const fs = require('fs');

// File output
ffmpeg('input.avi')
  .output('output.mp4')
  .run();

// Stream output
const outputStream = fs.createWriteStream('stream_output.mp4');
ffmpeg('input.avi')
  .output(outputStream)
  .run();

// Multiple outputs
ffmpeg('input.mkv')
  .output('high_quality.mp4').videoBitrate('5000k')
  .output('low_quality.mp4').videoBitrate('1000k')
  .run();

// Output with pipe options
ffmpeg('input.avi')
  .output(outputStream, { end: true })
  .run();

Output Format

Specify the container format for output files.

/**
 * Set output format/container
 * @param format - Format name (e.g., 'mp4', 'avi', 'mkv')
 * @returns FfmpegCommand instance for chaining
 */
format(format) // → FfmpegCommand
// Aliases: toFormat, withOutputFormat, outputFormat

Usage Examples:

// Explicit format specification
ffmpeg('input.avi').format('mp4').save('output.mp4');
ffmpeg('input.mp4').format('webm').save('output.webm');

// Format override (when filename doesn't match)
ffmpeg('input.mov')
  .format('mp4')  // Force MP4 container
  .save('output.video');  // Extension doesn't matter

// Streaming formats
ffmpeg('input.mp4')
  .format('flv')
  .save('rtmp://server/live/stream');

Output Seeking and Duration

Control output timing and duration limits.

/**
 * Set output seek time (skip beginning of output)
 * @param seek - Time in seconds or '[hh:[mm:]]ss[.xxx]' format
 * @returns FfmpegCommand instance for chaining
 */
seek(seek) // → FfmpegCommand
// Aliases: seekOutput

/**
 * Set maximum output duration
 * @param duration - Duration in seconds or time format
 * @returns FfmpegCommand instance for chaining
 */
duration(duration) // → FfmpegCommand
// Aliases: withDuration, setDuration

Usage Examples:

// Extract middle portion
ffmpeg('long_video.mp4')
  .seekInput(60)    // Start from 1 minute in input
  .duration(30)     // Take 30 seconds
  .save('clip.mp4');

// Skip first part of output
ffmpeg('input.avi')
  .seek(10)         // Skip first 10 seconds of output
  .save('trimmed.mp4');

// Precise timing
ffmpeg('presentation.mp4')
  .seek('00:02:30.500')      // Start at 2:30.5
  .duration('00:05:00')      // 5 minutes duration
  .save('segment.mp4');

// Time-based splitting
ffmpeg('movie.mkv')
  .seek(0).duration(1800)    // First 30 minutes
  .output('part1.mp4')
  .seek(1800).duration(1800) // Second 30 minutes  
  .output('part2.mp4')
  .run();

Stream Mapping

Map specific input streams to outputs.

/**
 * Add stream mapping
 * @param spec - Stream specification (e.g., '0:v:0', '1:a', '-1:s')
 * @returns FfmpegCommand instance for chaining
 */
map(spec) // → FfmpegCommand

Stream Specification Format:

  • 'input:type:index' - Select specific stream
  • 'input:type' - Select all streams of type from input
  • '-1:type' - Exclude streams of type

Usage Examples:

// Select specific streams
ffmpeg('movie.mkv')
  .map('0:v:0')     // First video stream
  .map('0:a:1')     // Second audio stream
  .map('0:s:0')     // First subtitle stream
  .save('remapped.mp4');

// Multiple audio tracks
ffmpeg('multilang.mkv')
  .map('0:v')       // All video streams
  .map('0:a:0')     // English audio
  .map('0:a:2')     // Spanish audio
  .save('dual_audio.mp4');

// Exclude streams
ffmpeg('input.mkv')
  .map('0')         // Map all streams
  .map('-1:s')      // Exclude subtitles
  .save('no_subs.mp4');

// Complex mapping with multiple inputs
ffmpeg()
  .input('video.mp4')      // Input 0
  .input('audio.mp3')      // Input 1
  .input('subtitles.srt')  // Input 2
  .map('0:v')              // Video from input 0
  .map('1:a')              // Audio from input 1
  .map('2:s')              // Subtitles from input 2
  .save('combined.mkv');

FLV Metadata Updates

Update FLV file metadata using flvtool2/flvmeta.

/**
 * Run flvtool2/flvmeta on output FLV files
 * @returns FfmpegCommand instance for chaining
 */
flvmeta() // → FfmpegCommand
// Aliases: updateFlvMetadata

Usage Example:

// Create FLV with proper metadata
ffmpeg('input.mp4')
  .format('flv')
  .flvmeta()  // Add keyframe metadata for seeking
  .save('output.flv');

Custom Output Options

Add custom FFmpeg output options not covered by other methods.

/**
 * Add custom output options
 * @param options - Option string(s) or array of option strings  
 * @returns FfmpegCommand instance for chaining
 */
outputOptions(...options) // → FfmpegCommand
// Aliases: addOutputOption, addOutputOptions, addOption, addOptions,
//          withOutputOption, withOutputOptions, withOption, withOptions, outputOption

Usage Examples:

// Custom encoding options
ffmpeg('input.avi')
  .outputOptions([
    '-crf', '18',           // Constant rate factor
    '-preset', 'slow',      // Encoding preset
    '-profile:v', 'high',   // H.264 profile
    '-level', '4.1'         // H.264 level
  ])
  .save('high_quality.mp4');

// Streaming options
ffmpeg('input.mp4')
  .outputOptions([
    '-movflags', '+faststart',  // Web-optimized MP4
    '-pix_fmt', 'yuv420p'       // Compatibility pixel format
  ])
  .save('web_ready.mp4');

// Custom container options
ffmpeg('input.avi')
  .outputOptions([
    '-avoid_negative_ts', 'make_zero',
    '-fflags', '+genpts'
  ])
  .format('mp4')
  .save('fixed_timing.mp4');

// Multi-pass encoding
ffmpeg('input.avi')
  .outputOptions([
    '-pass', '1',
    '-b:v', '2000k',
    '-f', 'null'
  ])
  .output('/dev/null')  // First pass
  .run()
  .then(() => {
    return ffmpeg('input.avi')
      .outputOptions([
        '-pass', '2', 
        '-b:v', '2000k'
      ])
      .save('2pass_output.mp4');
  });

Advanced Output Management

Output Per-Stream Options

Apply options to specific output streams.

/**
 * Apply codec options to specific streams using output options
 */
outputOptions(['-c:v:0', 'libx264', '-c:a:0', 'aac']) // → FfmpegCommand

Usage Examples:

// Different codecs for multiple streams
ffmpeg('input.mkv')
  .outputOptions([
    '-c:v:0', 'libx264',    // H.264 for first video
    '-c:v:1', 'libx265',    // H.265 for second video
    '-c:a:0', 'aac',        // AAC for first audio
    '-c:a:1', 'mp3'         // MP3 for second audio
  ])
  .save('multi_codec.mkv');

// Per-stream bitrates
ffmpeg('input.avi')
  .outputOptions([
    '-b:v:0', '2000k',      // 2Mbps for video
    '-b:a:0', '128k',       // 128kbps for audio
    '-maxrate:v:0', '2500k', // Max video bitrate
    '-bufsize:v:0', '5000k'  // Buffer size
  ])
  .save('bitrate_controlled.mp4');

Conditional Output

Create outputs based on conditions.

Usage Example:

const command = ffmpeg('input.mp4');

// Add outputs conditionally
if (needHighQuality) {
  command.output('hq_output.mp4').videoBitrate('5000k');
}

if (needLowQuality) {
  command.output('lq_output.mp4').videoBitrate('1000k');
}

command.run();

Output Types

/**
 * Output target types
 */
type OutputTarget = string | WritableStream;

/**
 * Pipe options for stream outputs
 */
interface PipeOptions {
  end?: boolean;        // End stream when ffmpeg finishes (default: true)
}

/**
 * Common output format names
 */
type OutputFormat = 
  | 'mp4' | 'avi' | 'mkv' | 'mov' | 'wmv'     // Video containers
  | 'mp3' | 'aac' | 'wav' | 'flac' | 'ogg'    // Audio formats
  | 'webm' | 'ogv'                            // Web formats
  | 'flv' | 'f4v'                             // Flash formats  
  | 'ts' | 'mpegts'                           // Transport streams
  | 'hls' | 'dash'                            // Adaptive streaming
  | 'null'                                    // Null output (testing)
  | string;                                   // Any FFmpeg format

/**
 * Stream mapping specification
 */
type StreamSpec = string; // Format: 'input:type:index' or variations

/**
 * Time specification for seek/duration
 */
type TimeSpec = number | string; // Seconds as number or 'HH:MM:SS.mmm' format

docs

audio-processing.md

configuration.md

index.md

input-management.md

output-management.md

processing-control.md

special-features.md

video-processing.md

tile.json