Воспроизведение архива и стриминг по таймлайну
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-файлов:
# Экспорт 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:
GET /api/v1/archive/timeline?camera_id=cam1&from=1786752000&to=1786838400Пример ответа:
{
"camera_id": "cam1",
"segments": [
{
"start": 1786752000,
"end": 1786755600,
"duration": 3600,
"size_bytes": 184549200
}
]
}