Передача кадров в ffmpeg с помощью Node - PullRequest
0 голосов
/ 06 января 2020

У меня есть NodeJS, который генерирует изображения, и передает мне массив с именем sceneData, который представляет собой массив в формате: [ ['./frame1.jpg', 0.25], ['./frame2.jpg', 0.5] ] (framePath, secondsToShowFor). Я хочу передать данные кадра с диска в ffmpeg, так как для этого количества секунд требуется много кадров.

Я уже написал это, но это не работает. Сценарий не закрывается, и у меня остается 0-байтовый файл mp4. У кого-нибудь есть идеи, как передать кадры в ffmpeg с диска с узлом?

const { spawn } = require('child_process')
const fs = require('fs')

function getFfmpeg (framerate, outputFilename = './test.mp4') {
  const args = `-f image2pipe -vcodec mjpeg -s 1920x1080 -i - -f mp4 -r ${framerate} ${outputFilename}`.split(' ')
  const ffmpeg = spawn('ffmpeg', args)

  ffmpeg.stdout.pipe(process.stdout)
  ffmpeg.stderr.pipe(process.stderr)

  return ffmpeg
}

// In the form of [framePath, duractionInSeconds]
async function generateVideo (sceneData, framerate = 24) {
  const ffmpeg = getFfmpeg(framerate)

  for (const sD of sceneData) {
    // # of frames it'll be shown for
    const frames = Math.ceil(framerate * sD[1])

    for (let i = 0; i < frames; i++) {
      const readStream = fs.createReadStream(sD[0])
      readStream.pipe(ffmpeg.stdin, { end: false })
      readStream.close()
    }
  }
}

module.exports = {
  generateVideo
}

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