使用 node fluent-ffmpeg 将图像转换为视频
Using node fluent-ffmpeg for converting images to video
我为此找到了很多示例,但其中 none 对我来说工作正常。
我有几张图片。 URL、Base64 或缓冲区。
我需要在不改变质量的情况下将它们转换为视频。
我最接近的是这个命令:
ffmpeg -framerate 1 pattern_type glob -i 'images/*.jpg' -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4
但是它每秒显示一张图像。我需要的视频是 30fps,不是 1 张 30 帧的图像,而是一秒钟 30 张图像。
有人可以帮我解决这个问题吗?
我最终使用了不同的包 - ffmpeg-stream
我从 AWS 获取图像,所以下面有一些 AWS 代码:
const frames = ['frame1.jpg', 'frame2.jpg', ...]
const conv = ffmpeg() // create converter
const input = conv.input({f: 'image2pipe', r: 30}) // create input writable stream
conv.output('out.mp4', {vcodec: 'libx264', pix_fmt: 'yuv420p'}) // output to file
// for every frame create a function that returns a promise
frames.map(filename => () =>
new Promise((fulfill, reject) =>
s3
.getObject({Bucket: '...', Key: filename})
.createReadStream()
.on('end', fulfill) // fulfill promise on frame end
.on('error', reject) // reject promise on error
.pipe(input, {end: false}) // pipe to converter, but don't end the input yet
)
)
// reduce into a single promise, run sequentially
.reduce((prev, next) => prev.then(next), Promise.resolve())
// end converter input
.then(() => input.end())
conv.run()
这是我在 github 存储库上发布的问题:
https://github.com/phaux/node-ffmpeg-stream/issues/5
我为此找到了很多示例,但其中 none 对我来说工作正常。
我有几张图片。 URL、Base64 或缓冲区。
我需要在不改变质量的情况下将它们转换为视频。
我最接近的是这个命令:
ffmpeg -framerate 1 pattern_type glob -i 'images/*.jpg' -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4
但是它每秒显示一张图像。我需要的视频是 30fps,不是 1 张 30 帧的图像,而是一秒钟 30 张图像。
有人可以帮我解决这个问题吗?
我最终使用了不同的包 - ffmpeg-stream
我从 AWS 获取图像,所以下面有一些 AWS 代码:
const frames = ['frame1.jpg', 'frame2.jpg', ...]
const conv = ffmpeg() // create converter
const input = conv.input({f: 'image2pipe', r: 30}) // create input writable stream
conv.output('out.mp4', {vcodec: 'libx264', pix_fmt: 'yuv420p'}) // output to file
// for every frame create a function that returns a promise
frames.map(filename => () =>
new Promise((fulfill, reject) =>
s3
.getObject({Bucket: '...', Key: filename})
.createReadStream()
.on('end', fulfill) // fulfill promise on frame end
.on('error', reject) // reject promise on error
.pipe(input, {end: false}) // pipe to converter, but don't end the input yet
)
)
// reduce into a single promise, run sequentially
.reduce((prev, next) => prev.then(next), Promise.resolve())
// end converter input
.then(() => input.end())
conv.run()
这是我在 github 存储库上发布的问题: https://github.com/phaux/node-ffmpeg-stream/issues/5