Отказоустойчивость и восстановление файлов fMP4
Аппаратные сбои, внезапное отключение электропитания или падение ядра операционной системы могут прервать процесс записи видеофайла прямо в момент дисковой операции. В традиционных системах видеонаблюдения такой файл оказывается полностью нечитаемым, так как завершающий индекс (moov атом) не успевает записаться.
В RUSEON Core эта проблема полностью устранена благодаря архитектуре контейнеров Fragmented MP4 (fMP4) и автоматической Службе восстановления при старте (internal/recorder/recovery.go).
Движок проверки целостности (ValidateFMP4File)
При старте сервера служба восстановления выполняет структурный анализ атомов каждого записанного файла:
- Минимальный размер: Проверяет, что размер файла не менее 32 байт (минимальный размер заголовков
ftyp+moov). - Проверка границ атомов: Проходит по всем верхнеуровневым боксам (
ftyp,moov,moof,mdat,mfra) и проверяет условиеbox.offset + box.size <= fileSize. - Отсутствие хвостового мусора: Убеждается, что файл заканчивается строго по границе бокса без оборванных байтов.
- Валидность заголовка: Проверяет наличие блока инициализации (
moov) с корректными описаниями треков (trakиmdia). - Наличие медиаданных: Проверяет наличие хотя бы одной полной пары фрагментов (
moof+mdat).
Автоматическое обрезание и восстановление структуры
Если аварийное выключение произошло прямо во время записи очередного фрагмента:
text
[ ftyp ][ moov ][ moof #1 ][ mdat #1 ][ moof #2 ][ mdat #2 ][ moof #3 ][ mdat #3 (оборвано!) ]
▲
Граница обрезания файла- Парсер находит точное байтовое смещение, на котором завершился последний полностью записанный атом
mdat. - Файл обрезается вызовом
os.Truncate(filePath, lastValidOffset). - Полученный файл на 100% соответствует стандарту ISO BMFF и воспроизводится любым стандартным плеером (VLC, FFmpeg, браузеры, iOS/Android).
- Нулевая потеря видео: Все записанные данные вплоть до последнего сброшенного ключевого кадра сохраняются.
Порядок восстановления при старте
При запуске сервера:
- Автоматически сканируются временные файлы прошлой сессии.
- Для каждого файла вызывается
ValidateFMP4File. - Файлы восстанавливаются и переименовываются в стандартный вид
{start}_{end}.mp4. - Обновляется каталог таймлайна в BadgerDB и создаются бинарные индексы (
.idx).