Использование ffmpeg в узле, без использования fluent-ffmpeg - PullRequest
0 голосов
/ 15 мая 2018

Я использую ffmpeg без использования fluent-ffmpeg.Я использую 'child_process' с узла.

Прежде всего я проверил, как я могу передать более одного аргумента в команду дочернего процесса.и я подтвердил это приведенным ниже кодом.

Я использовал такую ​​команду копирования

cp vid1.mp4 vid2.mp4

, которая успешно скопировала vid1 в vid2.

const execFile = require('child_process').execFile;
const child = execFile('cp', ['vid1.mp4', 'vid3.mp4'], (error, stdout, stderr) => {
    if (error) {
        console.error('stderr: =============================', stderr);
        throw error;
    }
    console.log('stdout: ==========================', stdout);
});

console.log('here');

Над кодом находится содержимое файла index.js (точка входа по умолчанию в узле).И запускаем это с узлом. , который успешно копирует vid1 в vid3.

Теперь я хочу сделать водяные знаки для данного видео.Для этого я использую этот учебник .В настоящее время ссылка на само учебное пособие не работает, вы можете увидеть ее здесь .

Это команда, которую я использую

ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp4

Теперь та же команда, что и яиспользуя вот так

const execFile = require('child_process').execFile;

const child = execFile('ffmpeg', ['-i', 'input.mp4' , '-i' , 'logo.png' , '-filter_complex' , '"overlay=10:10"' , 'output.mp4' ], (error, stdout, stderr) => {
    if (error) {
        console.error('stderr: =============================', stderr);
        throw error;
    }
    console.log('stdout: ==========================', stdout);
});

console.log('here');

и я получаю сообщение об ошибке:

Нет такого фильтра: '"overlay" Ошибка инициализации сложных фильтров. Неверный аргумент

/ Users / neerpatel / Desktop / testProjects / childProcess / index.js: 7 ошибок выброса; ^

Ошибка: команда не выполнена: ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay = 10: 10 "output.mp4

Вы можете ясно видеть, что та же команда, которая запускается непосредственно в терминале, не работает, когда я передаю ее в дочерний процесс. Почему это происходит?

Более того, я хотел добавить тег 'watermarking', но не могу создать тег, поскольку моя репутация ниже 1500. Пожалуйста, кто-то это сделает.

ОБНОВЛЕНИЕ: Я использовал EXEC вместо execFile. Иэто работало как прелесть, но родительский файл продолжал ждать дочерний процесс. Дочерний процесс никогдавозвращает сигнал END.и это мой код

const exec = require('child_process').exec;

const child = exec('ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp4', (error, stdout, stderr) => {
    if (error) {
        console.error('stderr: =============================', stderr);
        throw error;
    }
    console.log('stdout: ==========================', stdout);
});

console.log('here');

1 Ответ

0 голосов
/ 16 мая 2018

наконец-то нашел решение, Как предположил Марекфул, проблема была в строке "overlay = 10: 10",

поэтому я взял другую переменную str = "overlay = 10: 10" и передал ее в качестве аргумента, и она работала как шарм.

спасибо Марекфул.

const execFile = require('child_process').execFile;
const str = "overlay=10:10";
const child = execFile('ffmpeg', ['-i', 'input.mp4' , '-i' , 'logo.png' , '-filter_complex' , str , 'output.mp4' ], (error, stdout, stderr) => {
    if (error) {
        console.error('stderr: =============================', stderr);
        throw error;
    }
    console.log('stdout: ==========================', stdout);
});

console.log('here');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...