Короткий практический гид по записи HLS (m3u8)

Краткий ответ: чтобы записать HLS (m3u8), парсите плейлист .m3u8, скачивайте указанные сегменты (.ts/.aac/.webm) и собирайте их в единый файл с помощью ffmpeg/streamlink/stream-recorder; это работает, если плейлист доступен и поток не защищён DRM или токенами с коротким сроком действия.

Как работает запись HLS

HLS разбивает поток на последовательность сегментов и публикует плейлист (.m3u8) с их адресами. Запись — это непрерывное:

  1. получение текущего плейлиста; 2) выявление новых сегментов; 3) скачивание сегментов в нужном порядке; 4) объединение (конкатенация) в контейнер (mp4/mkv/ts). Stream recorder — обобщённый термин для утилиты, которая автоматизирует эти шаги, отслеживает появление новых сегментов и собирает их в файл.

Если в плейлисте есть шифрование (строка #EXT-X-KEY) или DRM — стандартная загрузка сегментов не даст воспроизводимых файлов. В таких случаях потребуется ключ или иной способ легального доступа.

Пошаговая инструкция: от плейлиста к файлу

  1. Проверка плейлиста: скачайте .m3u8 и убедитесь, что он содержит прямые ссылки на сегменты (.ts) и не содержит #EXT-X-KEY (или у вас есть ключ).
  2. Автоматический парсинг: периодически запрашивайте .m3u8 (например, каждые 3–10 с) и собирайте список новых сегментов.
  3. Скачивание сегментов: сохраняйте сегменты в порядке из плейлиста. Делайте повторные попытки при ошибках.
  4. Сборка в контейнер:
    • Быстрый способ (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
  5. Проверка: сравните длительность и целостность, проиграв готовый файл.

Пример для 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) для непрерывной записи, примеры автозапуска по расписанию и шаблоны логирования сегментов.