Simple programmatic interface for node/io.js to create straightforward slideshow videos based on images using ffmpeg
You can easily create videos with optional audio, subtitles and fade in/out transitions. Take a look to examples, programmatic API and command-line
- ffmpeg with additional compilation flags
--enable-libass --enable-libmp3lame
npm install videoshow
For command-line usage, install it as global package:
npm install -g videoshow
var videoshow = require('videoshow')
var images = [
'step1.jpg',
'step2.jpg',
'step3.jpg',
'step4.jpg'
]
var videoOptions = {
fps: 25,
loop: 5, // seconds
videoBitrate: 1024,
videoCodec: 'libx264',
size: '640x?',
audioBitrate: '128k',
audioChannels: 2,
format: 'mp4'
}
videoshow(images, videoOptions)
.audio('song.mp3')
.save('video.mp4')
$ videoshow --help
Create video slides easily from images
Usage: bin/videoshow [options]
Options:
--help, -h Show help
--config, -c File path to JSON config file [required]
--audio, -a Optional audio file path
--input, -i Add additional input to video
--output, -o Output video file path
--debug, -d Enable debug mode in error case
Examples:
bin/videoshow -c config.json --audio song.mp3
bin/videoshow -c config.json --audio song.mp3 video.mp4
Example config.json
file:
{
"output": "video.mp4",
"options": {
"fps": 25,
"loop": 5,
"transition": true,
"transitionDuration": 1,
"videoBitrate": 1024,
"videoCodec": "libx264",
"size": "640x?",
"audioBitrate": "128k",
"audioChannels": 2,
"format": "mp4"
},
"images": [
"./test/fixtures/step_1.png",
"./test/fixtures/step_2.png",
"./test/fixtures/step_3.png",
"./test/fixtures/step_4.png",
"./test/fixtures/step_5.png"
]
}
Return: Videoshow
Videoshow constructor. You should pass an array<string>
or array<object>
or array<ReadableStream>
with the desired images,
and optionally passing the video render options
object per each image.
Image formats supported are: jpg
, png
, gif
, bmp
videoshow([ 'image1.jpg', 'image2.jpg', 'image3.jpg'])
.save('video.mp4')
.on('error', function () {})
.on('end', function () {})
images
param could be a collection as well:
videoshow([{
path: 'image1.jpg',
caption: 'Hello world as video subtitle'
}, {
path: 'image2.jpg',
caption: 'This is a sample subtitle',
loop: 10 // long caption
}])
.save('video.mp4')
.on('error', function () {})
.on('end', function () {})
You can define any of the methods allowed by fluent-ffmpeg
Default options are:
{
fps: 25,
loop: 5, // seconds
transition: true,
transitionDuration: 1,
videoBitrate: 1024,
videoCodec: 'libx264',
size: '640x?',
audioBitrate: '128k',
audioChannels: 2,
format: 'mp4'
}
- path
string
- File path to image - loop
number
- Image slide duration in seconds. Default to5
- caption
string
- Caption text as subtitle. It allows a limited set of HTML tags. See Subrip - transition
boolean
- Enable fade in/out transition for the current image - transitionDuration
number
- Fade in/out transition duration in seconds. Default to1
- captionStart
number
- Miliseconds to start the caption. Default to1000
- captionEnd
number
- Miliseconds to remove the caption. Default toloop - 1000
Push an image to the video. You can pass an string
as path to the image,
or a plain object
with image options
Define the audio file path to use. It supports multiple formats and codecs such as acc
, mp3
or ogg
Define the SubRip subtitles
file path to load. It should be a .srt
file
If you want to use SubStation Alpha (SSA/ASS) subtitles, you should pass it as video input:
videoshow(images)
.input('subtitles.ass')
.on('end', end)
.save('video.mp4')
Return: EventEmitter
Alias: render
Render and write the final video in the given path
Add input file to video
Add custom filter to the video
Add specific image rendering options
Add custom video rendering options
Add a custom CLI flag to pass to ffmpeg
Type: string
Current package semantic version
Type: function
fluent-ffmpeg API constructor
MIT © Tomas Aparicio