我正在尝试从节点运行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);
});
Run Code Online (Sandbox Code Playgroud)
运行此节点脚本时,出现以下错误:
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:
Run Code Online (Sandbox Code Playgroud)
但是当我跑步时
/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
Run Code Online (Sandbox Code Playgroud)
直接在终端中,它可以完美运行。我认为这与节点如何运行命令有关,但是我所有的Google搜索都返回了零有用的结果。任何帮助是极大的赞赏。
基于另一个答案:
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);
}
Run Code Online (Sandbox Code Playgroud)
main.js:
runCommand('ffmpeg', '-y -f concat -i list.txt -c copy output-final.mp4',
data => console.log(data), () => console.log('finished'))
Run Code Online (Sandbox Code Playgroud)
这与节点的异步性质无关。节点进程始终等待生成的子进程(使用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.on('data', function(data) {
console.log(data);
});
proc.on('close', function() {
console.log('finished');
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4375 次 |
| 最近记录: |