HLS-плеєр: перевірити M3U8-стрім онлайн
Вставте посилання на .m3u8 і відтворіть його в браузері. Побачите варіанти якості, бітрейт і кодеки, чи це прямий ефір і наскільки він відстає, і зрозуміле пояснення, якщо стрім не грає. Безкоштовно, без реєстрації.
Адреса стріму
Плеєр
Що показує плеєр
HLS (HTTP Live Streaming) нарізає відео на короткі файли й перелічує їх у текстовому плейлисті — .m3u8. Плеєр завантажує плейлист, потім сегменти один за одним звичайним HTTPS. Тому HLS грає в браузері й через CDN, а RTMP — ні.
Майстер-плейлист перелічує кілька варіантів того самого стріму з різною роздільністю й бітрейтом; плеєр обирає один і перемикається, коли змінюється з’єднання. Медіаплейлист перелічує сегменти одного варіанта. Список якості в показниках відображає варіанти майстер-плейлиста; у медіаплейлиста він один.
Плейлист прямого ефіру постійно росте й не має тегу кінця; плейлист запису закінчується #EXT-X-ENDLIST. Цільова тривалість — найдовший сегмент, який обіцяє сервер. Плеєри стартують приблизно за три таких сегменти від краю ефіру, тож із 6-секундними сегментами глядач відстає на ~18 секунд, ще до затримки енкодера.
Чому стрім, що грає деінде, не грає в браузері
- CORS. Браузер дозволяє сторінці читати файл з іншого сайту, лише якщо той сервер надсилає Access-Control-Allow-Origin. Десктопні плеєри на кшталт VLC і ffplay цього не перевіряють, тому грають стрім, який ця сторінка не може.
- Змішаний вміст. HTTPS-сторінка не може завантажити стрім за http://. Віддавайте плейлист і сегменти через HTTPS.
- Прострочені або закриті адреси. Підписані адреси мають токен, що спливає, а деякі CDN перевіряють Referer. 403 тут зазвичай означає одне з двох.
- Кодеки. Відео H.264 зі звуком AAC грає в кожному сучасному браузері. HEVC, AV1 і деякі аудіокодеки залежать від браузера й пристрою.
Стримінгові платформи працюють навпаки: ваш енкодер надсилає RTMP на YouTube, Twitch чи Kick, а вони перетворюють його на HLS для глядачів. Їхні сторінки перегляду — не .m3u8-посилання, а внутрішні плейлисти підписані й прив’язані до власних плеєрів, тож тут вони не заграють.
Як читати файл M3U8
.m3u8 — звичайний текст: відкрийте його у вкладці браузера чи текстовому редакторі. Майстер-плейлист називає по медіаплейлисту на кожен варіант якості з тегами, за якими плеєр обирає між ними:
#EXTM3U #EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720,CODECS="avc1.64001f,mp4a.40.2" 720p/index.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=6000000,RESOLUTION=1920x1080,CODECS="avc1.640028,mp4a.40.2" 1080p/index.m3u8
| Тег | Що означає |
|---|---|
#EXTM3U | Перший рядок кожного HLS-плейлиста. Файл без нього — не плейлист; це помилка «не HLS-плейлист» вище. |
#EXT-X-STREAM-INF | У майстер-плейлисті: один варіант якості. BANDWIDTH — піковий бітрейт у бітах на секунду; RESOLUTION, CODECS і FRAME-RATE описують варіант; наступний рядок — його медіаплейлист. |
#EXT-X-TARGETDURATION | Найдовший сегмент у цілих секундах. Кожен сегмент після округлення має вміщатися в нього, а плеєри від нього рахують оновлення й відстань від краю ефіру. |
#EXT-X-MEDIA-SEQUENCE | Номер першого сегмента в списку. У прямому ефірі зростає, коли старі сегменти зникають зверху. |
#EXTINF | Тривалість наступного сегмента в секундах; у наступному рядку — адреса сегмента. |
#EXT-X-PLAYLIST-TYPE | VOD, якщо плейлист не змінюється, EVENT, якщо сегменти лише додаються. Вікно прямого ефіру, що відкидає старі сегменти, типу не має. |
#EXT-X-DISCONTINUITY | Наступний сегмент не продовжує попередній: новий файл, нові мітки часу чи нове кодування. Плейлист 24/7, що склеює кілька відео, потребує його на кожному стику, інакше плеєри можуть там зависнути чи перескочити. |
#EXT-X-PROGRAM-DATE-TIME | Реальний час першого кадру сегмента: плеєр може показати справжній час і синхронізувати стріми. |
#EXT-X-ENDLIST | Нових сегментів не буде: це запис або прямий ефір, що вже завершився. |
Як зробити HLS-стрім для перевірки
Якщо потрібен власний стрім, FFmpeg зробить його з будь-якого відеофайлу. Ця команда відтворює файл у реальному часі й тримає вікно ефіру з шести 4-секундних сегментів:
ffmpeg -re -i input.mp4 \ -c:v libx264 -preset veryfast -b:v 3000k -g 60 -keyint_min 60 -sc_threshold 0 \ -c:a aac -b:a 128k \ -f hls -hls_time 4 -hls_list_size 6 -hls_flags delete_segments \ stream.m3u8
Для відео 30 fps -g 60 ставить ключовий кадр кожні 2 секунди, а -sc_threshold 0 не додає зайвих ключових кадрів на зміні сцен, тож кожен 4-секундний сегмент починається чисто. Приберіть -re і додайте -hls_playlist_type vod, щоб отримати плейлист запису. Віддавайте папку через HTTPS із заголовком CORS і правильними типами вмісту, наприклад у nginx:
location /hls/ {
add_header Access-Control-Allow-Origin * always;
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
}Без заголовка браузери на інших сайтах, і ця сторінка теж, відмовляються читати стрім, а VLC його все одно грає.
Потрібен стрім, який не зупиняється?
TheLoops цілодобово тримає відео чи плейлист в ефірі на YouTube, Twitch і Kick із хмари, без увімкненого комп’ютера. Безкоштовний пробний період 24 години.
Почати безкоштовноПитання та відповіді
Текстовий плейлист у UTF-8. Для HLS він перелічує або сегменти відео в порядку відтворення, або, у майстер-плейлисті, різні варіанти якості того самого стріму. Відкрийте його в текстовому редакторі — він починається з #EXTM3U.
VLC — десктопна програма, тож браузерні правила її не стосуються: вона грає http://-стріми, не потребує заголовків CORS і декодує більше кодеків. Вебсторінці потрібен HTTPS-стрім, сервер якого дозволяє читання з інших сайтів (CORS), і кодек, який підтримує браузер.
Ні. Сторінка перегляду — не .m3u8-посилання, а внутрішні HLS-плейлисти платформ підписані, швидко спливають і працюють лише в їхніх плеєрах. Цей інструмент — для стрімів, які ви хостите самі або маєте на них публічне HLS-посилання.
Ні. Ваш браузер завантажує плейлист і сегменти напряму з сервера стріму. Для плеєра на сторінці немає серверної частини, адреса не зберігається й не потрапляє в адресний рядок, тож не доходить до нашої аналітики.
HLS-плеєри стартують на кілька сегментів назад від краю ефіру, приблизно на три цільові тривалості, щоб мати запас у буфері. Із 6-секундними сегментами це ~18 секунд плюс затримка енкодера й CDN. Low-latency HLS і коротші сегменти її зменшують.
HLS із шифруванням AES-128 грає, якщо адреса ключа доступна з браузера за тим самим правилом CORS, що й плейлист. Стріми з DRM (Widevine, FairPlay, PlayReady) потребують сервера ліцензій і тут не грають.
Так. На Android і сучасних iPhone сторінка відтворює через hls.js і показує всі показники. На iPhone з iOS, старішою за 17.1, Safari відтворює HLS сам: стрім грає, але сторінка не може показати чи перемикати варіанти якості.