Skip to content
This repository has been archived by the owner on Nov 20, 2024. It is now read-only.

Application architecture

Nikita edited this page Jul 21, 2019 · 12 revisions

Application architecture

  • Большими стрелками указано перемещение данных о котором мы не заботимся, это происходит средствами SDK.
  • Тонкими стрелками указано перемещение данных, которое мы должны организовать либо средствами выгрузки данных в userspace, либо манипуляций с указателями.

Push & pull streaming

Условно можно разделить стриминг видео на две категории

  • pull - клиент запрашивает какие-то данные и получает их из доступного пула. Обычно это конечный обьем данных, а не бесконечный live поток. Примеры: jpeg over http, HLS.
  • push - клиенту запихиваются данные. Обычно это бесконечный поток данных. Примеры: rtsp/rtp, rtmp.

Push можно разделить на соединения иницируемые клиентом (rtsp, rtmp server) или сервером (rtmp push) по одной классификации. По другой классификации можно разделить по наличию обратной связи (контролю канала данных), примеры: rtp udp - отправили данные и забыли, не знаем доехало или нет (да и не важно это), rtp tcp - мы всегда точно знаем сколько данных уехало, а сколько в очереди.

Важно это в контексте того, что мы имеем дело с системой мягкого реального времени (существует разные виды реального времени можно почитать тут).

Понимать это нужно так: камера делает кадры постоянно, через равные промежутки времени. Допустим у нас идет захват изображения 25fps, т.е. каждые 40мс у нас генерируется кадр, он проходит через видео тракт и в конечном итоге мы имеем либо сырой кадр, либо закодированный. Эти данные помещаются в оперативную память. Оперативная память конечна и мы можем хранить только какое-то определенное кол-во таких данных, более старые будут вытеснены более новыми.

В такой системе нужно определять data serving strategy (сам придумал этот термин, не знаю как про это другие говорят), в основном это определение поведения системы в случае если клиент скачивает данные медленнее некой расчетной скорости и обращается к тем данным, которые уже были вытеснены или еще не вытеснены, но стали не актуальными (пример: 1ый кадр скачивали так медленно, что когда пришла очередь скачивать 2ой кадр у нас уже готов 5ый кадр для отправки).

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

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

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

Notes

Никаких "закольцованных" зависимостей и глобальных переменных, каждый package полностью инкапсулирует свой функционал и предоставляет управление через свои интерфейсы/методы.

Clone this wiki locally