如何像facebook用照片那样用nodejs制作视频模块
how to make video module with nodejs like facebook did with photos
只是想知道如何开始?需求:
有大约 10 张照片,能够制作 5-10 秒的小视频,例如动画(过渡?),我想重现 facebook 视频过程,如果有人知道的话,哪个技术堆栈是最好的,模块(ffmpeg,包装器 ffmpeg)(python,nodejs)。
感谢
特别是 ffmpeg 混合过滤器示例:
ffmpeg \
-loop 1 -t 1 -i 001.png \
-loop 1 -t 1 -i 002.png \
-loop 1 -t 1 -i 003.png \
-loop 1 -t 1 -i 004.png \
-loop 1 -t 1 -i 005.png \
-filter_complex \
"[1:v][0:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b1v]; \
[2:v][1:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b2v]; \
[3:v][2:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b3v]; \
[4:v][3:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b4v]; \
[0:v][b1v][1:v][b2v][2:v][b3v][3:v][b4v][4:v]concat=n=9:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4
这将为您提供一个输出 mp4,其中每个图像持续一秒钟,图像之间有 0.5 秒的淡入淡出。
-t 1
这是图像的持续时间
T,0.5
是你的渐变时间
如果您想使用节点,我会推荐 fluent-ffmpeg 库:https://github.com/fluent-ffmpeg/node-fluent-ffmpeg
我喜欢节点作为解决方案,因为您可以使用单线程并发事件循环,它将作业传递给您的 ffmpeg 模块,并允许 ffmpeg 占用您机器上的所有可用内核。
您可能有一个看起来像这样的函数:
function runFfmpeg({inputParams, input, outputParams, output}) {
return new Promise((resolve, reject) => {
const ffmpegCommand = new ffmpeg()
ffmpegCommand.input(input)
.inputOptions(inputParams)
.on('start', (command) => {
// log start
})
.on('progress', (progress) => {
// log progress
})
.on('end', () => {
resolve('SUCCESS!')
})
.on('error', (error) => {
reject(error)
})
.outputOptions(outputParams)
.output(output)
.run()
})
}
所以这只是将您的 ffmpeg 进程包装在一个承诺中,它将在完成时解析并在出错时拒绝。您可以将该函数传递给您的命令行输入参数、输入文件、输出参数和输出文件……至少是类似的东西。您可能需要针对多个输入进行调整,但它们的 github 有很好的记录!
只是想知道如何开始?需求:
有大约 10 张照片,能够制作 5-10 秒的小视频,例如动画(过渡?),我想重现 facebook 视频过程,如果有人知道的话,哪个技术堆栈是最好的,模块(ffmpeg,包装器 ffmpeg)(python,nodejs)。
感谢
特别是 ffmpeg 混合过滤器示例:
ffmpeg \
-loop 1 -t 1 -i 001.png \
-loop 1 -t 1 -i 002.png \
-loop 1 -t 1 -i 003.png \
-loop 1 -t 1 -i 004.png \
-loop 1 -t 1 -i 005.png \
-filter_complex \
"[1:v][0:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b1v]; \
[2:v][1:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b2v]; \
[3:v][2:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b3v]; \
[4:v][3:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b4v]; \
[0:v][b1v][1:v][b2v][2:v][b3v][3:v][b4v][4:v]concat=n=9:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4
这将为您提供一个输出 mp4,其中每个图像持续一秒钟,图像之间有 0.5 秒的淡入淡出。
-t 1
这是图像的持续时间
T,0.5
是你的渐变时间
如果您想使用节点,我会推荐 fluent-ffmpeg 库:https://github.com/fluent-ffmpeg/node-fluent-ffmpeg
我喜欢节点作为解决方案,因为您可以使用单线程并发事件循环,它将作业传递给您的 ffmpeg 模块,并允许 ffmpeg 占用您机器上的所有可用内核。
您可能有一个看起来像这样的函数:
function runFfmpeg({inputParams, input, outputParams, output}) {
return new Promise((resolve, reject) => {
const ffmpegCommand = new ffmpeg()
ffmpegCommand.input(input)
.inputOptions(inputParams)
.on('start', (command) => {
// log start
})
.on('progress', (progress) => {
// log progress
})
.on('end', () => {
resolve('SUCCESS!')
})
.on('error', (error) => {
reject(error)
})
.outputOptions(outputParams)
.output(output)
.run()
})
}
所以这只是将您的 ffmpeg 进程包装在一个承诺中,它将在完成时解析并在出错时拒绝。您可以将该函数传递给您的命令行输入参数、输入文件、输出参数和输出文件……至少是类似的东西。您可能需要针对多个输入进行调整,但它们的 github 有很好的记录!