2017-02-02 2 views
0

Я пытаюсь запустить ffmpeg с узла, и я получаю сообщение об ошибке. Вот кодrunning ffmpeg via nodejs error

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 

прямо в терминале, он работает безотказно , Я думаю, что это связано с тем, как узел запускает команду, но все мои поисковые запросы Google возвращают нулевые полезные результаты. Любая помощь приветствуется.

+0

Использование Try 'spawn' вместо' 'exec' потому что exec' имеет ограниченный буфер для вывода. Или запустите 'ffmpeg -loglevel error -i ...' для подавления информационных сообщений. –

+0

Я добавил ошибку '-lolvelvel', и она по-прежнему дает ту же ошибку – Greyhammer

+0

Но приятно не видеть все эти материалы информации каждый раз, когда я запускаю ее. – Greyhammer

ответ

1

Это не связано с асинхронным характером узла. Процесс Node всегда ожидает появления дочерних процессов (созданных с помощью spawn и exec).

Я предлагаю вам использовать spawn с FFmpeg из-за ряда причин:

  • spawn обрабатывает аргументы иначе, чем как Exec делает. Он запускает сам процесс и передает массив аргументов в процесс. Однако exec берет всю команду в виде строки и передает ее в процесс оболочки. Это может привести к некоторым ошибкам экранирования.

  • ffmpeg В большинстве случаев процесс длится очень долго. Лучше разобрать его вывод, пока он все еще работает. exec не дает результат до тех пор, пока процесс не завершится.

  • ffmpeg может производить большие объемы выходных данных. Это может вызвать проблемы с exec, поскольку он запускает процесс с ограниченным буфером. (Как упоминал Айкон). spawn передает данные как куски в реальном времени с использованием потоков.

Пример с Cmd/аргом:

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'); 
}); 
+0

Двойные кавычки на вашем' var cmd = '"/ home/ubuntu/bin/ffmpeg"' ;; вызвали ошибки. Я удалил их, и он отлично поработал. благодаря – Greyhammer