Добрый день всем любителям DYI,
Собираюсь сделать потоковое видео с малины через интернет (обязательное условие) с минимальной задержкой (для управления роботом в реальном времени). Пошёл по схеме, что делаю много фоток, они постоянно обновляются и создаётся впечатление видео, вроде как самый лучший вариант.
Дано:
Использую Raspberry Pi 3b+
Поставил на неё одну из стандартных камер через шлейф.
Развернул node.js приложение
Подключил пакет
node-raspistill
'use strict';
var express = require('express');
var router = express.Router();
var http = require("http");
const Raspistill = require('node-raspistill').Raspistill;
const camera = new Raspistill({
width: 640,
height: 480,
encoding: 'jpg'
});
/* GET home page. */
router.get('/', function (req, res) {
sendPhoto();
});
function sendPhoto(){
var startTime = new Date().getTime();
var options = {
hostname: '192.168.0.105',
port: '5000',
path: '/api/chat/push',
method: 'POST',
headers: {
'Content-Type': 'application/json'
}
};
var remoteReq = http.request(options);
camera.takePhoto().then((photo)=>{
var baseStrImg = photo.toString('base64');
var spanTime = (new Date().getTime() - startTime)/1000+'';
console.log(spanTime);
remoteReq.write(JSON.stringify({ message: baseStrImg, Time: spanTime}));
remoteReq.end();
sendPhoto();
});
}
module.exports = router;
Тут довольно мало кода, я использую конструктор Raspistill, в котором задаю размер 640 на 480 и формат jpg. Довольно маленький размер фото. Затем, когда приходит команда из браузера, я делаю снимок с камеры, конвертирую изображение в base4, так же, дополнительно делаю замер, сколько это всё занимает по времени и отправляю данные на другой сервер.
Фотография делается, примерно, 5.7 секунд (конвертация из массива байтов в base64, к слову, 0.1 секунды). Плюс, разумеется, есть транспортные расходы.
Как вы понимаете, это нереально долго. Каких-то дополнительных параметров/настроек я не вижу. Что делать, не знаю.
Я видел довольно много других пакетов, видимо, придётся перебирать все.
Но, быть может, сообщество уже делало аналогичную задачу? Как вы справлялись с этим? В целом, в правильном ли направлении я двигаюсь?