10 KiB
Возможности DASH Video Converter
Архитектура
Конвертация выполняется в два этапа для обеспечения стабильности и максимальной производительности:
Этап 1: Кодирование - тяжелая работа по перекодированию видео во все профили качества с использованием FFmpeg и NVENC.
Этап 2: Упаковка DASH - быстрая упаковка готовых MP4 файлов в DASH формат через MP4Box с генерацией манифеста.
Преимущества подхода:
- Стабильность: MP4Box специализируется на DASH, FFmpeg - на кодирование
- Параллелизм: все профили кодируются одновременно на GPU
- Надежность: разделение ответственности между инструментами
Этап 1: Оптимизация и кодирование
Стандартные профили разрешений
Автоматически создаются профили с частотой 30 FPS:
- 360p (640x360) - 800 kbps
- 480p (854x480) - 1200 kbps
- 720p (1280x720) - 2800 kbps
- 1080p (1920x1080) - 5000 kbps
Опциональные профили высокого разрешения
Создаются только если исходное видео имеет соответствующее или более высокое разрешение:
- 2K (2560x1440) - если исходное >= 1440p
- 4K (3840x2160) - если исходное >= 2160p
Система автоматически определяет разрешение исходного видео и создает только применимые профили без upscaling.
Высокочастотные профили
Система автоматически определяет частоту кадров исходного видео и создает дополнительные высокочастотные профили только если это поддерживается оригиналом:
- Оригинал >= 45 FPS: создаются профили @ 60 FPS для всех разрешений
- Оригинал >= 75 FPS: создаются профили @ 90 FPS для всех разрешений
- Оригинал >= 95 FPS: создаются профили @ 120 FPS для всех разрешений
Стандартные 30 FPS профили создаются всегда.
Пример: если исходное видео 60 FPS, будут созданы:
- 360p @ 30fps, 360p @ 60fps
- 480p @ 30fps, 480p @ 60fps
- 720p @ 30fps, 720p @ 60fps
- 1080p @ 30fps, 1080p @ 60fps
Интерполяция кадров не применяется - создаются только те частоты, которые нативно поддерживаются исходным материалом.
Технические особенности
- NVENC GPU ускорение: аппаратное кодирование на видеокарте NVIDIA
- GOP size выравнивание: keyframe каждые N кадров для точной сегментации (N = FPS × segment_duration)
- VBR режим: переменный битрейт для оптимального качества
- Умное кодирование аудио: автоматический выбор оптимального битрейта без upscaling
- Целевой максимум: 256 kbps AAC стерео
- Фактический битрейт:
min(source_bitrate, 256 kbps) - Округление до стандартных значений: 64k, 96k, 128k, 192k, 256k
- Примеры: исходник 64 kbps → выход 64 kbps | исходник 320 kbps → выход 256 kbps
Этап 2: Создание DASH
Упаковка через MP4Box
- Создание фрагментированных MP4 сегментов длительностью 2 секунды
- Генерация единого MPD манифеста для всех профилей
- Выравнивание сегментов по Random Access Points (RAP)
Организация файловой структуры
После упаковки файлы автоматически организуются в подпапки:
- Видео сегменты:
{resolution}/ - Аудио сегменты:
audio/ - Манифест: корень директории
Пути в MPD манифесте обновляются для соответствия структуре подпапок.
Множественные аудио дорожки
Поддержка озвучек и языков
Система поддерживает несколько аудио дорожек с различными источниками:
Извлечение из видео:
- Автоматическое извлечение всех аудио дорожек из входного файла
- Выбор конкретных дорожек по индексу
Внешние файлы:
- Добавление аудио из отдельных файлов (MP3, AAC, M4A)
- Синхронизация с видео
Метаданные аудио дорожек
Каждая дорожка содержит метаданные для правильного отображения в плеере:
- language: код языка (ru, en, ja)
- label: название озвучки ("Кубик в кубе", "LostFilm", "Original")
- role: тип озвучки
main- основнаяdub- дубляжcommentary- комментарии
Пример структуры в MPD:
<AdaptationSet lang="ru" label="Кубик в кубе">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="dub"/>
<Representation id="audio_kubik" .../>
</AdaptationSet>
Генерация постера
Автоматический режим
По умолчанию постер создается из первого кадра видео (00:00:00).
Указание таймкода
Возможно указание конкретного времени для извлечения постера:
Формат:
MM:SS- минуты:секунды (например,06:32)HH:MM:SS- часы:минуты:секунды (например,01:23:45)
Команда:
--poster-time 06:32
Постер сохраняется в формате JPEG с оптимизированным качеством.
Превью спрайты
Thumbnail спрайты
Автоматическая генерация спрайта с миниатюрами для навигации по видео:
- Интервал: 1 секунда (по умолчанию)
- Размер миниатюры: 160x90 пикселей
- Сетка: 10 колонок, динамическое количество строк
- Формат: JPEG sprite
WebVTT файл
Генерируется VTT файл с координатами каждой миниатюры:
WEBVTT
00:00:00.000 --> 00:00:01.000
thumbnails.jpg#xywh=0,0,160,90
00:00:01.000 --> 00:00:02.000
thumbnails.jpg#xywh=160,0,160,90
Плееры используют VTT для отображения превью при наведении на timeline.
Выходная структура файлов
Организация директорий
output/
└── video-name/
├── manifest.mpd # Главный DASH манифест
├── poster.jpg # Постер видео
├── thumbnails.jpg # Спрайт превью
├── thumbnails.vtt # WebVTT для превью
├── audio/ # Аудио дорожки
│ ├── audio_init.m4s # Инициализационный сегмент
│ ├── audio_1.m4s # Сегмент #1
│ └── audio_N.m4s # Сегмент #N
├── 1080p/ # Профиль 1080p @ 30fps
│ ├── 1080p_init.m4s
│ ├── 1080p_1.m4s
│ └── 1080p_N.m4s
├── 1080p-60/ # Профиль 1080p @ 60fps (если применимо)
│ └── ...
├── 720p/ # Профиль 720p @ 30fps
│ └── ...
├── 480p/ # Профиль 480p @ 30fps
│ └── ...
└── 360p/ # Профиль 360p @ 30fps
└── ...
Именование файлов
Инициализационные сегменты: {profile}_init.m4s или {profile}_.mp4
Медиа сегменты: {profile}_{number}.m4s
Аудио: audio_{number}.m4s или audio_{lang}_{number}.m4s для множественных дорожек
Имя выходной директории всегда соответствует имени входного видео файла (без расширения).
Производительность
- Параллельное кодирование до 3 профилей одновременно (с NVENC)
- GOP size точно соответствует длительности сегмента для быстрой упаковки
- Временные файлы в
/tmp/с автоочисткой - Прогресс-бары в реальном времени для каждого профиля
Требования
- FFmpeg: с поддержкой h264_nvenc (опционально), aac, scale
- MP4Box (GPAC): для DASH упаковки
- NVIDIA GPU: для NVENC ускорения (опционально, fallback на CPU)
- Bun: runtime окружение