This document provides a series of examples demonstrating the use of the fluent-ffmpeg
Node.js module. Examples are ordered by increasing complexity.
This example demonstrates how to convert any input stream to MP4 with special movflags
for streaming.
// The solution based on adding -movflags for mp4 output
// For more movflags details check ffmpeg docs
// https://ffmpeg.org/ffmpeg-formats.html#toc-Options-9
var fs = require('fs');
var path = require('path');
var ffmpeg = require('../index');
var pathToSourceFile = path.resolve(__dirname, '../test/assets/testvideo-169.avi');
var readStream = fs.createReadStream(pathToSourceFile);
var writeStream = fs.createWriteStream('./output.mp4');
ffmpeg(readStream)
.addOutputOptions('-movflags +frag_keyframe+separate_moof+omit_tfhd_offset+empty_moov')
.format('mp4')
.pipe(writeStream);
This example sets up an Express.js server that streams converted video on-the-fly to a browser.
var express = require('express'),
ffmpeg = require('../index');
var app = express();
app.use(express.static(__dirname + '/flowplayer'));
app.get('/', function(req, res) {
res.send('index.html');
});
app.get('/video/:filename', function(req, res) {
res.contentType('flv');
// make sure you set the correct path to your video file storage
var pathToMovie = '/path/to/storage/' + req.params.filename;
var proc = ffmpeg(pathToMovie)
// use the 'flashvideo' preset (located in /lib/presets/flashvideo.js)
.preset('flashvideo')
// setup event handlers
.on('end', function() {
console.log('file has been converted succesfully');
})
.on('error', function(err) {
console.log('an error happened: ' + err.message);
})
// save to stream
.pipe(res, {end:true});
});
app.listen(4000);
This is a full-featured example demonstrating many of the available configuration options.
var ffmpeg = require('../index');
// make sure you set the correct path to your video file
var proc = ffmpeg('/path/to/your_movie.avi')
// set video bitrate
.videoBitrate(1024)
// set target codec
.videoCodec('divx')
// set aspect ratio
.aspect('16:9')
// set size in percent
.size('50%')
// set fps
.fps(24)
// set audio bitrate
.audioBitrate('128k')
// set audio codec
.audioCodec('libmp3lame')
// set number of audio channels
.audioChannels(2)
// set custom option
.addOption('-vtag', 'DIVX')
// set output format to force
.format('avi')
// setup event handlers
.on('end', function() {
console.log('file has been converted succesfully');
})
.on('error', function(err) {
console.log('an error happened: ' + err.message);
})
// save to file
.save('/path/to/your_target.avi');
This example converts a still image into a short video by looping the image.
var ffmpeg = require('fluent-ffmpeg');
// make sure you set the correct path to your video file
var proc = ffmpeg('/path/to/your_image.jpg')
// loop for 5 seconds
.loop(5)
// using 25 fps
.fps(25)
// setup event handlers
.on('end', function() {
console.log('file has been converted succesfully');
})
.on('error', function(err) {
console.log('an error happened: ' + err.message);
})
// save to file
.save('/path/to/your_target.m4v');
This example shows how to use a readable stream as input for processing.
var fs = require('fs'),
ffmpeg = require('../index');
// open input stream
var infs = fs.createReadStream(__dirname + '/test/assets/testvideo-43.avi');
infs.on('error', function(err) {
console.log(err);
});
// create new ffmpeg processor instance using input stream
// instead of file path (can be any ReadableStream)
var proc = ffmpeg(infs)
.preset('flashvideo')
// setup event handlers
.on('end', function() {
console.log('done processing input stream');
})
.on('error', function(err) {
console.log('an error happened: ' + err.message);
})
// save to file
.save('/path/to/your_target.flv');
This example shows how to convert a live RTMP stream to HLS format in real-time.
var ffmpeg = require('../index');
// make sure you set the correct path to your video file
var proc = ffmpeg('rtmp://path/to/live/stream', { timeout: 432000 })
// set video bitrate
.videoBitrate(1024)
// set h264 preset
.addOption('preset','superfast')
// set target codec
.videoCodec('libx264')
// set audio bitrate
.audioBitrate('128k')
// set audio codec
.audioCodec('libfaac')
// set number of audio channels
.audioChannels(2)
// set hls segments time
.addOption('-hls_time', 10)
// include all the segments in the list
.addOption('-hls_list_size',0)
// setup event handlers
.on('end', function() {
console.log('file has been converted succesfully');
})
.on('error', function(err) {
console.log('an error happened: ' + err.message);
})
// save to file
.save('/path/to/your_target.m3u8');
This example merges multiple video files into one using intermediate MPEG files.
var ffmpeg = require('../index');
/*
replicates this sequence of commands:
ffmpeg -i title.mp4 -qscale:v 1 intermediate1.mpg
ffmpeg -i source.mp4 -qscale:v 1 intermediate2.mpg
ffmpeg -i concat:"intermediate1.mpg|intermediate2.mpg" -c copy intermediate_all.mpg
ffmpeg -i intermediate_all.mpg -qscale:v 2 output.mp4
Create temporary .mpg files for each video and deletes them after merge is completed.
These files are created by filename pattern like [videoFilename.ext].temp.mpg [outputFilename.ext].temp.merged.mp4
*/
var firstFile = "title.mp4";
var secondFile = "source.mp4";
var thirdFile = "third.mov";
var outPath = "out.mp4";
var proc = ffmpeg(firstFile)
.input(secondFile)
.input(thirdFile)
//.input(fourthFile)
//.input(...)
.on('end', function() {
console.log('files have been merged succesfully');
})
.on('error', function(err) {
console.log('an error happened: ' + err.message);
})
.mergeToFile(outPath);
This example demonstrates how to use ffprobe
to extract metadata from a video file.
var ffmpeg = require('../index');
// make sure you set the correct path to your video file
ffmpeg.ffprobe('/path/to/your_movie.avi',function(err, metadata) {
console.log(require('util').inspect(metadata, false, null));
});
This example demonstrates the use of a preset and how to override its settings.
var ffmpeg = require('../index');
// make sure you set the correct path to your video file
var proc = ffmpeg('/path/to/your_movie.avi')
// use the 'podcast' preset (located in /lib/presets/podcast.js)
.preset('podcast')
// in case you want to override the preset's setting, just keep chaining
.videoBitrate('512k')
// setup event handlers
.on('end', function() {
console.log('file has been converted succesfully');
})
.on('error', function(err) {
console.log('an error happened: ' + err.message);
})
// save to file
.save('/path/to/your_target.m4v');
This example extends the input stream example by reporting progress.
var fs = require('fs'),
ffmpeg = require('../index');
// open input stream
var infs = fs.createReadStream(__dirname + '/test/assets/testvideo-43.avi');
infs.on('error', function(err) {
console.log(err);
});
var proc = ffmpeg(infs)
.preset('flashvideo')
// setup event handlers
.on('progress', function(info) {
console.log('progress ' + info.percent + '%');
})
.on('end', function() {
console.log('done processing input stream');
})
.on('error', function(err) {
console.log('an error happened: ' + err.message);
})
.save('/path/to/your_target.flv');
This example shows how to stream video conversion output directly to a writable stream.
var ffmpeg = require('../index'),
fs = require('fs');
// create the target stream (can be any WritableStream)
var stream = fs.createWriteStream('/path/to/yout_target.flv')
// make sure you set the correct path to your video file
var proc = ffmpeg('/path/to/your_movie.avi')
// use the 'flashvideo' preset (located in /lib/presets/flashvideo.js)
.preset('flashvideo')
// setup event handlers
.on('end', function() {
console.log('file has been converted succesfully');
})
.on('error', function(err) {
console.log('an error happened: ' + err.message);
})
// save to stream
.pipe(stream, {end:true}); //end = true, close output stream after writing
This example demonstrates how to take screenshots (thumbnails) from a video at specific timemarks.
var ffmpeg = require('../index');
var proc = ffmpeg('/path/to/your_movie.avi')
// setup event handlers
.on('filenames', function(filenames) {
console.log('screenshots are ' + filenames.join(', '));
})
.on('end', function() {
console.log('screenshots were saved');
})
.on('error', function(err) {
console.log('an error happened: ' + err.message);
})
// take 2 screenshots at predefined timemarks and size
.takeScreenshots({ count: 2, timemarks: [ '00:00:02.000', '6' ], size: '150x100' }, '/path/to/thumbnail/folder');