【问题标题】:running ffmpeg via nodejs error通过nodejs错误运行ffmpeg
【发布时间】:2017-06-20 02:55:52
【问题描述】:

我正在尝试从节点运行 ffmpeg,但出现错误。这是代码

var exec = require('child_process').exec;

var cmd = '/home/ubuntu/bin/ffmpeg -i /home/ubuntu/input.flv -s 640x480 -y -codec:a aac -b:a 44.1k -r 15 -b:v 1000k -codec:v h264 -f mp4 /home/ubuntu/output.mp4';

exec(cmd, function(err, stdout, stderr) {
    if (err) console.log('err:\n' + err);
    if (stderr) console.log('stderr:\n' + stderr);
    console.log('stdout:\n' + stdout);
});

当我运行这个节点脚本时,我得到以下错误:

err:
Error: Command failed: /home/ubuntu/bin/ffmpeg -i /home/ubuntu/input.flv -s 640x480 -y -codec:a aac -b:a 44.1k -r 15 -b:v 1000k -codec:v h264 -f mp4 /home/ubuntu/output.mp4
ffmpeg version N-83323-g126e965 Copyright (c) 2000-2017 the FFmpeg developers
  built with gcc 4.8 (Ubuntu 4.8.4-2ubuntu1~14.04.3)
  configuration: --prefix=/home/ubuntu/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/ubuntu/ffmpeg_build/include --extra-ldflags=-L/home/ubuntu/ffmpeg_build/lib --bindir=/home/ubuntu/bin --enable-gpl --enable-libopus --enable-libvpx --enable-libvorbis --enable-libmp3lame --enable-libfdk-aac --enable-libx264 --enable-nonfree
  libavutil      55. 45.100 / 55. 45.100
  libavcodec     57. 75.100 / 57. 75.100
  libavformat    57. 66.101 / 57. 66.101
  libavdevice    57.  2.100 / 57.  2.100
  libavfilter     6. 72.100 /  6. 72.100
  libswscale      4.  3.101 /  4.  3.101
  libswresample   2.  4.100 /  2.  4.100
  libpostproc    54.  2.100 / 54.  2.100
/home/ubuntu/input.flv: Invalid data found when processing input

stderr:
ffmpeg version N-83323-g126e965 Copyright (c) 2000-2017 the FFmpeg developers
  built with gcc 4.8 (Ubuntu 4.8.4-2ubuntu1~14.04.3)
  configuration: --prefix=/home/ubuntu/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/ubuntu/ffmpeg_build/include --extra-ldflags=-L/home/ubuntu/ffmpeg_build/lib --bindir=/home/ubuntu/bin --enable-gpl --enable-libopus --enable-libvpx --enable-libvorbis --enable-libmp3lame --enable-libfdk-aac --enable-libx264 --enable-nonfree
  libavutil      55. 45.100 / 55. 45.100
  libavcodec     57. 75.100 / 57. 75.100
  libavformat    57. 66.101 / 57. 66.101
  libavdevice    57.  2.100 / 57.  2.100
  libavfilter     6. 72.100 /  6. 72.100
  libswscale      4.  3.101 /  4.  3.101
  libswresample   2.  4.100 /  2.  4.100
  libpostproc    54.  2.100 / 54.  2.100
/home/ubuntu/input.flv: Invalid data found when processing input

stdout:

但是当我运行时

/home/ubuntu/bin/ffmpeg -i /home/ubuntu/input.flv -s 640x480 -y -codec:a aac -b:a 44.1k -r 15 -b:v 1000k -codec:v h264 -f mp4 /home/ubuntu/output.mp4

直接在终端中,它完美无缺。我认为这与节点如何运行命令有关,但我所有的谷歌搜索都返回了零有用的结果。任何帮助是极大的赞赏。

【问题讨论】:

  • 尝试使用spawn 而不是exec,因为exec 的输出缓冲区有限。或者运行 ffmpeg -loglevel error -i ... 来隐藏信息消息。
  • 我添加了-loglevel error,它仍然给出同样的错误
  • 但是每次运行它时都没有看到所有这些信息,这很好。
  • 下一步尝试: 1. 确保节点应用程序有读写文件的权限,例如您可以将其放入 100% 受保护的文件夹并比较结果; 2.尝试将{cwd: __dirname}作为第二个参数传递给exec; 3.尝试spawn得到相同的结果或发现问题的地方。
  • 我认为这与节点的异步性质有关,节点不等待 ffmpeg 做它的事情。所以我要试试child_process.execSync

标签: node.js ffmpeg


【解决方案1】:

这与节点的异步性质无关。节点进程总是等待派生的子进程(使用 spawn 和 exec 创建)。

由于多种原因,我建议您将 spawn 与 ffmpeg 一起使用:

  • spawn 处理参数的方式与 exec 不同。它启动进程本身并将参数数组传递给进程。 exec 但是将整个命令作为字符串传递给 shell 进程。这可能会导致一些转义错误。

  • ffmpeg 大多数时候是一个“长时间运行”的进程。最好在它仍在运行时解析它的输出。 exec 在进程完成之前不会给出输出。

  • ffmpeg 可能会产生大量的输出数据。这可能会导致exec 出现问题,因为它以有限的缓冲区启动进程。 (正如 Aikon 上面提到的)。 spawn 使用流将数据作为块实时传递。

以您的 cmd/args 为例:

var spawn = require('child_process').spawn;

var cmd = '/home/ubuntu/bin/ffmpeg';

var args = [
    '-y', 
    '-i', '/home/ubuntu/input.flv',
    '-s', '640x480', 
    '-codec:a', 'aac', 
    '-b:a', '44.1k', 
    '-r', '15', 
    '-b:v', '1000k', 
    '-c:v','h264', 
    '-f', 'mp4', '/home/ubuntu/output.mp4'
];

var proc = spawn(cmd, args);

proc.stdout.on('data', function(data) {
    console.log(data);
});

proc.stderr.setEncoding("utf8")
proc.stderr.on('data', function(data) {
    console.log(data);
});

proc.on('close', function() {
    console.log('finished');
});

【讨论】:

  • var cmd = '"/home/ubuntu/bin/ffmpeg"'; 上的双引号导致错误。我删除了它们,效果很好。谢谢
  • 几乎。确保设置编码以读取输出proc.stderr.setEncoding("utf8")
【解决方案2】:

基于另一个答案:

runCommand.js:

var spawn = require('child_process').spawn;
module.exports = (cmd, args, onData, onFinish) => {
    var proc = spawn(cmd, args.split(' '));
    proc.stdout.on('data', onData);
    proc.stderr.setEncoding("utf8")
    proc.stderr.on('data', err => console.log(err) );
    proc.on('close', onFinish);
}

main.js:

runCommand('ffmpeg', '-y -f concat -i list.txt -c copy output-final.mp4', 
        data => console.log(data), () => console.log('finished'))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-27
    • 2020-12-17
    • 2012-10-23
    • 1970-01-01
    • 2014-05-11
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多