Конфигурация CORS для размещенного на S3 видео HLS в проигрывателе JW - PullRequest
0 голосов
/ 16 декабря 2018

У меня проблемы с кастингом собственного видео JW Player.Вот соответствующая ссылка в Javascript API для настройки проигрывателя.
https://developer.jwplayer.com/jw-player/docs/developer-guide/customization/configuration-reference/#casting

Вот некоторые подробности о моей настройке:
1) Видео в потоковом формате HLS.Поэтому файл, который я передаю в Javascript API JW Player, имеет расширение .m3u8.
2) Видео размещено на S3.
3) Видео подается через CloudFront.

Воткод, который я использую для загрузки видео в JW Player:

<div id="jwplayer"></div>
var playerInstance = jwplayer('jwplayer');
playerInstance.setup({ 
  file: <cloudfront-path-to-m3u8-file>,
  androidhls: true,
  cast: {},
});

Когда я использую версию 7.12.13 библиотеки JW Player JW Player, вот что я наблюдаю:

1)видео нормально загружается в браузер.
2) Когда я пытаюсь разыграть его, я вижу в браузере спиннер, указывающий, что он собирается начать воспроизведение через Chromecast.
3) Chromecast выглядит так, как будтособирается начать воспроизведение видео на телевизоре.Я вижу символ Chromecast со спиннером, затем линейку временной шкалы видео.
4) Через несколько секунд я вижу домашний экран Chromecast.Видео никогда не воспроизводится на телевизоре.
5) На этом этапе видео начинает воспроизводиться в браузере.
6) Я вижу следующее сообщение об ошибке в консоли отладки браузера:

provider.cast.js:1 Error: {code: "session_error", description: 
"LOAD_FAILED", details: {…}}code: "session_error"description: 
"LOAD_FAILED"details: {type: "LOAD_FAILED"}__proto__: Object
d.error @ provider.cast.js:1
(anonymous) @ cast_sender.js:70
U.onMessage @ cast_sender.js:76
M.i @ cast_sender.js:56

Когда я использую версию 8.6.3 библиотеки JW Player JW Player, вот что я наблюдаю:

1) Видео отлично загружается в браузере.
2) Когда я пытаюсь его разыграть, я вижуспиннер в видео в браузере, указывающий, что он собирается начать воспроизведение через Chromecast.
3) Похоже, что Chromecast начинает воспроизведение видео на телевизоре.Я вижу символ Chromecast со спиннером, затем линейку временной шкалы видео.
4) Через несколько секунд я вижу только символ Chromecast на телевизоре.
5) Вращается спиннер в проигрывателе видео в браузере.на неопределенный срок.
6) Я вижу следующее сообщение об ошибке в консоли отладки браузера:

provider.cast.js:10 Uncaught TypeError: Cannot read property 'trigger' of undefined
    at c.<anonymous> (provider.cast.js:10)
    at s (application-0a118d5fa8c4bb8de5f5da2cc04ef8c3a0cc5bf84da710890d3a90e9c79a04ee.js:3)
    at c.a [as trigger] (application-0a118d5fa8c4bb8de5f5da2cc04ef8c3a0cc5bf84da710890d3a90e9c79a04ee.js:3)
    at t.error (provider.cast.js:10)
    at cast_sender.js:70
    at U.onMessage (cast_sender.js:76)
    at M.i (cast_sender.js:56)
(anonymous) @ provider.cast.js:10
s @ application-0a118d5fa8c4bb8de5f5da2cc04ef8c3a0cc5bf84da710890d3a90e9c79a04ee.js:3
a @ application-0a118d5fa8c4bb8de5f5da2cc04ef8c3a0cc5bf84da710890d3a90e9c79a04ee.js:3
t.error @ provider.cast.js:10
(anonymous) @ cast_sender.js:70
U.onMessage @ cast_sender.js:76
M.i @ cast_sender.js:56

Любые идеи о том, что означают эти ошибки или как отладить эту проблему?

Обратите внимание, что я выполнил вышеупомянутые тесты в Chrome (версия 71.0.3578.98, 64-разрядная версия) на Ubuntu 14.04.Я также попытался привести эти страницы с устройства Android, но получил те же результаты.

Несколько вещей, которые я пробовал:

  • Настроил CORS в корзине S3, чтобы разрешить доступ из этихдомены.
  • В корзину S3 добавлен crossdomain.xml, чтобы разрешить доступ с этих доменов.
  • Признание недействительными кэшированных объектов в ребрах CloudFront
  • Очистка кэша браузера.

Пытаясь изолировать проблему, я также попытался сделать следующее:

  • Заменить файл m3u8 файлом webm.Я могу успешно разыграть с этой установкой.
  • Заменить файл m3u8 на файл mp4.Я могу успешно разыграть с этой настройкой.
  • Заменить путь CloudFront на прямой путь S3.Я наблюдаю то же проблемное поведение, которое я описал выше (т.е. не могу приводить и видеть ошибки в консоли).

Я обнаружил, что изменение конфигурации CORS для корзины S3, чтобы разрешить доступ из всех источников, исправляетпроблема:

<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <ExposeHeader>ETag</ExposeHeader>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>

Однако это, безусловно, не идеально, поскольку открывает доступ к любому домену.Я попытался ограничить доступ, явно указав CORSRule блоки для домена, который я использую для обслуживания видеоплеера.Я также попытался добавить http://*.jwpcdn.com и https://*.jwpcdn.com в качестве разрешенных источников, поскольку я считаю, что именно здесь размещен приемник Chromecast от JWPlayer.https://support.jwplayer.com/articles/cross-domain-file-loading-reference

Ни одна из этих комбинаций не сработала.Единственный способ заставить JW Player успешно использовать HLS-видео - это разрешить доступ из всех источников.

Любая идея, как настроить CORS для получения желаемого поведения без ущерба для конфиденциальностиведра.

Спасибо!

1 Ответ

0 голосов
/ 26 декабря 2018

Оказывается, мне также нужно было разрешить доступ с https://*.gstatic.com. Это в дополнение к http://*.jwpcdn.com и домену, на котором размещен видеоплеер.Теперь я могу успешно транслировать видео HLS из JW Player версий 7 и 8!

После этих изменений вот как выглядит конфигурация CORS для моей корзины S3:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>http://my-domain-with-video-player.com</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
<CORSRule>
    <AllowedOrigin>http://*.jwpcdn.com</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
<CORSRule>
    <AllowedOrigin>https://*.gstatic.com</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
...