A fluent API to FFMPEG for audio and video manipulation with chainable methods
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
Output management capabilities for configuring destinations, formats, seeking, duration, and stream mapping.
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: addOutputUsage 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();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, outputFormatUsage 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');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, setDurationUsage 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();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) // → FfmpegCommandStream Specification Format:
'input:type:index' - Select specific stream'input:type' - Select all streams of type from input'-1:type' - Exclude streams of typeUsage 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');Update FLV file metadata using flvtool2/flvmeta.
/**
* Run flvtool2/flvmeta on output FLV files
* @returns FfmpegCommand instance for chaining
*/
flvmeta() // → FfmpegCommand
// Aliases: updateFlvMetadataUsage Example:
// Create FLV with proper metadata
ffmpeg('input.mp4')
.format('flv')
.flvmeta() // Add keyframe metadata for seeking
.save('output.flv');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, outputOptionUsage 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');
});Apply options to specific output streams.
/**
* Apply codec options to specific streams using output options
*/
outputOptions(['-c:v:0', 'libx264', '-c:a:0', 'aac']) // → FfmpegCommandUsage 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');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 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