Я пытаюсь запустить небольшой сервис-конвертер 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(' ', '\ ')
.