FFMPEG:如何结合视频和图像(视频模板)
FFMPEG: How to combine video and image (video template)
目标
我有一个视频和一个图像(视频的模板),我正在尝试将它们组合成一个输出视频(1080w x 1920h - 9:16 纵横比)。
- 输入视频 - 1920x1080
- 输入图像 - 1080x1920
- 输出视频 - 1080x1920
This image 展示了我想要完成的事情。两个橙色部分是输入图像 - 它是单个 .png
,中间有一个透明部分用于视频。
如标题中所述,我正在尝试使用 FFMPEG
来完成此操作。更具体地说,我正在使用 fluent-ffmpeg npm 包。
当前状态
我可以很好地读取两个输入,但我很难让两者很好地相互配合。
如果叠加层正常工作,那么我的输出视频是 1920x1080 而不是 1080x1920。
如果我得到正确的输出视频尺寸,那么视频要么被拉伸,要么我在添加叠加层时出错。
代码
这是我目前拥有的。我很乐意回答任何问题。预先感谢您的关注:)
var ffmpeg = require('fluent-ffmpeg');
var command = ffmpeg();
var timemark = null;
command
.on('end', onEnd )
.on('progress', onProgress)
.on('error', onError)
.input('./input-video.mp4')
.input('./template.png')
.complexFilter([
{
filter: 'scale',
options: { width: 1080, height: 1920 }
},
// {
// filter: 'overlay',
// options: { x: 100, y: 100 }
// },
])
.outputFps(30)
.output('./output-video.mp4')
.run();
/* Misc */
function onProgress(progress){
if (progress.timemark != timemark) {
timemark = progress.timemark;
console.log('Time mark: ' + timemark + "...");
}
}
function onError(err, stdout, stderr) {
console.log('Cannot process video: ' + err.message);
}
function onEnd() {
console.log('Finished processing');
}
感谢 Reddit 上的用户 Voldrix_Suroku,我才能够解决这个问题。
为了避免成为 DenverCoder9 使它起作用的 CLI 命令是:
ffmpeg -i input-video.mp4 -i template.png -filter_complex "[0:V]scale=1080:-1,pad=0:1920:0:(oh-ih)/2[vid];[vid][1:v]overlay" output-video.mp4
如果您像我一样使用 fluent-ffmpeg
,完整代码如下:
var ffmpeg = require('fluent-ffmpeg');
var command = ffmpeg();
var timemark = null;
command
.on('end', onEnd )
.on('progress', onProgress)
.on('error', onError)
.input('./input-video.mp4')
.input('./template.png')
.complexFilter([
"[0:V]scale=1080:-1,pad=0:1920:0:(oh-ih)/2[vid];[vid][1:v]overlay"
])
.outputFps(30)
.output('./output-video.mp4')
.run();
/* Misc */
function onProgress(progress){
if (progress.timemark != timemark) {
timemark = progress.timemark;
console.log('Time mark: ' + timemark + "...");
}
}
function onError(err, stdout, stderr) {
console.log('Cannot process video: ' + err.message);
}
function onEnd() {
console.log('Finished processing');
}
目标
我有一个视频和一个图像(视频的模板),我正在尝试将它们组合成一个输出视频(1080w x 1920h - 9:16 纵横比)。
- 输入视频 - 1920x1080
- 输入图像 - 1080x1920
- 输出视频 - 1080x1920
This image 展示了我想要完成的事情。两个橙色部分是输入图像 - 它是单个 .png
,中间有一个透明部分用于视频。
如标题中所述,我正在尝试使用 FFMPEG
来完成此操作。更具体地说,我正在使用 fluent-ffmpeg npm 包。
当前状态
我可以很好地读取两个输入,但我很难让两者很好地相互配合。
如果叠加层正常工作,那么我的输出视频是 1920x1080 而不是 1080x1920。
如果我得到正确的输出视频尺寸,那么视频要么被拉伸,要么我在添加叠加层时出错。
代码
这是我目前拥有的。我很乐意回答任何问题。预先感谢您的关注:)
var ffmpeg = require('fluent-ffmpeg');
var command = ffmpeg();
var timemark = null;
command
.on('end', onEnd )
.on('progress', onProgress)
.on('error', onError)
.input('./input-video.mp4')
.input('./template.png')
.complexFilter([
{
filter: 'scale',
options: { width: 1080, height: 1920 }
},
// {
// filter: 'overlay',
// options: { x: 100, y: 100 }
// },
])
.outputFps(30)
.output('./output-video.mp4')
.run();
/* Misc */
function onProgress(progress){
if (progress.timemark != timemark) {
timemark = progress.timemark;
console.log('Time mark: ' + timemark + "...");
}
}
function onError(err, stdout, stderr) {
console.log('Cannot process video: ' + err.message);
}
function onEnd() {
console.log('Finished processing');
}
感谢 Reddit 上的用户 Voldrix_Suroku,我才能够解决这个问题。
为了避免成为 DenverCoder9 使它起作用的 CLI 命令是:
ffmpeg -i input-video.mp4 -i template.png -filter_complex "[0:V]scale=1080:-1,pad=0:1920:0:(oh-ih)/2[vid];[vid][1:v]overlay" output-video.mp4
如果您像我一样使用 fluent-ffmpeg
,完整代码如下:
var ffmpeg = require('fluent-ffmpeg');
var command = ffmpeg();
var timemark = null;
command
.on('end', onEnd )
.on('progress', onProgress)
.on('error', onError)
.input('./input-video.mp4')
.input('./template.png')
.complexFilter([
"[0:V]scale=1080:-1,pad=0:1920:0:(oh-ih)/2[vid];[vid][1:v]overlay"
])
.outputFps(30)
.output('./output-video.mp4')
.run();
/* Misc */
function onProgress(progress){
if (progress.timemark != timemark) {
timemark = progress.timemark;
console.log('Time mark: ' + timemark + "...");
}
}
function onError(err, stdout, stderr) {
console.log('Cannot process video: ' + err.message);
}
function onEnd() {
console.log('Finished processing');
}