Поискал я готовые модули в npm для работы с ImageMagick и FFmpeg, и то что нашел мне не понравилось. Хотелось бы один поток на входе растасовывать на несколько потоков на выходе, и для этого написал я свой велосипед. В качестве модуля этот код я не вижу, а для примера сгодится. Смотрим внимательно...
Начнем с ImageMagick. Есть картинка 600х600:
Задача: сделать из нее несколько картинок размером поменьше.
Решение - im-resize.js:
var spawn = require('child_process').spawn; var PassThrough = require('stream').PassThrough; var fs = require('fs'); var filename = process.argv[2]; var sizes = process.argv.slice(3); var i = sizes.length; var time = timer(); var pass = new PassThrough(); var readable = fs.createReadStream(process.argv[2]).pipe(pass); sizes.forEach(function(size) { var proc = spawn('convert', ['-resize', size, ':-', ':-']); proc.on('error', errHandler(size + ' process err:')); proc.stdin.on('error', errHandler(size + ' process stdinc err:')); proc.stdout.on('error', errHandler(size + ' process stdout err:')); proc.stderr.on('error', errHandler(size + ' process stderr err:')); proc.stderr.on('data', errHandler(size + ' process stderr data:')); proc.stdout.pipe(fs.createWriteStream((function() { // здесь собираем имя нового файла var arr = filename.split('.'), i = arr.length - 2; arr[i] = arr[i] + '-' + size; return arr.join('.'); })())); proc.stdout.on('end', function() { console.log(size + ' is ready'); if (!--i) console.log('Time: %s ms', time()); }); pass.pipe(proc.stdin); }); function errHandler(s) { return function(err) { console.error(s, err.toString()); } } function timer(s) { var time = Date.now(); return function() { return Date.now() - time; } }
Легким движением руки брюки превращаются...
Для того, чтобы убедиться в асинхронности создания картинок можно выполнить код еще раз и обратить внимание на иной порядок появления сообщений в консоли:
Переходим к FFmpeg. Есть видео 640x360 в формате mp4:
Для того, чтобы убедиться в асинхронности создания картинок можно выполнить код еще раз и обратить внимание на иной порядок появления сообщений в консоли:
Переходим к FFmpeg. Есть видео 640x360 в формате mp4:
Задача: сделать из него несколько видео размером поменьше в формате flv.
Код решения почти не отличается от предыдущего - ff-resize.js:
Вот как-то так. Ничего подобного в сети мне обнаружить не удалось. Может плохо искал, может потому что сегодня 1-е января нового 2015-го года... С новым годом!
Код решения почти не отличается от предыдущего - ff-resize.js:
var spawn = require('child_process').spawn; var PassThrough = require('stream').PassThrough; var fs = require('fs'); var filename = process.argv[2]; var sizes = process.argv.slice(3); var i = sizes.length; var time = timer(); var pass = new PassThrough(); var readable = fs.createReadStream(process.argv[2]).pipe(pass); sizes.forEach(function(size) { // если не выставить loglevel то получим много букафф в stderr data var proc = spawn('ffmpeg', ['-i', 'pipe:0', '-s', size, '-f', 'flv', 'pipe:1', '-loglevel', 'panic']); proc.on('error', errHandler(size + ' process err:')); proc.stdin.on('error', errHandler(size + ' process stdinc err:')); proc.stdout.on('error', errHandler(size + ' process stdout err:')); proc.stderr.on('error', errHandler(size + ' process stderr err:')); proc.stderr.on('data', errHandler(size + ' process stderr data:')); proc.stdout.pipe(fs.createWriteStream((function() { // здесь собираем имя нового файла var arr = filename.split('.'), i = arr.length - 2; arr[i] = arr[i] + '-' + size; arr[i + 1] = 'flv'; return arr.join('.'); })())); proc.stdout.on('end', function() { console.log(size + ' is ready'); if (!--i) console.log('Time: %s ms', time()); }); pass.pipe(proc.stdin); }); function errHandler(s) { return function(err) { console.error(s, err.toString()); } } function timer(s) { var time = Date.now(); return function() { return Date.now() - time; } }Выполняем, на этот раз все не так легко...
Вот как-то так. Ничего подобного в сети мне обнаружить не удалось. Может плохо искал, может потому что сегодня 1-е января нового 2015-го года... С новым годом!
Комментариев нет:
Отправить комментарий
Комментарий будет опубликован после модерации