This repository has been archived by the owner on Dec 2, 2017. It is now read-only.
/
ConversionPipeline.js
82 lines (70 loc) · 2.5 KB
/
ConversionPipeline.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
var async = require('asyncawait/async');
var await = require('asyncawait/await');
var Promise = require('bluebird');
var Pipeline = require('pipes-and-filters');
var Temp = Promise.promisifyAll(require('temp'));
var ffmpeg = require('fluent-ffmpeg');
var fs = Promise.promisifyAll(require('fs-extra'));
module.exports.convertAsync = async (function (inputFile) {
return conversionPipeline.executeAsync(inputFile);
});
// Video to gif conversion pipeline
var conversionPipeline = Promise.promisifyAll(
Pipeline.create('Conversion pipeline'));
// Add filters to conversion pipeline
conversionPipeline.use(async (ffmpegPaletteGen));
conversionPipeline.use(async (ffmpegPaletteuse));
function ffmpegPaletteGen(inputTempFile, next) { var tempFile = Temp.path(
{
prefix: 'gifbox-',
suffix: '.png'
});
console.log(
'FFmpeg step 1 will write to file '
+ tempFile
+ '...');
await (new Promise(function (resolve, reject) {
// Generate palette
// FFmpeg params found on the interwebz
ffmpeg(inputTempFile)
.videoFilters('fps=10,scale=320:-1:flags=lanczos,palettegen')
.on('end', resolve)
.on('error', reject)
.addOption('-threads', '0')
.save(tempFile);
}));
console.log('FFmpeg step 1 done.');
next(null, { inputTempFile: inputTempFile, paletteTempFile: tempFile });
}
function ffmpegPaletteuse(inputTempFiles, next) {
var tempFile = Temp.path(
{
prefix: 'gifbox-',
suffix: '.gif'
});
console.log(
'FFmpeg step 2 will write to file '
+ tempFile
+ '...');
try {
await (new Promise(function (resolve, reject) {
// Generate gif
// FFmpeg params found on the interwebz
ffmpeg()
.input(inputTempFiles.inputTempFile)
.input(inputTempFiles.paletteTempFile)
.complexFilter([
'fps=10,scale=640:-1:flags=lanczos[x];[x][1:v]paletteuse'
])
.on('end', resolve)
.on('error', reject)
.addOption('-threads', '0')
.save(tempFile);
}));
console.log('FFmpeg step 2 done.');
next(null, tempFile);
} finally {
// Remove the palette file, as it was consumed already
await (fs.unlinkAsync(inputTempFiles.paletteTempFile));
}
}