Jeer
@Jeer
уверенный пользователь

Из-за чего такие большие задержки при снимке фотографии?

Добрый день всем любителям 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 секунды). Плюс, разумеется, есть транспортные расходы.
Как вы понимаете, это нереально долго. Каких-то дополнительных параметров/настроек я не вижу. Что делать, не знаю.
Я видел довольно много других пакетов, видимо, придётся перебирать все.
Но, быть может, сообщество уже делало аналогичную задачу? Как вы справлялись с этим? В целом, в правильном ли направлении я двигаюсь?
  • Вопрос задан
  • 124 просмотра
Решения вопроса 1
2ord
@2ord
продвинутый чайник
То есть camera.takePhoto() выполняется более 5 секунд? Попробуйте проверить время снятия снимка при помощи команды в терминале, записав в RAM, а не на SD card.
Если все равно долго, то вряд ли есть лучшее решение при работе с raspistill.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@AlexSku
Программист по автоматике
Я как-то делал программу отзеркаливания (лево - право) для камеры ноутбука на DirectShow. Камера выдавала 30 fps, все кадры обрабатывались с этой скоростью. Но на одном ноутбуке (Samsung?) была задержка, а на другом (HP?) нет, поэтому виноват драйвер камеры ноутбука. (задержка, конечно, не 5 сек., а какая-то доля секунды, видна, если водишь рукой из стороны в сторону)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы