Ошибка при порождении дочернего процесса в node.js - PullRequest
5 голосов
/ 08 марта 2011

Я пытаюсь запустить небольшой сервис-конвертер ffmpeg, пока что он довольно неплохо продвинулся.Но когда дело доходит до запуска фактического процесса ffmpeg для преобразования, я бью кирпичную стену.

// options.ffmpegopts is an array containing format-specific parameters
var args = [ '-y', '"' + options.targetfile + '"' ];
args = options.ffmpegopts.concat(args);

var ffmpegProc = spawn('ffmpeg ', args);
ffmpegProc.stderr.on('data', function(data) {
  console.log('stderr: ' + data);
});

При выполнении этого кода я получаю следующий вывод консоли:

stderr: execvp(): No such file or directory

Я уже проверил разные версии узлов (0.4.0, 0.4.2 и 0.5.0-pre) без какого-либо эффекта.

Другое действительно странное поведение - это то, что мне нужно вызывать spawn, включая пробел ('ffmpeg ' вместо 'ffmpeg').Если я опускаю это место, я получаю другую ошибку (stderr: "/path/to/my/movie.mpeg": no such file or directory).При вызове ffmpeg непосредственно из оболочки, команда, отправленная child_process.spawn (), выполняется без проблем.

Есть ли какие-либо подсказки на этот счет?Я уже проверил другие проекты, которые достигли того же (например, node-imagemagick или ffmpeg-node , но просветление меня не поразило ...

Обновление:strace () output

При запуске моего приложения с использованием strace -fF -o strace.log node server.js я могу выполнить следующие вызовы процесса:

execve("/usr/local/sbin/ffmpeg", ["ffmpeg", "-i", "\"/data/media_dev/test/ORG_mymovi"..., "-sameq", "-ab", "128k", "-ar", "44100", "-b", "512k", "-r", "25", "-s", "320x240", "-f", "flv", ...], [/* 20 vars */]) = -1 ENOENT (No such file or directory)
execve("/usr/local/bin/ffmpeg", ["ffmpeg", "-i", "\"/data/media_dev/test/ORG_mymovi"..., "-sameq", "-ab", "128k", "-ar", "44100", "-b", "512k", "-r", "25", "-s", "320x240", "-f", "flv", ...], [/* 20 vars */]) = -1 ENOENT (No such file or directory)
execve("/usr/sbin/ffmpeg", ["ffmpeg", "-i", "\"/data/media_dev/test/ORG_mymovi"..., "-sameq", "-ab", "128k", "-ar", "44100", "-b", "512k", "-r", "25", "-s", "320x240", "-f", "flv", ...], [/* 20 vars */]) = -1 ENOENT (No such file or directory)
execve("/usr/bin/ffmpeg", ["ffmpeg", "-i", "\"/data/media_dev/test/ORG_mymovi"..., "-sameq", "-ab", "128k", "-ar", "44100", "-b", "512k", "-r", "25", "-s", "320x240", "-f", "flv", ...], [/* 20 vars */]) = 0

Увидев, что на пути странно избежали двойные кавычки, я попыталсявызывать ffmpeg без кавычек ... работал как шарм. Но проблема остается, мне нужно иметь возможность работать с пробелами в моих путях.

Есть предложения?

Обновление: решение

Получилось работать с пробелами, достаточно простого inputfile.replace(' ', '\ ').

1 Ответ

4 голосов
/ 08 марта 2011

Ставлю деньги, что пробел в конце "ffmpeg " является причиной текущей проблемы. Быстрая маленькая C-программа покажет, что:

   #include <unistd.h>

   int main(int argc, char *argv[]) {
       execvp(argv[1], &argv[1]);
       perror(argv[0]);
   }

дает следующий вывод:

$ ./execvp "ffmpeg"
FFmpeg version 0.6-4:0.6-2ubuntu6, Copyright (c) 2000-2010 the FFmpeg developers
...
$ ./execvp "ffmpeg "
./execvp: No such file or directory
$

Я предлагаю снова удалить пробел и снова запустить под strace(1) -fF. Посмотрите на команду, которая фактически выполняется, и посмотрите, приходит ли сообщение об ошибке /path/to/my/movie.mpeg от ffmpeg или node.js.

...