#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-адреса, нет необходимости предоставлять эти параметры из терминала во время запуска приложения.