node.js - 在node中使用ffmpeg,而不使用fluid-ffmpeg

标签 node.js video ffmpeg child-process

我正在使用 ffmpeg,但没有使用 Fluent-ffmpeg。我正在使用 Node 中的“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 中的默认入口点)的内容。并使用 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');

我收到一个错误,即,

No such filter: '"overlay' Error initializing complex filters. Invalid argument

/Users/neerpatel/Desktop/testProjects/childProcess/index.js:7 throw error; ^

Error: Command failed: ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp4

您可以清楚地看到,直接在终端中运行的相同命令在我将其传递到子进程中时不起作用。为什么会发生这种情况?

此外,我想添加标签“水印”,但我无法创建标签,因为我的声誉低于 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');

最佳答案

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

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

谢谢马立克弗。

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');

关于node.js - 在node中使用ffmpeg,而不使用fluid-ffmpeg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50351142/

相关文章:

css - 视频背景创建水平滚动

c - libavcodec/libx264 不尊重 keyint_min

ffmpeg - 哪个是使用 ffmpeg 的更好方法?

node.js - 如何使用 Angular 应用程序作为 Node.js 的 View 引擎

node.js - 如何在 ethers.js 中正确使用 swapExactETHForTokens 方法?

node.js - 如何为生产关闭 Node.js Express(ejs 模板引擎)错误?

c - 每帧的 ffmpeg 边数据或元数据

node.js - 如何将 NodeJS 应用程序部署到 Heroku?

php - FFMPEG : Add a fixed size image on a video, 不管视频的宽高(分辨率)

python - 读取视频文件时 OpenCV 内存不足