Поддерживает ли Chromecast трансляцию видео с Reddit? (Видео HLS и Dash) - PullRequest
5 голосов
/ 18 марта 2019

Вызываемый прокси с URL http://192.168.xx.xx:8080/3hyw7hwoajn21/HLSPlaylist.m3u8 Вызывается прокси с URL http://192.168.xx.xx:8080/3hyw7hwoajn21/HLS_540_v4.m3u8 Вызывается прокси с URL http://192.168.xx.xx:8080/3hyw7hwoajn21/HLS_AUDIO_160_K_v4.m3u8 Вызывается прокси с URL http://192.168.xx.xx:8080/3hyw7hwoajn21/HLS_224_v4.m3u8

Вот пример видео Reddit: https://www.reddit.com/r/me_irl/comments/b3vrs4/me_irl

Просматривая JSON , у него есть несколько опций для видеоисточников:

"reddit_video": {
    "dash_url": "https://v.redd.it/3hyw7hwoajn21/DASHPlaylist.mpd",
    "duration": 76,
    "fallback_url": "https://v.redd.it/3hyw7hwoajn21/DASH_720?source=fallback",
    "height": 720,
    "hls_url": "https://v.redd.it/3hyw7hwoajn21/HLSPlaylist.m3u8",
    "is_gif": false,
    "scrubber_media_url": "https://v.redd.it/3hyw7hwoajn21/DASH_240",
    "transcoding_status": "completed",
    "width": 1280
}

Хотя я, похоже, могу заставить другие видео HLS / m3u8 работать с Chromecast SDK (например, Пример Google HLS-видео ), я не могу заставить работать любой из этих источников.

Я попытался https://v.redd.it/3hyw7hwoajn21/HLSPlaylist.m3u8 с типом потока, установленным как "живой" или "буферизованный", я попробовал тип контента как "application / x-mpegURL", и я попробовал То же самое для URL-адреса тире https://v.redd.it/3hyw7hwoajn21/DASHPlaylist.mpd с типом контента "application / dash + xml" также безрезультатно Я нашел этот вопрос , который, кажется, указывает на некоторую возможность?

