Javascript 将一系列节点JS缓冲区管道化到ffmpeg

Javascript 将一系列节点JS缓冲区管道化到ffmpeg,javascript,node.js,ffmpeg,redis,fluent-ffmpeg,Javascript,Node.js,Ffmpeg,Redis,Fluent Ffmpeg,我正在生成一系列帧,并将它们保存为Redis数据库中的缓冲区。目前,我正在努力找出如何将它们导入FFmpeg以创建视频。使用这种方法在磁盘上保存帧的目的是提高性能。生成的视频长度不会超过3分钟 在下面的函数中,我尝试从Redis收集所有帧,将它们连接在一起,并使用将它们保存到临时缓冲区中。然后我试着用它来最终输出视频 let renderVideo = async () => { let data let frames = [] for (let i = 0; i <

我正在生成一系列帧,并将它们保存为Redis数据库中的缓冲区。目前,我正在努力找出如何将它们导入FFmpeg以创建视频。使用这种方法在磁盘上保存帧的目的是提高性能。生成的视频长度不会超过3分钟

在下面的函数中,我尝试从Redis收集所有帧,将它们连接在一起,并使用将它们保存到临时缓冲区中。然后我试着用它来最终输出视频

let renderVideo = async () => {
  let data

  let frames = []

  for (let i = 0; i <= readyFrames.length - 1; i++) {
    data = await cache.get(`frame_${i}`)
    frames.push(data)
  }

  let allFramesTogether = Buffer.concat(frames) // Does
  tempReadableBuffer.put(allFramesTogether)     // not
  ffmpeg().input(tempReadableBuffer)            // work

  ffmpeg()
    .outputOptions(['-f image2pipe', '-pix_fmt yuv420p'])
    .videoCodec('libx264')
    .size(`${dimensions.width}x${dimensions.height}`)
    .format('mp4')
    .fps(FPS)
    .on('progress', function(progress) {
      console.log('Processing: ' + progress.percent + '% done')
    })
    .on('end', function() {
      console.log('Processing finished !')
    })
    .on('stderr', function(stderrLine) {
      console.log('Stderr output: ' + stderrLine)
    })
    .on('error', function(err, stdout, stderr) {
      console.log('Cannot process video: ' + err.message)
    })
    .save('test.mp4')
}
让renderVideo=async()=>{
让数据
设帧=[]

因为(让i=0;i多亏了这些评论和一些研究,我能够把一些东西组合起来:

需要配置Redis,以便它输出缓冲区,而不是字符串

return_buffers: true
要浓缩保存为单个缓冲区的图像,我需要

let allFramesTogether = Buffer.concat(frames)
ffmpeg可以使用spawn作为子进程运行,而
-f
必须设置为
image2pipe
-i
-
,因此图像可以通过管道传输

const ffmpeg = spawn('ffmpeg', [
  '-r',
  `${FPS}`,
  '-f',
  'image2pipe',
  '-s',
  `${dimensions.width}x${dimensions.height}`,
  '-i',
  '-',
  '-vcodec',
  'libx264',
  '-crf',
  '25',
  '-pix_fmt',
  'yuv420p',
  'test.mp4'
])

要最终管道化图像,我会在上面的代码之后立即执行
ffmpeg.stdin.write(allFramesTogether)
,然后执行
ffmpeg.stdin.end()

您能提供“不工作”中出现的任何错误吗部分?我的应用程序只是被卡住了,不会输出任何错误。我可以在块之前记录,但不能在块的第一行之后记录。返回的
缓存数据类型是什么。获取(…)
?帧数组是否已满?我获取字符串,这可能是问题所在。在将数据转换为buffer
data=buffer.from(data)之后
代码运行通过并退出时出现错误:
TypeError:无法读取runFfprobe处未定义的属性“isStream”