Я пытаюсь загрузить последовательность jpg из Amazon S3 и превратить их в анимированный GIF.
Я могу загрузить файлы jpg из S3 таким образом, чтобы получить буфер данных.Но мне не ясно, как я могу передать каждый из них в jpg-декодер (масштабирующий изображение), а затем передать конечный результат в gif-кодировщик, чтобы сделать анимированный gif.Я чувствую, что я близко, но я изо всех сил пытаюсь найти хорошую документацию по некоторым из этих модулей.
Вот где я до сих пор добирался, используя jpg-stream и gifencoder.И найти некоторые идеи из Написание анимированного GIF из BufferedImages и Передача нескольких JPG в анимированный GIF с использованием Node JS , оба из которых зависят от файлов JPG в файловой системе и из Преобразование буфера в ReadableStream в Node.js .
Моя проблема заключается в определении того, как правильно передать поток буферов из нескольких файлов jpg в один декодер и последующий конвейер.
(Обратите внимание, что downloadFile()
- это написанная мной функция, которая возвращает обещание, содержащее буфер данных.
const fs = require('fs')
const stream = require("stream")
const s3 = new AWS.S3()
const JPEGDecoder = require('jpg-stream/decoder')
const GIFEncoder = require('gifencoder')
const encoder = new GIFEncoder(480, 270)
const decoder = new JPEGDecoder({ width: 480, height: 270 })
const readable = new stream.Readable()
readable._read = () => {}
videofiles.map(f => {
downloadFile(bucket, f.Key, s3)
.then(data => {
readable.push(data.Body)
})
.catch(console.log)
})
readable.pipe(decoder).pipe(encoder.createWriteStream({ repeat: -1, delay: 500, quality: 10 })).pipe(fs.createWriteStream('myanimated.gif'))
Вышеприведенное создает gibberish gif (используя, я полагаю,первый файл jpg), затем он также возвращает следующую ошибку: Error: Improper call to JPEG library in state 200
(я полагаю, как только декодер получит второй буфер jpg).
Моя интуиция говорит мне, что у меня две проблемы. Мне нужно
- преобразовать вывод декодера JPG каким-либо образом, прежде чем передавать его в gif-кодировщик, чтобы я не получил бессмысленный GIF (возможно, с использованием библиотеки concat-frames), и
- обеспечивает способ разделения буферов в потоке чтения, чтобы декодер знал, как сбросить свое состояние, прежде чем приступить к следующему буферу данных JPG.
Но я не уверен, каквыполните одно из следующих действий.
Есть ли способ сделать это без записи jpgs в файл?