Преобразование нескольких буферов JPG в анимированный GIF с помощью nodejs, с потоками и каналами (не файловая система) - PullRequest
0 голосов
/ 24 июня 2019

Я пытаюсь загрузить последовательность 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).

Моя интуиция говорит мне, что у меня две проблемы. Мне нужно

  1. преобразовать вывод декодера JPG каким-либо образом, прежде чем передавать его в gif-кодировщик, чтобы я не получил бессмысленный GIF (возможно, с использованием библиотеки concat-frames), и
  2. обеспечивает способ разделения буферов в потоке чтения, чтобы декодер знал, как сбросить свое состояние, прежде чем приступить к следующему буферу данных JPG.

Но я не уверен, каквыполните одно из следующих действий.

Есть ли способ сделать это без записи jpgs в файл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...