Веб

Почему HLS-трансляция не воспроизводится в Chrome, хотя работает в Firefox

Решение проблем с HLS-трансляцией в Chrome при использовании hls.js в React-приложении. Настройка CORS и альтернативные методы воспроизведения.

5 ответов 1 просмотр

Почему HLS-трансляция не воспроизводится в Chrome, хотя работает в Firefox? Я использую библиотеку hls.js для воспроизведения .m3u8 потока в React-приложении. Поток получаю из локального Ace Stream engine. В Firefox видео воспроизводится без проблем, а в Chrome .m3u8 и .ts сегменты загружаются (статус 200), но видео не воспроизводится. CORS-запросы проходят, поток работает в VLC. Как решить эту проблему с воспроизведением HLS в Chrome?

Проблемы с HLS-трансляцией в Chrome при работе в Firefox могут быть связаны с различными факторами: отсутствием коммерческих кодеков в Chromium, особенностями реализации MediaSource Extensions, или настройками CORS. Библиотека hls.js требует, чтобы все HLS-ресурсы доставлялись с соответствующими CORS-заголовками, что может быть причиной различий в поведении браузеров.


Содержание


Основные проблемы с HLS-трансляцией в Chrome

HLS-стриминг в Chrome сталкивается с несколькими фундаментальными проблемами, которые отличают его от Firefox. Основная разница заключается в том, что Chrome использует коммерческую версию Chromium с лицензированными кодеками, в то время как базовый Chromium поддерживает только открытые кодеки. Это приводит к проблемам совместимости при воспроизведении определенных типов HLS-потоков.

В Chrome реализация MediaSource Extensions работает иначе, чем в Firefox. Библиотека hls.js требует, чтобы все HLS-ресурсы доставлялись с CORS-заголовками, разрешающими GET запросы. При этом Chrome более строг в отношении проверки этих заголовков и правильности формата манифеста .m3u8.

Еще одной распространенной проблемой является поддержка H.265/HEVC кодека. Хотя Chrome недавно добавил поддержку HEVC, она не работает с Widevine L3, что может быть причиной проблемы при использовании определенных типов кодирования видео. Это объясняет, почему поток работает в VLC (который использует системные кодеки), но не воспроизводится в Chrome.

Настройка CORS для HLS-стриминга

Правильная настройка CORS критически важна для работы HLS-стриминга в Chrome. В отличие от Firefox, Chrome более строго проверяет соответствие заголовков CORS при работе с HLS-потоками. Если вы получаете поток из локального Ace Stream engine, необходимо убедиться, что сервер правильно настроен для работы с браузерными запросами.

Для Ace Stream engine требуется установить следующие заголовки:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Content-Type

Важно отметить, что CORS-заголовки должны быть установлены как для манифеста .m3u8, так и для каждого сегмента .ts файла. Проблема может заключаться в том, что Firefox более гибко обрабатывает такие ситуации, игнорируя некоторые несоответствия, в то время как Chrome строго следует требованиям.

Если прямая настройка Ace Stream невозможна, можно использовать прокси-сервер, который будет добавлять необходимые CORS-заголовки. Прокси может быть реализован на Node.js, Python или любом другом серверном технологическом стеке.

Различия между Chrome и Firefox в поддержке HLS

Chrome и Firefox имеют фундаментальные различия в поддержке HLS, которые напрямую влияют на воспроизведение потоков. Firefox изначально лучше поддерживает нативный HLS через HTML5 video элемент, в то время как Chrome полагается на hls.js библиотеку для воспроизведения HLS-потоков.

Firefox также более лоялен к форматам манифеста .m3u8 и может работать с потоками, содержащими некоторые несоответствия, которые критичны для Chrome. Например, Firefox может проигнорировать неправильные относительные пути к сегментам, в то время как Chrome полностью откажется от воспроизведения.

Еще одним важным отличием является работа с кодеками. Firefox поддерживает более широкий спектр кодеков нативно, включая некоторые форматы, которые Chrome обрабатывает только через hls.js. Это особенно актуально для потоков с использованием HEVC/H.265, где Chrome может иметь ограничения из-за лицензионных требований.

Решение проблем с hls.js в React-приложении

При работе с hls.js в React-приложении существуют специфические подходы к решению проблем воспроизведения в Chrome. Во-первых, необходимо правильно инициализировать hls.js, учитывая особенности работы с React-компонентами.

