Короткий практический гид по записи HLS (m3u8)
Краткий ответ: чтобы записать HLS (m3u8), парсите плейлист .m3u8, скачивайте указанные сегменты (.ts/.aac/.webm) и собирайте их в единый файл с помощью ffmpeg/streamlink/stream-recorder; это работает, если плейлист доступен и поток не защищён DRM или токенами с коротким сроком действия.
Как работает запись HLS
HLS разбивает поток на последовательность сегментов и публикует плейлист (.m3u8) с их адресами. Запись — это непрерывное:
- получение текущего плейлиста; 2) выявление новых сегментов; 3) скачивание сегментов в нужном порядке; 4) объединение (конкатенация) в контейнер (mp4/mkv/ts). Stream recorder — обобщённый термин для утилиты, которая автоматизирует эти шаги, отслеживает появление новых сегментов и собирает их в файл.
Если в плейлисте есть шифрование (строка #EXT-X-KEY) или DRM — стандартная загрузка сегментов не даст воспроизводимых файлов. В таких случаях потребуется ключ или иной способ легального доступа.
Пошаговая инструкция: от плейлиста к файлу
- Проверка плейлиста: скачайте .m3u8 и убедитесь, что он содержит прямые ссылки на сегменты (.ts) и не содержит #EXT-X-KEY (или у вас есть ключ).
- Автоматический парсинг: периодически запрашивайте .m3u8 (например, каждые 3–10 с) и собирайте список новых сегментов.
- Скачивание сегментов: сохраняйте сегменты в порядке из плейлиста. Делайте повторные попытки при ошибках.
- Сборка в контейнер:
- Быстрый способ (ffmpeg умеет читать плейлист напрямую):
ffmpeg -i "playlist.m3u8" -c copy output.mp4
Замечание:-c copyработает, если контейнер mp4 поддерживает кодеки; иначе используйте перекодирование. - Альтернатива: сохранить .ts сегменты и склеить:
cat segment1.ts segment2.ts ... > all.ts
затемffmpeg -i all.ts -c copy output.mp4
- Быстрый способ (ffmpeg умеет читать плейлист напрямую):
- Проверка: сравните длительность и целостность, проиграв готовый файл.
Пример для streamlink (подходит для прямого сохранения потока):
streamlink "playlist.m3u8" best -o output.ts
ffmpeg -i output.ts -c copy final.mp4
Инструменты и настройки
- ffmpeg — универсален: умеет читать m3u8, конкатенировать и перекодировать. Плюсы: гибкость; минусы: при live-плейлисте нужно корректно обрабатывать обновления.
- streamlink — удобно для прямого захвата трансляций в файл; хорош для интерактивных сценариев.
- Специализированные stream recorder’ы/скрипты — подходят для долгосрочных архивов: умеют ре-логиниться, восстанавливать скачанные сегменты и сохранять метаданные.
Сравнение выходных контейнеров
| Контейнер | Особенность | Когда выбирать |
|---|---|---|
| mp4 | Широко совместим, требует подходящих кодеков | Для распространения и воспроизведения на большинстве устройств |
| mkv | Более гибок с дорожками и субтитрами | Для архивов и сложных наборов потоков |
| ts | Нативный контейнер HLS-сегментов | Для быстрой склейки без перекодирования |
Если плейлист содержит несколько вариантов качества (master.m3u8), фиксируйте нужную ветку (variant) или позвольте инструменту выбрать best. Для стабильной записи лучше зафиксировать URL конкретного варианта.
Частые ошибки
- Пропуск сегментов из‑за нестабильного соединения — решается повторными попытками и буферизацией.
- Попытка сохранить поток с DRM — без ключа воспроизвести не получится.
- Неправильная конкатенация (не соблюдён порядок) — проверяйте последовательность сегментов в плейлисте.
- Использование
-c copyпри несовместимых кодеках — файл может не проигрываться; при сомнении перекодируйте.
FAQ
- Вопрос: Можно ли записать любой m3u8?
Ответ: Только если плейлист и сегменты доступны и не защищены DRM/закрытыми токенами. - Вопрос: Как узнать, зашифрованы ли сегменты?
Ответ: В плейлисте ищите директиву#EXT-X-KEY; она указывает способ и URI ключа. - Вопрос: Как уменьшить задержку записи?
Ответ: Уменьшите интервал парсинга плейлиста и используйте буферизацию, но учтите нагрузку на сеть. - Вопрос: Нужно ли перекодировать файл после конкатенации?
Ответ: Не всегда. Если контейнер поддерживает кодеки, можно сохранить-c copy. Иначе — перекодируйте для совместимости.
Перед записью убедитесь в законности действий: запись потоков без разрешения правообладателя может нарушать условия использования и закон.
Если нужно, могу добавить готовые скрипты (bash/Python) для непрерывной записи, примеры автозапуска по расписанию и шаблоны логирования сегментов.