【问题标题】:passing options in execFileSync fails for ffmpeg在 execFileSync 中传递选项对于 ffmpeg 失败
【发布时间】:2018-10-17 09:50:04
【问题描述】:

我正在尝试编写一个小脚本来自动创建视频文件。我几乎可以工作但卡在一个部分,以下是我的节点 js 代码:

let str1 = "-c:v libvpx -i sourceVideos/a1.mkv -c:v libvpx -i sourceVideos/a2.mkv -c:v libvpx -i sourceVideos/a3.mkv";
let str2 = "[1]setpts=PTS+5.00/TB[a2];[2]setpts=PTS+10.00/TB[a3];[0][a2]overlay[o2];[o2][a3]overlay";
let outFile = 'validout.mp4';
const masterStream = execFileSync('ffmpeg', [str1, '-filter_complex', str2, outFile]);

console.log('All processing completed');

上面的代码代表这个 ffmpeg 命令从多个视频创建一个视频:

ffmpeg -c:v libvpx -i sourceVideos/a1.mkv -c:v libvpx -i sourceVideos/a2.mkv -c:v libvpx -i sourceVideos/a3.mkv -filter_complex "[1]setpts=PTS+5.00/TB[a2];[2]setpts=PTS+10.00/TB[a3];[0][a2]overlay[o2];[o2][a3]overlay" validationout.mp4

所以我将参数放在 str2 中,将选项/输入放在 str1 中。问题是,当我在 str1 中传递带有选项的输入并将其放在我的 execFileSync 命令中时,该命令不会对其进行解析。我还测试了确认,如果我以以下格式传递选项,它可以在节点 js 脚本中工作:

//version 1 with separated arguments
const masterStream = execFileSync('ffmpeg', ['-c:v', 'libvpx', '-i', 'sourceVideos/a1.mkv', '-c:v', 'libvpx', '-i', 'sourceVideos/a2.mkv', '-c:v', 'libvpx', '-i', 'sourceVideos/a3.mkv', '-filter_complex', str2, outFile]);

我的问题是:如何将选项/输入传递给 str1 中的 execFileSync 以便执行?

【问题讨论】:

  • 如果启用shell: trueexecFileSync('ffmpeg), [...args], { shell: true }), 会发生什么?
  • 嘿!!!....它起作用了...您能详细说明发生了什么变化吗?我将标记这是正确的响应。谢谢@axm__

标签: node.js ffmpeg


【解决方案1】:

-i sourceVideos/a1.mkv 这样组合在一起的参数应该分开(-isourceVideos/a1.mkv,如果你没有在shell: true 对象中启用shell: true

execFileSync('ffmpeg'), ['-i', 'sourceVideos/a1.mkv']) // must be separate
// or
execFileSync('ffmpeg', ['-i sourceVideos/a1.mkv'], { shell: true })

这确实应该放在 nodejs 文档中。显然,这与程序在C 中的调用方式有关。请参阅this answer 了解更多信息。

【讨论】:

    猜你喜欢
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    相关资源
    最近更新 更多