javascript
import { useEffect, useRef } from 'react';
import Hls from 'hls.js';

const VideoPlayer = ({ src }) => {
 const videoRef = useRef(null);
 
 useEffect(() => {
 if (Hls.isSupported()) {
 const hls = new Hls({
 debug: true,
 enableWorker: false,
 lowLatencyMode: false,
 backBufferLength: 90
 });
 
 hls.loadSource(src);
 hls.attachMedia(videoRef.current);
 
 hls.on(Hls.Events.MANIFEST_PARSED, () => {
 videoRef.current.play();
 });
 
 hls.on(Hls.Events.ERROR, (event, data) => {
 if (data.fatal) {
 switch(data.type) {
 case Hls.ErrorTypes.NETWORK_ERROR:
 console.log('Network error, trying to recover...');
 hls.startLoad();
 break;
 case Hls.ErrorTypes.MEDIA_ERROR:
 console.log('Media error, trying to recover...');
 hls.recoverMediaError();
 break;
 default:
 console.error('Fatal error:', data);
 hls.destroy();
 break;
 }
 }
 });
 
 return () => {
 hls.destroy();
 };
 } else if (videoRef.current.canPlayType('application/vnd.apple.mpegurl')) {
 // Для Safari и некоторых других браузеров
 videoRef.current.src = src;
 videoRef.current.addEventListener('loadedmetadata', () => {
 videoRef.current.play();
 });
 }
 }, [src]);
 
 return (
 <video 
 ref={videoRef} 
 controls 
 width="100%" 
 height="auto"
 />
 );
};

В этом коде важно обратить внимание на обработку ошибок и параметры инициализации hls.js. Для Chrome могут потребоваться дополнительные параметры, такие как enableWorker: false, чтобы избежать проблем с потоковой передачей.

Альтернативные методы воспроизведения HLS в Chrome

Если hls.js не работает должным образом в Chrome, существуют альтернативные методы для воспроизведения HLS-потоков. Во-первых, можно использовать другие библиотеки, такие как video.js с плагином для HLS, который может лучше работать с Chrome.

Еще одним вариантом является использование нативного HTML5 video элемента с дополнительными параметрами. Chrome может воспроизводить некоторые типы HLS-потоков нативно, если они соответствуют определенным требованиям:

javascript
const video = document.createElement('video');
video.src = 'your-stream.m3u8';
video.crossOrigin = 'anonymous';
video.controls = true;
document.body.appendChild(video);

Также можно рассмотреть использование dash.js для воспроизведения DASH-потоков, которые имеют лучшую поддержку в Chrome. Если возможно, преобразование HLS в DASH может решить проблему совместимости.

Для случаев, когда требуется воспроизведение HEVC/H.265 потоков, следует учитывать, что Chrome поддерживает этот кодек только на определенных платформах и с определенными ограничениями. В таких случаях может потребоваться использование других браузеров или конвертация потока в более совместимый формат.

Практические рекомендации по устранению неполадок

Для решения проблемы с HLS-трансляцией в Chrome рекомендуется следующий план действий:

  1. Проверьте консоль разработчика Chrome - откройте инструменты разработчика и проверьте вкладку “Network” для анализа запросов к .m3u8 и .ts файлам. Обратите внимание на статус ответов и заголовки CORS.

  2. Убедитесь в правильности CORS-заголовоков - проверьте, что сервер Ace Stream engine отправляет правильные CORS-заголовки для всех типов ресурсов.

  3. Тестируйте с разными потоками - попробуйте воспроизвести другие HLS-потоки из разных источников, чтобы определить, является ли проблема специфичной для Ace Stream или общей для Chrome.

  4. Обновите hls.js - используйте последнюю версию hls.js, так как она может содержать исправления для совместимости с Chrome.

  5. Попробуйте альтернативные браузеры - протестируйте поток в других браузерах на основе Chromium, таких как Edge, чтобы определить, является ли проблема специфичной для Chrome или связана с Chromium в целом.

  6. Используйте прокси-сервер - если прямая настройка CORS невозможна, настройте прокси-сервер, который будет обрабатывать запросы к Ace Stream и добавлять необходимые заголовки.

  7. Рассмотрите альтернативные форматы - если возможно, конвертируйте HLS-поток в более совместимый формат, такой как MP4 или DASH.

  8. Проверьте конфигурацию Ace Stream - убедитесь, что Ace Stream engine правильно настроен для работы с браузерами и предоставляет потоки в правильном формате.

