【发布时间】:2019-03-31 20:34:55
【问题描述】:
我正在生成一系列帧并将它们作为缓冲区保存在 Redis 数据库中。目前,我正在努力找出如何将它们导入 FFmpeg 以创建视频。使用这种方法来支持将帧保存在磁盘上的目的是提高性能。生成的视频时长不超过 3 分钟。
在以下函数中,我尝试从 Redis 收集所有帧,将它们连接在一起并使用 stream-buffers 将它们保存到临时缓冲区中。然后我尝试使用fluent-ffmpeg 最终输出视频。
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')
}
【问题讨论】:
-
您能否提供您在“不起作用”部分遇到的任何错误?
-
我的应用卡住了,不会输出任何错误。我可以在块之前记录,但不能在块的第一行之后
-
cache.get(...)返回的数据类型是什么?你的框架数组被填满了吗? -
我收到了字符串,这可能是问题所在。
-
将数据转换为缓冲区
data = Buffer.from(data)后,代码运行并退出并出现错误:TypeError: Cannot read property 'isStream' of undefined at runFfprobe
标签: javascript node.js ffmpeg redis fluent-ffmpeg