【问题标题】:Using ffmpeg in node, without using fluent-ffmpeg在节点中使用 ffmpeg,而不使用 fluent-ffmpeg
【发布时间】: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


【解决方案1】:

终于找到解决办法了 正如 marekful 建议的那样,问题出在 "overlay=10:10" 字符串中,

所以我取了另一个变量 str = "overlay=10:10" ,并将其作为参数传递,它就像魅力一样工作。

感谢 Marekful。

const execFile = require('child_process').execFile;
const str = "overlay=10:10";
const child = execFile('ffmpeg', ['-i', 'input.mp4' , '-i' , 'logo.png' , '-filter_complex' , str , 'output.mp4' ], (error, stdout, stderr) => {
    if (error) {
        console.error('stderr: =============================', stderr);
        throw error;
    }
    console.log('stdout: ==========================', stdout);
});

console.log('here');

【讨论】:

    猜你喜欢
    • 2015-07-09
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 2020-04-14
    • 1970-01-01
    相关资源
    最近更新 更多