【发布时间】:2018-05-16 13:21:21
【问题描述】:
我正在使用 ffmpeg 而不使用 fluent-ffmpeg。我正在使用节点中的“child_process”。
首先,我验证了如何将多个参数传递给子进程命令。我在下面的代码中验证了它。
我使用了这样的复制命令
cp vid1.mp4 vid2.mp4
成功将vid1复制到vid2中。
const execFile = require('child_process').execFile;
const child = execFile('cp', ['vid1.mp4', 'vid3.mp4'], (error, stdout, stderr) => {
if (error) {
console.error('stderr: =============================', stderr);
throw error;
}
console.log('stdout: ==========================', stdout);
});
console.log('here');
上面的代码是“index.js”的内容(节点中的默认入口点)。并使用 node . 运行它,它成功地将 vid1 复制到 vid3 中。
现在,我想为给定的视频添加水印。为此,我正在使用这个tutorial。目前实战教程链接失效,可以查看here。
这是我正在使用的命令
ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp4
现在我正在使用同样的命令,
const execFile = require('child_process').execFile;
const child = execFile('ffmpeg', ['-i', 'input.mp4' , '-i' , 'logo.png' , '-filter_complex' , '"overlay=10:10"' , 'output.mp4' ], (error, stdout, stderr) => {
if (error) {
console.error('stderr: =============================', stderr);
throw error;
}
console.log('stdout: ==========================', stdout);
});
console.log('here');
我得到一个错误,那个,
没有这样的过滤器:'"overlay' 初始化复杂过滤器时出错。无效 论据
/Users/neerpatel/Desktop/testProjects/childProcess/index.js:7 抛出错误; ^
错误:命令失败:ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp4
您可以清楚地看到直接在终端中运行的相同命令,当我将它传递给子进程时不起作用。为什么会这样?
此外,我想添加标签 'watermarking' ,但我无法创建标签,因为我的声誉低于 1500。请有人这样做。
更新: 我使用了 EXEC ,而不是 execFile 。它就像魅力一样工作,但父文件一直在等待子进程。子进程永远不会返回 END 信号。这是我的代码。
const exec = require('child_process').exec;
const child = exec('ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp4', (error, stdout, stderr) => {
if (error) {
console.error('stderr: =============================', stderr);
throw error;
}
console.log('stdout: ==========================', stdout);
});
console.log('here');
【问题讨论】:
-
有人可以提一下用户stackoverflow.com/users/5726027/gyan他通常会帮助大家解决与ffmpeg相关的问题。
-
您是否注意到错误消息将过滤器称为
"overlay? filter_complex 的 value 选项不需要引号,除非它有空格。尝试不带引号,例如[..., '-filter_complex', 'overlay=10:10', ...]或干脆[..., '-filter_complex overlay=10:10', ...] -
@marekful ,如果我输入如下所示的命令 >>> ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp4
-
这很奇怪,但并非史无前例,或者您应该花太多时间思考的事情。可能是 Node 中的一个错误,但显然终端和 Node 的 child_process.exec 解释/处理字符串中的引号的方式有所不同。
-
感谢您的帮助@marekful
标签: node.js video ffmpeg child-process