Files

111 lines
7.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# videos Specification
## Purpose
Поддержка видео в альбомах: приём файла, фоновая подготовка web-совместимого варианта,
постер-кадр и воспроизведение в браузере.
## Requirements
### Requirement: Приём видео
Участник с правом загрузки SHALL загружать видео в альбом; система SHALL принимать ввод
`video/*` и SHALL отклонять файлы сверх лимита видео понятной ошибкой о превышении размера.
#### Scenario: Успешная загрузка видео
- **WHEN** участник с правом загрузки отправляет видеофайл в пределах лимита
- **THEN** система сохраняет оригинал и создаёт медиа-запись с признаком видео
#### Scenario: Превышение лимита видео
- **WHEN** загружается файл больше лимита видео
- **THEN** система отклоняет загрузку с явной ошибкой о превышении размера
#### Scenario: Не медиафайл
- **WHEN** загружается файл, не являющийся изображением или видео
- **THEN** система отклоняет загрузку
### Requirement: Метаданные видео
При обработке система SHALL извлекать длительность, размеры кадра и поворот и SHALL
возвращать длительность в данных медиа.
#### Scenario: Длительность доступна
- **WHEN** видео успешно обработано
- **THEN** данные медиа содержат длительность видео
#### Scenario: Метаданные недоступны
- **WHEN** из видео не удаётся извлечь метаданные
- **THEN** запись сохраняется, а длительность пуста
### Requirement: Постер видео
Система SHALL извлекать кадр-постер и SHALL генерировать из него варианты thumb, medium и
preview тем же способом, что для изображений, чтобы сетка и обложка отображали видео постером.
#### Scenario: Генерация постера
- **WHEN** видео обработано
- **THEN** система создаёт варианты thumb, medium и preview из кадра-постера
#### Scenario: Обложка из видео
- **WHEN** видео становится обложкой альбома
- **THEN** альбом отображает постер видео
### Requirement: Гарантированное воспроизведение
Система SHALL готовить воспроизводимый вариант видео: SHALL выполнять remux без
перекодирования, когда источник web-совместим, и SHALL транскодировать в h264/yuv420p/aac
с faststart иначе; система SHALL NOT увеличивать разрешение и SHALL ограничивать длинную
сторону 1080p.
#### Scenario: Совместимый источник
- **WHEN** источник — h264/yuv420p с совместимым профилем, звуком aac или без звука, в подходящем контейнере и в пределах разрешения
- **THEN** система подготавливает вариант remux без перекодирования
#### Scenario: Несовместимый источник
- **WHEN** источник не является web-совместимым (например, hevc, 10-bit или yuv444)
- **THEN** система транскодирует видео в h264/yuv420p/aac
#### Scenario: Разрешение выше предела
- **WHEN** длинная сторона источника превышает 1080p
- **THEN** система масштабирует видео до 1080p, не увеличивая меньший источник
### Requirement: Готовность и воспроизведение видео
Данные медиа SHALL содержать адрес воспроизводимого варианта, когда он готов; клиент SHALL
воспроизводить его с перемоткой; до готовности система SHALL отдавать постер и признак
обработки, а обновление о готовности SHALL транслироваться подписчикам.
#### Scenario: Вариант не готов
- **WHEN** видео ещё обрабатывается
- **THEN** данные медиа содержат постер и не содержат адрес воспроизведения
#### Scenario: Вариант готов
- **WHEN** обработка завершена
- **THEN** данные медиа содержат адрес воспроизведения, а подписчики получают обновление
#### Scenario: Перемотка
- **WHEN** клиент перематывает воспроизведение
- **THEN** система отдаёт запрошенный диапазон байт
### Requirement: Фоновая подготовка видео
Задание подготовки видео SHALL выполняться в фоне с длительным лизингом, таймаутом и
повторами при сбое и SHALL NOT вытеснять генерацию вариантов изображений.
#### Scenario: Повтор при сбое
- **WHEN** подготовка видео завершается ошибкой
- **THEN** задание повторяется с задержкой до достижения предела попыток
#### Scenario: Изоляция от картинок
- **WHEN** длительное видео обрабатывается
- **THEN** генерация вариантов изображений продолжает выполняться
### Requirement: Оригинал видео
Система SHALL сохранять исходный видеофайл и SHALL использовать его для скачивания
независимо от подготовленного варианта.
#### Scenario: Скачивание оригинала
- **WHEN** участник скачивает видео
- **THEN** система возвращает адрес исходного файла
### Requirement: Отсутствие видео-инструментов
При отсутствии `ffmpeg`/`ffprobe` система SHALL отключать приём видео и SHALL отражать
недоступность видео-обработки в состоянии здоровья.
#### Scenario: Инструменты отсутствуют
- **WHEN** видео-инструменты недоступны
- **THEN** приём видео отклоняется, а health сообщает о недоступности видео