Skip to content

Отказоустойчивость и восстановление файлов fMP4 ​

Аппаратные сбои, внезапное отключение электропитания или падение ядра операционной системы могут прервать процесс записи видеофайла прямо в момент дисковой операции. В традиционных системах видеонаблюдения такой файл оказывается полностью нечитаемым, так как завершающий индекс (moov атом) не успевает записаться.

В RUSEON Core эта проблема полностью устранена благодаря архитектуре контейнеров Fragmented MP4 (fMP4) и автоматической Службе восстановления при старте (internal/recorder/recovery.go).


Движок проверки целостности (ValidateFMP4File) ​

При старте сервера служба восстановления выполняет структурный анализ атомов каждого записанного файла:

  1. Минимальный размер: Проверяет, что размер файла не менее 32 байт (минимальный размер заголовков ftyp + moov).
  2. Проверка границ атомов: Проходит по всем верхнеуровневым боксам (ftyp, moov, moof, mdat, mfra) и проверяет условие box.offset + box.size <= fileSize.
  3. Отсутствие хвостового мусора: Убеждается, что файл заканчивается строго по границе бокса без оборванных байтов.
  4. Валидность заголовка: Проверяет наличие блока инициализации (moov) с корректными описаниями треков (trak и mdia).
  5. Наличие медиаданных: Проверяет наличие хотя бы одной полной пары фрагментов (moof + mdat).

Автоматическое обрезание и восстановление структуры ​

Если аварийное выключение произошло прямо во время записи очередного фрагмента:

text
[ ftyp ][ moov ][ moof #1 ][ mdat #1 ][ moof #2 ][ mdat #2 ][ moof #3 ][ mdat #3 (оборвано!) ]
                                                            ▲
                                              Граница обрезания файла
  1. Парсер находит точное байтовое смещение, на котором завершился последний полностью записанный атом mdat.
  2. Файл обрезается вызовом os.Truncate(filePath, lastValidOffset).
  3. Полученный файл на 100% соответствует стандарту ISO BMFF и воспроизводится любым стандартным плеером (VLC, FFmpeg, браузеры, iOS/Android).
  4. Нулевая потеря видео: Все записанные данные вплоть до последнего сброшенного ключевого кадра сохраняются.

Порядок восстановления при старте ​

При запуске сервера:

  1. Автоматически сканируются временные файлы прошлой сессии.
  2. Для каждого файла вызывается ValidateFMP4File.
  3. Файлы восстанавливаются и переименовываются в стандартный вид {start}_{end}.mp4.
  4. Обновляется каталог таймлайна в BadgerDB и создаются бинарные индексы (.idx).

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

Released under the MIT License.