Javascript 将一系列节点JS缓冲区管道化到ffmpeg
我正在生成一系列帧,并将它们保存为Redis数据库中的缓冲区。目前,我正在努力找出如何将它们导入FFmpeg以创建视频。使用这种方法在磁盘上保存帧的目的是提高性能。生成的视频长度不会超过3分钟 在下面的函数中,我尝试从Redis收集所有帧,将它们连接在一起,并使用将它们保存到临时缓冲区中。然后我试着用它来最终输出视频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 <
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()
您能提供“不工作”中出现的任何错误吗部分?我的应用程序只是被卡住了,不会输出任何错误。我可以在块之前记录,但不能在块的第一行之后记录。返回的缓存数据类型是什么。获取(…)
?帧数组是否已满?我获取字符串,这可能是问题所在。在将数据转换为bufferdata=buffer.from(data)之后
代码运行通过并退出时出现错误:TypeError:无法读取runFfprobe处未定义的属性“isStream”