Skip to content

Воспроизведение архива и стриминг по таймлайну ​

RUSEON Core предоставляет высокопроизводительную подсистему воспроизведения архивных записей для веб-браузеров, мобильных устройств и десктопных клиентов без необходимости перекодирования и без создания паразитной нагрузки на дисковый ввод-вывод.


Ключевые механизмы воспроизведения ​

1. Индексация ключевых кадров (.idx) ​

Парсинг многогигабайтных видеофайлов для поиска нужной временной метки создаёт высокую дисковую задержку. RUSEON Core создаёт компактный бинарный файл индекса (.idx) рядом с каждым файлом .mp4:

  • Связывает метку времени кадра (PTS) с его точным физическим байтовым смещением в файле.
  • При перемотке по таймлайну сервер выполняет быстрый бинарный поиск $O(\log N)$ в файле индекса и сразу читает нужный фрагмент без полного сканирования тяжелого видеофайла.

2. Динамический HLS-стриминг архива ​

Клиент запрашивает архив через стандартные эндпоинты HLS:

  • Эндпоинт плейлиста: GET /api/v1/archive/hls/{camera_id}/index.m3u8?start={epoch}&duration={seconds}
  • Динамически нарезает исторические fMP4-записи на виртуальные HLS-сегменты.
  • Выполняет трансмуксинг fMP4 в HLS MPEG-TS или фрагменты MP4 на лету.
  • Совместим с Video.js, HLS.js, Safari (iOS/macOS), ExoPlayer (Android) и VLC.

3. Поддержка HTTP Range-запросов ​

Для десктопных плееров и прямого воспроизведения в HTML5 <video>:

  • Сервер поддерживает стандартные HTTP заголовки Range: bytes=start-end.
  • Обеспечивает мгновенную перемотку в стандартных плеерах.

4. Экспорт и скачивание видеороликов ​

Пользователи могут экспортировать произвольные временные интервалы архива в виде отдельных MP4-файлов:

bash
# Экспорт 10-минутного фрагмента с 14:00 до 14:10
curl -H "Authorization: Bearer <ТОКЕН>" \
  "http://localhost:8080/api/v1/archive/export?camera_id=cam1&from=1786802400&to=1786803000" \
  -o incident_clip.mp4

Сервер бесшовно объединяет нужные фрагменты из файловой структуры, формирует стандартный заголовок MP4 и отдаёт готовый файл на скачивание.


API запроса таймлайна ​

Веб-интерфейс получает список доступных интервалов записи через REST API:

bash
GET /api/v1/archive/timeline?camera_id=cam1&from=1786752000&to=1786838400

Пример ответа:

json
{
  "camera_id": "cam1",
  "segments": [
    {
      "start": 1786752000,
      "end": 1786755600,
      "duration": 3600,
      "size_bytes": 184549200
    }
  ]
}

Связанная документация ​

Released under the MIT License.