Как передать видеофайл в качестве входных данных дочернему процессу в NodeJS и получать кадры / изображения в качестве выходных данных?

#c #node.js #rest #opencv #video

#c #node.js #остальное #opencv #Видео

Вопрос:

Я написал код на OpenCV C , который принимает видео и временную метку (в формате HH: MM: SS) в качестве входных данных из командной строки и обнаруживает лица в этом кадре. Обнаруженные лица обрезаются и записываются в виде файлов PNG.

 $ ./executable video.mp4 00:00:01
 

Теперь я хочу создать веб-API для executable NodeJS. Я использовал child_process.spawn вместе с аргументами командной строки. Приложение запускается без каких-либо ошибок, но я не получаю обрезанные изображения в качестве выходных данных. Кажется, мое приложение либо не может передать входное видео в executable , либо не может прочитать вывод из него. Это мое первое приложение NodeJS. Вот мой код.

 /**
* app.js
* make sure to install express (npm install express)
* and place the executable beside this file
* or set executablePath to the correct path.
* run the app and open 'http://0.0.0.0:3000' in your browser.
*/

var child_process = require('child_process');
var path = require('path');
var express = require('express');
var app = express();

var executable = null;

app.get('/', function (req, res) {

const args = process.argv;
console.log(args);
//console.log(process.argv[3]);

if (process.argv.length <= 3) {
console.log("Usage: nodemon "   __filename   " <path/to/video> <HH:MM:SS>");
process.exit(-1);
}

if (executable !== null) {
  res.end('executable is already running.');
  return;
}

var executablePath = path.join(__dirname, './executable');
executable = child_process.spawn(executablePath, [process.argv[2], process.argv[3]]);

executable.on('exit', function (signal, code) {
console.log('executable exited with signal: %s and code: %d', signal, code);
executable = null;
});

res.end('Done.');
});

app.listen(3000);
console.log('Listening on port 3000');
 

Я запускаю его как

 $ nodemon app.js video.mp4 00:00:01
 

Мне также нужно знать, как я могу передать параметры video.mp4 и 00:00:01 из самого API.

Ответ №1:

Я сам нашел решение. Мне нужно добавить {stdio: 'inherit'} опцию при создании дочернего процесса. Вот окончательный код:

 /**
* app.js
* make sure to install express (npm install express)
* and place the executable beside this file
* or set executablePath to the correct path.
* run the app and open 'localhost:3000/?vid=<path to video file>amp;tstamp=<timestamp in HH:MM:SS format>' in your browser.
*/

var child_process = require('child_process');
var path = require('path');
var express = require('express');
var app = express();
var fs = require('fs');

var executable = null;

app.get('/', function (req, res) {

if (executable !== null) {
res.end('executable is already running.');
return;
}

var video = req.param('vid');
var timestamp = req.param('tstamp');

var executablePath = path.join(__dirname, './executable2');

executable = child_process.spawn(executablePath, [video, timestamp], {stdio: 'inherit'});

executable.on('exit', function (signal, code) {
console.log('executable exited with signal: %s and code: %d', signal, code);
executable = null;
});

res.end('Done.');
});

app.listen(3000);
console.log('Listening on port 3000');
 

После этого запустите приложение как

 $ nodemon app.js
 

и откройте следующую ссылку в браузере

 localhost:3000/?vid=<path to video file>amp;tstamp=<timestamp in HH:MM:SS format>
 

Он берет видеофайл и временную метку из самого URL-адреса, нет необходимости предоставлять эти параметры из терминала во время запуска приложения.