Я также заметил, что с файлом DASH есть отдельный видео и аудио поток (https://v.redd.it/3hyw7hwoajn21/DASH_720 и https://v.redd.it/3hyw7hwoajn21/audio) В худшем случае есть способ воспроизвести видео поток с отдельным аудио потоком играть тоже на Chromecast?

Разве Chromecast не может воспроизводить эти типы видео?

UPDATE

Джесси и Аэргистал предположили, что это связано с отсутствием заголовков CORS. Я создал специальное приложение-получатель, чтобы получать лучшие журналы отладки, и это была действительно (первая) проблема; Chromecast жалуется на CORS.

Используя nginx, я создал локальный обратный прокси-сервер, который добавляет все заголовки CORS, затем вместо этого я даю Chromecast этот URL-адрес прокси, и эта ошибка CORS исчезла.

Однако, используя ссылку HLS / m3u8, она все равно не будет транслироваться. Теперь жалуется на следующее:

[cast.player.hls.PackedAudioParser] Ни ID3, ни заголовок ADTS не были найдены в 0

* * И тысяча сорок-девять

[cast.player.api.Host] ошибка: cast.player.api.ErrorCode.NETWORK/315

и

[cast.receiver.MediaManager] Ошибка загрузки метаданных: ошибка

Полный журнал:

enter image description here

Что заставляет его все еще не играть. Есть идеи?

Добавление проблемы CORS позволяет загружать вариант DASHPlaylist.mpd (раньше этого не было), что замечательно, но не так здорово одновременно, поскольку обратный прокси-сервер требует сначала загрузить весь ответ, и где URL-адрес DASH представляет собой всего MP4 (тогда как HLS - это байтовые диапазоны), это означает, что обратный прокси-сервер должен сначала загрузить все видео DASH, прежде чем его показывать, что занимает много времени по сравнению с HLS.

Так что все равно было бы оптимально заставить HLS работать из-за скорости, но просто обречен ли он не работать из-за проблем с воспроизведением в Chromecast?

Ответы [ 2 ]

6 голосов
/ 24 марта 2019

Заключение

Наиболее этичный ответ - работать с Reddit, чтобы убедиться, что они установили правильные заголовки CORS. Заголовки CORS требуются в документации Google.

Имитация вашей проблемы

Использование этого тестера:

https://developer.jwplayer.com/tools/stream-tester/

Он имитирует некоторые из тех же впечатлений, которые вы испытывали в своем коде с Chromecast SDK. Видео Google воспроизводилось без настройки Playready DRM, а видео с Reddit - нет (в большинстве браузеров).

MS EDGE и jwplayer

Если вы выберете Playready и поместите что-нибудь для URL Playready, даже оставив его пустым, оно будет работать для M3U8.

Internet Explorer и jwplayer

Ошибка, 232011 Запрос манифеста был сделан без надлежащих учетных данных междомена. Не удается загрузить M3U8: кросс-доменный доступ запрещен. Это видео не может быть воспроизведено из-за технической ошибки.

Это указывает на то, что, возможно, CORS не включен на серверах Reddit. Подробнее об этом ниже.

Firefox и jwplayer

Кажется, ничего не работает с jwplayer.

Chrome и jwplayer

Не работает с jwplayer.

Safari и jwplayer player

Вы указали, что он работает без необходимости установки каких-либо настроек DRM.

iPhone / Apple TV

Я попробовал, и видео m3u8 может использовать AirPlay для прямой трансляции с телефона на Apple TV (4K).

Сводка моделирования

Все видео M3U8 уже могут транслироваться с iPhone на AppleTV, просто отлично с Airplay. Похоже, что это работает Edge, а также в Safari, так что, возможно, это работает только потому, что Reddit принял потоковую передачу Apple через эфир в качестве службы, но не Chromecast. Не совсем уверен, но как еще это можно объяснить? Было бы здорово получить от кого-то больше разъяснений.

Анализ первопричин

Обратите внимание, что ссылка Google, которой вы поделились, включает этот заголовок:

Access-Control-Allow-Origin

и он установлен на * (он же все), что означает, что сервер будет использовать запрошенные ресурсы для любого домена в Интернете.

https://tools.geekflare.com/report/cors-test/https://commondatastorage.googleapis.com/gtv-videos-bucket/CastVideos/hls/DesigningForGoogleCast.m3u8

Ссылки Reddit не имеют этого заголовка, что означает, что CORS не разрешено совместное использование ресурсов, что означает, что он не предназначен для работы.

Описание заголовков CORS https://www.codecademy.com/articles/what-is-cors

Заголовок Access-Control-Allow-Origin позволяет серверам указывать, как их ресурсы используются совместно с внешними доменами. Когда будет сделан запрос GET для доступа к ресурсу на сервере A, сервер A ответит значением заголовка Access-Control-Allow-Origin. Много раз это значение будет *, означая, что Сервер A будет совместно использовать запрошенные ресурсы с любым доменом в Интернете. В других случаях значение этого заголовка может быть задано для конкретного домена (или списка доменов), а это означает, что Сервер A будет совместно использовать свои ресурсы с этим конкретным доменом (или списком доменов). Заголовок Access-Control-Allow-Origin важен для безопасности ресурсов.

Существует несколько ресурсов, указывающих, что CORS должен быть включен со стороны сервера:

https://stackoverflow.com/a/28360045/9105725

https://help.ooyala.com/video-platform/concepts/cors_enablement.html

Даже Google говорит, что эти заголовки должны быть установлены: https://developers.google.com/cast/docs/chrome_sender/advanced

Требования к CORSДля адаптивной потоковой передачи мультимедиа Google Cast требует наличия заголовков CORS, но даже для простых потоков мультимедиа mp4 требуется CORS, если они содержат дорожки.Если вы хотите включить треки для любого медиа, вы должны включить CORS для ваших потоков треков и ваших медиа потоков.Таким образом, если на вашем сервере нет доступных заголовков CORS для простых носителей mp4, и вы затем добавляете простую дорожку субтитров, вы не сможете выполнять потоковую передачу мультимедиа, если не обновите свой сервер, добавив соответствующий заголовок CORS.Кроме того, вам нужно разрешить как минимум следующие заголовки: Content-Type, Accept-Encoding и Range.Обратите внимание, что последние два заголовка являются дополнительными заголовками, которые вам могут не понадобиться ранее.

4 голосов
/ 25 марта 2019

Решение для HLS с отдельными звуковыми дорожками


На основании информации из последнего журнала существует несоответствие между выбранным форматом сегмента и фактическим форматом, используемым в потоке. Поток использует AAC в MPEG-TS, тогда как Cast SDK пытается проанализировать его как упакованный звук.

A ответ на трекере проблем приведения показывает, что HlsSegmentFormat по умолчанию равно MPEG2_TS, если поток мультиплексирован, и MPEG_AUDIO_ES в противном случае.

Предлагаемое решение для приемника CAF - перехватывать запросы на загрузку и переопределять формат сегмента с помощью loadRequestData.media.hlsSegmentFormat = cast.framework.messages.HlsSegmentFormat.TS. Немного модифицированный пример:

<html>
<head>
</head>
<body>
  <cast-media-player id="player"></cast-media-player>
  <script type="text/javascript" src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js">
  </script>
  <script>
    const context = cast.framework.CastReceiverContext.getInstance();
    const playerManager = context.getPlayerManager();
    // intercept the LOAD request
    playerManager.setMessageInterceptor(
        cast.framework.messages.MessageType.LOAD, loadRequestData => {
            loadRequestData.media.hlsSegmentFormat = cast.framework.messages.HlsSegmentFormat.TS;
            return loadRequestData;
        });
    context.start();
  </script>
</body>
</html>

Оригинальный источник

Еще один пример


Решение для CORS


Ссылка Google Cast дает вам решение:

Если у вас проблемы с воспроизведением потоков на устройстве Cast, это может быть связано с CORS. Используйте общедоступный прокси-сервер CORS для проверки своих потоков

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

Текущие потоки не защищены DRM. Это станет более сложным или просто невозможным позже, если они добавят аутентификацию CDN или защитят потоки с помощью DRM.


Что касается заголовков CORS, вы должны убедиться, что предварительные запросы поддерживаются: клиент может сначала отправить OPTIONS для проверки поддержки CORS (включая разрешенные методы и заголовки).

Запросы диапазона HTTP также должны поддерживаться для ваших потоков, что означает, что соответствующие заголовки должны быть авторизованы и предоставлены.

Пример конфигурации запроса предварительной проверки с https://enable -cors.org :

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,POST,OPTIONS
Access-Control-Allow-Headers: DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range
Access-Control-Expose-Headers: Content-Length,Content-Range


Вам нужно будет разрешить как минимум: GET, OPTIONS, Content-Type и Range заголовки и выставить Content-Length, Content-Range. Удалите дублирующиеся заголовки, если они предоставлены удаленным сервером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...