IT序号网

node.js之通过nodejs错误运行ffmpeg

sxdcgaq8080 2024年10月01日 编程语言 15 0

我正在尝试从 Node 运行 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); 
}); 

当我运行此 Node 脚本时,我收到以下错误:
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 

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

请您参考如下方法:

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

我建议你使用spawn由于多种原因,使用 ffmpeg:

  • spawn以与 exec 不同的方式处理参数。它启动进程本身并将参数数组传递给进程。 exec然而,将整个命令作为字符串并将其传递给 shell 进程。这可能会导致一些转义错误。
  • ffmpeg 大多数时候是一个“长期运行”的进程。最好在它仍在运行时解析它的输出。 exec 在进程完成之前不会给出输出。
  • ffmpeg 可以产生大量的输出数据。这可能会导致 exec 出现问题。因为它以有限的缓冲区开始该过程。 (正如 Aikon 上面提到的)。 spawn使用流实时将数据作为 block 传递。

  • 您的 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'); 
    }); 
    


    评论关闭
    IT序号网

    微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!