У меня есть 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
}