Конвертер видеофайлов из любых популярных форматов в стриминговый формат HLS (HTTP Live Streaming) с помощью FFmpeg
- Конвертирует отдельный видеофайл или все видео из папки
video
(рекурсивно) в HLS-плейлисты с сегментами - Поддерживает большинство популярных форматов видео:
.mov
,.mp4
,.mkv
,.avi
,.webm
,.flv
,.wmv
,.mpeg
,.mpg
и др. - Позволяет гибко настраивать параметры качества и форматирования через аргументы скриптов
/
├─ scripts/
│ └─ clear-folder.js # Утилита для очистки папок (оставляет .gitignore)
├─ video/ # Исходные видеофайлы (источник)
├─ video-hls/ # Папка с результатами конвертации в HLS
├─ config.json # Конфигурационный файл для параметров конвертации и пресетов
├─ convert-to-hls.ps1 # Скрипт для конвертации видео из папки video
├─ package.json # Скрипты npm для запуска задач
└─ README.md # Этот файл
Чтобы избежать хаоса при работе с большим количеством видео, рекомендуется структурировать папку video/
. Это помогает:
- Сохранять порядок в исходниках и в итоговых HLS-папках
- Поддерживать читаемую иерархию
- Исключать случайные пересечения имён и путей
Пример структуры:
video/
├── module-1/
│ ├── video-1.mov
│ └── video-2.mov
├── module-2/
│ ├── video-1.mov
│ └── video-2.mov
После конвертации структура сохраняется в video-hls/
:
video-hls/
├── module-1/
│ ├── video-1/
│ │ ├── video-1.m3u8
│ │ └── segment0.ts ...
│ └── video-2/
│ ├── video-2.m3u8
│ └── segment0.ts ...
├── module-2/
│ ├── video-1/
│ │ ├── video-1.m3u8
│ │ └── segment0.ts ...
│ └── video-2/
│ ├── video-2.m3u8
│ └── segment0.ts ...
- Каждый видеофайл попадает в отдельную HLS-папку, названную по имени файла (без расширения)
- Исходная структура вложенных папок сохраняется
- Можно использовать
video/
как библиотеку исходников иvideo-hls/
как прод-выход без риска путаницы
Если не передавать никаких параметров, будут использованы значения по умолчанию из скрипта (например, height=1080, crf=23 и т.д.):
npm run convert
Чтобы использовать заранее заданный пресет из конфигурационного файла (например, fullhd-high, fullhd-medium, fullhd-low), передай его через параметр -presetName:
npm run convert -- -presetName fullhd-high
npm run convert -- -presetName fullhd-medium
npm run convert -- -presetName fullhd-low
Примечание: пресеты задаются в конфиге (config.json), где хранятся параметры качества, битрейты и прочее
Можно явно указать любые параметры, чтобы переопределить либо дефолты, либо параметры из пресета:
npm run convert -- -height 720 -crf 28 -preset veryfast -audioBitrate 96 -hlsTime 4
Или совместить пресет с частичным переопределением параметров:
npm run convert -- -presetName fullhd-high -crf 20 -hlsTime 8
Параметр | Описание | Значение по умолчанию |
---|---|---|
height |
Высота видео после ресайза. Ширина считается автоматически, кратной 2 | 1080 |
crf |
Constant Rate Factor — качество видео. Чем меньше, тем выше качество и размер файла | 23 |
preset |
Предустановка скорости кодирования: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow | slow |
audioBitrate |
Битрейт аудио в килобитах | 128 |
hlsTime |
Длительность сегмента в секундах (для HLS) | 6 |
-
height
и масштабирование (scale=-2:height): Задаёт вертикальное разрешение выходного видео. Ширина автоматически рассчитывается для сохранения пропорций и кратности 2 (требование кодека H.264) -
crf
(Constant Rate Factor): Основной параметр качества видеокодека x264. Значения от 0 (максимальное качество и размер) до 51 (минимальное качество). Рекомендуется 18-28, 23 — сбалансированное качество. Меньше — лучше качество, но больше размер -
preset
: Определяет скорость кодирования. Чем быстрее — хуже качество при том же crf и меньше нагрузка на CPU. Чем медленнее — выше качество и дольше кодирование -
audioBitrate
: Битрейт аудиопотока. Чем выше, тем лучше качество звука и больше размер аудио. Обычно достаточно 128 кбит/с -
hlsTime
: Время одного сегмента в секундах. Меньше время — более плавное переключение в стриминге, но больше файлов и overhead
В проекте есть скрипт для безопасной очистки папок video
и video-hls
, который не удаляет сами папки и .gitignore
внутри них:
npm run clear:source # Очистка папки с исходными видео (video)
npm run clear:converted # Очистка папки с конвертированными видео (video-hls)
- Требуется Node.js версии 18 и выше
-
Скрипты написаны на PowerShell 7+
-
Проверить установленную версию можно командой:
$PSVersionTable.PSVersion
-
Если у тебя Windows и используется устаревший PowerShell 5.1, рекомендуется установить PowerShell 7 с официального репозитория: https://github.com/PowerShell/PowerShell
Для конвертации используется FFmpeg с поддержкой HLS и кодека libx264
Проверь, установлен ли ffmpeg и доступен ли он в PATH:
ffmpeg -version
Убедись, что в выводе присутствует строка:
configuration: --enable-gpl --enable-libx264 ...
choco install ffmpeg
Или вручную:
- Перейди на сайт: https://ffmpeg.org/download.html
- Скачай релиз от Gyan или BtbN
- Распакуй в удобное место, добавь путь к
bin/
в переменную окруженияPATH
Важно: FFmpeg должен быть установлен глобально и доступен из командной строки. Скрипт не проверяет наличие ffmpeg, поэтому ошибки будут появляться уже на этапе запуска.