Перейти до основного вмісту

HLS-плеєр: перевірити M3U8-стрім онлайн

Вставте посилання на .m3u8 і відтворіть його в браузері. Побачите варіанти якості, бітрейт і кодеки, чи це прямий ефір і наскільки він відстає, і зрозуміле пояснення, якщо стрім не грає. Безкоштовно, без реєстрації.

Адреса стріму

Тестові стріми:

Стрім відтворюється у вашому браузері просто зі свого сервера. Адреса не надсилається TheLoops і не додається до адреси цієї сторінки.

Плеєр

Вставте адресу стріму або запустіть тестовий

Що показує плеєр

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-TYPEVOD, якщо плейлист не змінюється, 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 сам: стрім грає, але сторінка не може показати чи перемикати варіанти якості.