Если ни один из этих методов не помогает, возможно, проблема связана с особенностями работы Chrome с определенными типами потоков, и потребуется поиск альтернативных подходов к решению задачи.


Источники

  1. HLS.js Documentation — JavaScript библиотека для реализации клиентского HTTP Live Streaming: https://github.com/video-dev/hls.js
  2. NW.js Chromium Codecs — Информация о различиях в поддержке кодеков между Chrome и Chromium: https://stackoverflow.com/questions/79381452/hls-js-streaming-code-does-not-work-in-nwjs-app-but-works-in-chrome-browser
  3. HEVC Support in Chrome — Поддержка H.265/HEVC в Chrome и ограничения с DRM: https://stackoverflow.com/questions/77000530/not-able-to-play-h265-stream-with-drm-on-chrome
  4. CORS Issues with HLS — Проблемы CORS при потоковой передаче HLS-потоков и методы их решения: https://stackoverflow.com/questions/79234973/how-to-bypass-cors-when-streaming-youtube-m3u8-and-ts-files-using-hls-js

Заключение

Проблемы с HLS-трансляцией в Chrome при работе в Firefox обычно связаны с различиями в поддержке кодеков, stricter CORS-проверками и особенностями реализации MediaSource Extensions. Для решения проблемы необходимо правильно настроить CORS на сервере Ace Stream, обновить hls.js до последней версии, а в некоторых случаях рассмотреть альтернативные методы воспроизведения, такие как использование других библиотек или преобразование потока в более совместимый формат. Если прямая настройка невозможна, прокси-сервер может быть эффективным решением для добавления необходимых заголовков CORS.

GitHub / Платформа для разработки ПО

HLS.js - это JavaScript библиотека, реализующая клиент HTTP Live Streaming. Она использует HTML5 video и MediaSource Extensions для воспроизведения, выполняя трансмуксинг MPEG-2 Transport Stream и AAC/MP3 потоков в ISO BMFF (MP4) фрагменты. Библиотека требует, чтобы все HLS ресурсы доставлялись с CORS-заголовками, разрешающими GET запросы. Для работы в Chrome необходимо учитывать особенности реализации MediaSource Extensions и поддержку кодеков.

T

Проблема с HLS-воспроизведением в Chrome может быть связана с отсутствием коммерческих кодеков в Chromium. Chrome лицензирует коммерческие кодеки, в то время как Chromium (основой Chrome) поддерживает только открытые кодеки. Для решения проблемы в NW.js необходимо заменить поставляемый FFMPEG dll. На странице разработчика NW.js есть инструкции по сборке собственного FFMPEG-бинарника. Также можно использовать готовые бинарники из репозитория nwjs-ffmpeg-prebuilt, но нужно убедиться в совпадении версий и учесть лицензирование коммерческих кодеков.

D

Chrome недавно добавил поддержку H.265/HEVC воспроизведения, но она не работает с Widevine L3. Ни одна видеобиблиотека не обеспечит эту возможность, так как это встроенная функция браузера, ОС и оборудования. Для Widevine L1 поддержка HEVC возможна только при поддержке платформы. Альтернативой может стать AV1 как замена H.265/HEVC с поддержкой DRM. Начиная с 2024 года, новые iPhone имеют встроенную аппаратную поддержку декодера.

Y

При потоковой передаче YouTube m3u8 и ts файлов с помощью HLS.js возникают CORS ошибки. Проблема в том, что YouTube блокирует прямую потоковую передачу через браузеры из-за CORS политик. К сожалению, обходные методы не работают уже длительное время, так как это заголовок, который должен быть установлен на исходном сервере. Для решения проблемы необходимо настроить CORS-заголовки на сервере, предоставляющем HLS-поток, или использовать прокси-сервер.

Авторы
T
Разработчик
S
Разработчик
D
Разработчик
Y
Разработчик
Источники
GitHub / Платформа для разработки ПО
Платформа для разработки ПО
Проверено модерацией
НейроОтветы
Модерация
Почему HLS-трансляция не воспроизводится в Chrome, хотя работает в Firefox