node.js - Ffmpeg 将图像中的视频与视频和音频剪辑合并
问题描述
有一个关于 fluent ffmpeg 的问题,我对它很陌生,所以需要一些帮助。
我正在尝试从 S3 获取图像和视频,以便从中制作完整的视频。所以我正在用 .loop 从图像中制作具有一定视频长度的视频。然后我正在添加一个带有音频的普通视频。然后我正在削减音频长度,因此添加的音频将仅在由图像制作的视频上播放。当与图像中的视频合并的视频开始播放时,它将有自己的音频。问题是,如果我合并所有视频,我会收到此错误:
An error occurred while merging video files: ffmpeg exited with code 1: Cannot find a matching stream for unlabeled input pad 7 on filter Parsed_concat_0.
所以我需要向不是由图像制作的视频添加音频,以便流可以工作。我怎样才能避免这种情况并让该视频拥有自己的音频?我应该添加什么 inputOptions?另外,当我剪切音频时,它有延迟,我可以添加哪些音频过滤器?
``
const videosFromImages = [];
VIDEO_CONFIG.fragments.forEach((fragment) => {
videosFromImages.push(function (callback) {
let ffmpegInstance = ffmpeg(
`./images/images-with-same-size/${fragment.filename}`
);
if (fragment.duration && fragment.type === "image") {
ffmpegInstance.loop(fragment?.duration);
}
if (fragment.type === "image") {
ffmpegInstance
.addInput("./audio/audio.mp3")
.inputOptions(
"-ss",
time,
"-to",
time + fragment.duration,
"-async",
"1"
);
time = time + fragment.duration;
console.log("time:", time);
}
ffmpegInstance
.videoCodec("libx264") // Codec from api
.videoBitrate("12000k") // Video Quality
.videoFilters([
{
filter: "fade",
options: "in:0:15",
},
]) // Transitions
.on("error", function (err) {
console.error("An error occurred: " + err.message);
})
.on("end", function () {
res.write(`<p>Processing finished for ${fragment.filename}</p>`);
fragment.filePath = `./output/project-${VIDEO_CONFIG.projectId}/videos/video-${fragment.filename}.avi`;
callback(null, fragment);
})
.save(
`./output/project-${VIDEO_CONFIG.projectId}/videos/video-${fragment.filename}.avi`
);
});
});
async.series(videosFromImages, function (err, videosFromImages) {
// result now equals 'done'
async.waterfall(
[
(done) => {
console.log("VIDEO_CONFIG", VIDEO_CONFIG.fragments);
VIDEO_CONFIG.fragments
.reduce((prev, curr) => prev.input(curr.filePath), ffmpeg())
.outputFPS(60)
.on("error", (err) => {
res.end();
console.log(
`An error occurred while merging video files: ${err.message}`
);
})
.on("end", () => {
res.write("FINAL VIDEO END");
res.end();
console.log("end:");
})
.mergeToFile(
`./output/project-${VIDEO_CONFIG.projectId}/final-video-${VIDEO_CONFIG.projectId}.mp4`
);
done(null);
},
],
(err) => {
if (err) {
console.log("err:", err);
}
}
);
});
res.write("<p>Processing</p>");
} catch (error) {
console.error("error:", error);
}
``
解决方案
推荐阅读
- javascript - click() 调用点击函数不返回点击函数
- mysql - 如何修复此 mysql 创建表语法错误
- mongodb - 课程表 MongoDB
- java - 使用 JCEF 进行反向和慢速滚动(离屏渲染,操作系统:Linux)
- c# - 如何在 AddRange 之后按升序对列表进行排序
- c# - Task.WaitAll 的使用没有任何“等待”运算符导致警告 CS1998 此异步方法缺少“等待”运算符,将同步运行
- assembly - 星形图案打印不好
- symfony5 - Symfony 5 防火墙:只允许匿名访问
- reactjs - 只让受信任的 Web 客户端注册新用户:如何在 Web 前端发送 HMAC 机密
- python - 使用日期时间时如何在 x 轴上显示时间?