Свободный поток ffmpeg из буфера - PullRequest
1 голос
/ 05 января 2020

У меня есть функция streamtogif () с ffmpeg, которая преобразует поток в gif и возвращает буфер. Это прекрасно работает, но здесь я использую busboy, и я получаю весь файл в качестве буфера. Наконец, я хотел бы передать это ffmpeg, чтобы обратиться к бывшему. MP4 в подарок. Вот мой код: streamtogif ():

function streamtogif(stream, begintime = 0, duration){ //Return promise buffer
  return new Promise((resolve, reject)=>{
  buffer = [] //prepare creation of the buffer for the gif
    function addChunk(chunk){ 
      this.buffer.push(chunk)
    }
    function getBuffer(cb){ //get buffer array
      cb(this.buffer);
    }
    ffmpegstream = ffmpeg()
    .outputOptions('-metadata', 'title=test')
    .input(stream)
    .fps(20)
    .setStartTime(begintime)
    .noAudio()
    .videoCodec('gif')
    .format('gif')

    if(duration){ffmpegstream.duration(duration)} //only define duration if defined in function's parameters
    ffmpegstream.on('start',()=>{
      //console.log("starting")
      this.buffer = []
    })
    .on('end', ()=>{ 
      getBuffer((buff)=>{
      finalBuffer = Buffer.concat(buff);
      resolve(finalBuffer);
      });
  }) 

    var ffstream = ffmpegstream.pipe(); //handle data 
    ffstream.on('data', function(chunk) {
      addChunk(chunk);
    })


    ffmpegstream.run()
  });
}

Код, использующий эту функцию: // я не помещаю все, но необходимо

            finalBuffer = Buffer.concat(this.fileRead)
            const bufferStream = new Stream.PassThrough();
            bufferStream.end(finalBuffer);
            streamtogif(bufferStream).then((buffer)=>{
              upload = uploadpicture(buffer, "source/sportifeed").then((response)=>{ //success request
                res.status(200).json({success: true, message: "Successfully uploaded !", url: response.data.link});
              },(err)=>{ //error
                console.log(err)
                res.status(500).json({success: false, message: "Error happenned while uploading !"});
              }).catch((err)=>{
                console.log(err)
                res.status(500).json({success: false, message: "Error happenned while uploading !"});
              });
            },(err)=>{
              console.log(err);
            })

Когда я передаю поток, поступающий из ytdl-core, например, все работает нормально, но в этом случае я получаю сообщение об ошибке:

Произошла ошибка: ffmpeg завершен с кодом 1: pipe: 0: при обработке ввода обнаружены неверные данные : ffmpeg завершен с кодом 1: pipe: 0: при обработке ввода обнаружены неверные данные

at ChildProcess.<anonymous> (C:\Users\famil\Desktop\sportifeed\node_modules\fluent-ffmpeg\lib\processor.js:182:22)
at ChildProcess.emit (events.js:198:13)
at Process.ChildProcess._handle.onexit (internal/child_process.js:248:12) ffmpeg version N-92722-gf22fcd4483

Авторские права (c) 2000-2018 разработчики FFmpeg построили с помощью g cc 8.2.1 (G CC) 20181201

Когда я печатаю поток из функции streamtogif, я получаю это https://pastebin.com/NHmySWdm Это не кажется пустым

Спасибо за вашу помощь

Ps: я тоже пытался с bufferstream и пытался: https://gist.github.com/chris9753/86121a07c4aa27fcd654d16133799d30 Я пытался передать файл из busboy? Не сработало, буквально не подняло ошибку

...