Chromecast Receiver CAF, бесконечная загрузка потока MPEG-DASH, доступ к ShakaPlayer
У меня проблема с проигрыванием Chromecast в прямом эфире MPEG-DASH. Бесконечная загрузка происходит из-за отсутствия тега UTCTiming в манифесте. Известно, что проблема возникает с ShakaPlayer. Это первая проблема в FAQ: https://github.com/google/shaka-player/blob/master/docs/tutorials/faq.md
На Chromecast, однако, я не могу получить доступ к ShakaPlayer напрямую (или, может быть, есть способ, с которым я не знаком). Есть 2 решения проблемы, о которых я могу думать:
- Изменить манифест динамически.
this.playbackConfig.manifestHandler = (manifest) => { // добавляем UTCTiming в манифест с такими атрибутами: customUTC.setAttribute("scheIdUri", "urn:mpeg:dash:utc:http-head:2014"); customUTC.setAttribute("value", this.manifestUrl); }
Это, однако, не меняет поведение проигрывателя chromecast, бесконечная загрузка все еще происходит, я что-то здесь не так делаю?
- Использование старого плеера (Media Player Library) через настройки
useLegacyDashSupport
нормально воспроизводит поток воспроизведения chromecast, но немного ломает интерфейс. Могу ли я динамически переключаться на устаревший плеер только тогда, когда это необходимо? Например, на основе манифеста или во время loadRequest из приложения отправителя.
2 ответа
UTCTiming
элемент обязателен, так как Shaka Player должен знать, сколько времени на сервере, чтобы он мог играть в нужное время. Если у клиента и сервера разное время, видео, скорее всего, не сможет воспроизводиться. Это на самом деле не требование Shaka Player, больше требование DASH в целом.
Но если вы не можете установить элемент в манифесте, вы можете использовать manifest.dash.clockSyncUri
(см. документацию) параметр конфигурации для установки URL-адреса синхронизации часов. Например:
player.configure({manifest: {dash: {clockSyncUri: 'https://example.com/clock'}}});
Обратите внимание, что URL, используемый для синхронизации часов, должен иметь правильный Date
заголовок в ответе (будьте осторожны с кэшированием), и если запрос является кросс-источником, вам нужно будет выставить заголовок, иначе будут ошибки CORS.
Кроме того, shaka-player # 999 - это запрос на добавление функций для дрифта. После того, как эта функция приземлится, Игрок будет использовать сегменты в манифесте, чтобы угадать живой фронт вместо использования времени часов. Это означает, что вам не нужно устанавливать синхронизацию часов.
Я с тобой согласен. Это очень раздражающее поведение, которое Shaka заставляет использовать UTCTiming.
Если у вас есть возможность изменить коды проигрывателя shaka в вашем форке, я бы посоветовал вам вызвать метод setClockOffset после инициализации манифеста ( отметьте здесь). Манифест имеет презентацию Timeline, которая имеет метод setClockOffset. В противном случае вы можете добраться до манифеста отсюда. Метод setClockOffset запускается для UTCTiming. Если вы не можете настроить UTCTiming для своего манифеста, установка смещения вручную может быть лучшим вариантом для вашего случая.
Пример кода кода будет =>
player.load(manifestUri)
.then(() => {
const manifest = player.getManifest();
const presentationTimeline = manifest.presentationTimeline;
presentationTimeline.setClockOffset(10/* find a suitable offset */);
});
Удачи!