Прямой ответ
Стриминг HLS разбивает видео на сегменты с плейлистом, поэтому воспроизведение начинается до загрузки всего файла и адаптируется к пропускной способности.
| Компонент | Что определяет |
|---|---|
| Сегмент | Фрагмент видео фиксированной длительности |
| Плейлист | Список сегментов в порядке воспроизведения |
| Вариант | Поток иного битрейта и разрешения |
| Длительность сегмента | Размер фрагмента и задержка старта |
ffmpeg -i input.mp4 -c:v libx264 -c:a aac \
-hls_time 6 -hls_list_size 0 -hls_segment_type mpegts \
stream.m3u8
Плейлист перечисляет сегменты в порядке воспроизведения, поэтому проигрыватель запрашивает фрагменты последовательно. О кодеках — в статье про конвертацию видео.
Сегменты и плейлист
Нарезка на сегменты определяет, как видео доставляется проигрывателю, поэтому размер фрагмента влияет на старт и устойчивость воспроизведения.
Длительность сегмента. Размер фрагмента задаётся при нарезке, поэтому короткий сегмент сокращает время старта, а длинный уменьшает число запросов.
Плейлист. Список сегментов в порядке воспроизведения, поэтому проигрыватель запрашивает фрагменты последовательно.
Тип сегмента. Контейнер фрагмента определяет совместимость с проигрывателем, поэтому формат выбирается под целевое устройство.
Практическое следствие: сегмент большой длительности увеличивает время до начала воспроизведения, поскольку первый фрагмент загружается целиком.
Отдельный аспект — выравнивание сегментов по ключевым кадрам. Нарезка выполняется по ключевым кадрам, поэтому фактическая длительность сегмента может отличаться от заданной.
Адаптивный битрейт и варианты потока
Адаптивный битрейт предоставляет несколько вариантов потока, поэтому проигрыватель выбирает вариант по пропускной способности канала.
Набор вариантов. Видео подготавливается в нескольких битрейтах и разрешениях, поэтому каждый вариант соответствует своей полосе канала.
Выбор варианта. Проигрыватель переключается между вариантами по измеренной скорости, поэтому воспроизведение не прерывается при снижении канала.
Мастер-плейлист. Список вариантов потока, поэтому проигрыватель определяет доступные битрейты до начала воспроизведения.
Практическое следствие: единственный вариант потока приводит к прерыванию воспроизведения при снижении пропускной способности, поскольку запасного битрейта нет.
Доставка сегментов и кэширование
Сегменты доставляются как обычные файлы, поэтому доставка выполняется через веб-сервер с кэшированием на пути к пользователю.
Доставка через веб-сервер. Сегменты отдаются как статические файлы, поэтому отдельный медиасервер для доставки не требуется.
Кэширование сегментов. Фрагменты кэшируются на промежуточных узлах, поэтому нагрузка на источник сокращается.
Заголовки кэша. Срок хранения сегмента задаётся заголовками, поэтому плейлист обновляется чаще, чем кэшируются сегменты.
Практическое следствие: плейлист, кэшированный на длительный срок, не отражает обновление списка сегментов, поэтому воспроизведение останавливается на устаревшем списке.
О транскодировании — в статье про транскодирование видео; о битрейте и качестве — в статье про сжатие видео.
Практика: настройка стриминга HLS
1. Нарезайте видео на сегменты фиксированной длительности. Размер фрагмента определяет время старта и число запросов.
2. Подбирайте длительность сегмента под требование к старту. Короткий сегмент сокращает время до начала воспроизведения.
3. Готовьте несколько вариантов битрейта. Прогрыватель переключается между вариантами при изменении пропускной способности.
4. Формируйте мастер-плейлист со списком вариантов. Проигрыватель определяет доступные битрейты до начала воспроизведения.
5. Выравнивайте сегменты по ключевым кадрам. Фактическая длительность фрагмента соответствует нарезке.
6. Доставляйте сегменты через веб-сервер с кэшированием. Нагрузка на источник сокращается за счёт кэша на промежуточных узлах.
7. Задавайте короткий срок кэша для плейлиста. Список сегментов отражает обновление, поэтому воспроизведение не останавливается.
Рекомендации:
- Не используйте единственный вариант битрейта. Воспроизведение прерывается при снижении пропускной способности канала.
- Учитывайте привязку нарезки к ключевым кадрам. Фактическая длительность сегмента может отличаться от заданной.
- Сопоставляйте срок кэша плейлиста с частотой обновления. Длительный кэш плейлиста приводит к остановке воспроизведения.
- Фиксируйте параметры нарезки в скрипте. Повторная подготовка даёт одинаковый набор сегментов.
- Пересматриваем набор вариантов при изменении аудитории. Новый профиль каналов требует иного набора битрейтов.
Практический сценарий: воспроизведение останавливалось на середине потока
Контекст: трансляция воспроизводилась несколько минут, затем останавливалась, при этом сегменты на сервере присутствовали.
- Диагностика. Проверка показала, что плейлист кэшировался промежуточным узлом на длительный срок. Проигрыватель получал устаревший список сегментов, поэтому запрошенных фрагментов в нём не было.
- Причина. Срок кэширования плейлиста не отличался от срока кэширования сегментов, поэтому обновление списка не доходило до проигрывателя.
- Действия. (а) Задали короткий срок кэша для плейлиста, чтобы список сегментов запрашивался с источника при каждом обновлении; (б) оставили длительный срок кэша для сегментов, чтобы нагрузка на источник сокращалась за счёт кэширования фрагментов; (в) добавили несколько вариантов битрейта, чтобы воспроизведение не прерывалось при снижении канала; (г) проверили выравнивание сегментов по ключевым кадрам, чтобы длительность фрагментов соответствовала нарезке; (д) настроили проверку доступности плейлиста и сегментов, чтобы остановка воспроизведения обнаруживалась.
- Результат. Трансляция воспроизводится непрерывно, поскольку проигрыватель получает актуальный список сегментов.
Вывод: кэширование плейлиста на длительный срок приводит к тому, что проигрыватель работает с устаревшим списком сегментов и останавливает воспроизведение. Короткий срок кэша для плейлиста при длительном кэше сегментов обеспечивает непрерывное воспроизведение и низкую нагрузку на источник.
FAQ
Зачем видео нарезают на сегменты? Воспроизведение начинается до загрузки всего файла, а пропускная способность используется эффективнее за счёт последовательной доставки фрагментов.
Что даёт адаптивный битрейт? Проигрыватель переключается между вариантами потока по пропускной способности, поэтому воспроизведение не прерывается при снижении канала.
Почему важен короткий срок кэша для плейлиста? Устаревший список сегментов не содержит новых фрагментов, поэтому воспроизведение останавливается на середине потока.
Нужен ли отдельный медиасервер для HLS? Нет, сегменты отдаются как статические файлы через веб-сервер с кэшированием на промежуточных узлах.
Источники: FFmpeg formats, RFC 8216 (HTTP Live Streaming), nginx mp4 module — ссылки в шапке.