HLS с адаптивным битрейтом не работает с Google Cast SDK
Я использую последнюю версию Chrome Sender (v1 новой публичной версии) и сталкиваюсь с проблемами, заставляющими HLS работать.
Мой манифест m3u8 является "основным" списком воспроизведения, который указывает на шесть других списков воспроизведения m3u8 с различным разрешением и скоростью передачи битов, чтобы обеспечить адаптивную потоковую передачу битрейта согласно спецификации.
Этот плейлист хорошо протестирован на работах в моем собственном приложении Roku, в моем iOS-приложении (также с Apple TV) и даже в браузере через Flash (JWPlayer Pro). Это также работает непосредственно в Safari на iOS. Единственное, что немного отличается от моих списков воспроизведения, это то, что они содержат параметры строки запроса, которые обеспечивают истечение срока действия содержимого, но это разрешено в спецификации HLS. Например: playlist.m3u8?expires=1391662909&signature=I3G8RKUkILOwxjZy8EyL5w%3D%3D%24q0WbXA2whSNFAj0Os3NIpfHkqMA%2BH2iqMMjm0xH2CYKNe3jh1jgl%2FUdS39ve%0AFnL%2F
Вот код в моем Chrome Sender, где я устанавливаю URL плейлиста:
var mediaInfo = new chrome.cast.media.MediaInfo('http://master_playlist_url.m3u8');
mediaInfo.contentType = 'application/x-mpegURL';
var request = new chrome.cast.media.LoadRequest(mediaInfo);
request.autoplay = true;
request.currentTime = 0;
session.loadMedia(request, onMediaDiscovered.bind(this, 'loadMedia'), onMediaError);
Носитель не загружается и onMediaError
вызывается с объектом ошибки, содержащим следующее:
code: "session_error"
description: "LOAD_FAILED"
details: null
Я также пытался установить streamType
в chrome.cast.media.StreamType.BUFFERED
, chrome.cast.media.StreamType.LIVE
, а также chrome.cast.media.StreamType.OTHER
каждый с тем же результатом. Я тоже пробовал настройку duration
без удачи Я пытался удалить autoplay
а также currentTime
на LoadRequest, но тоже не повезло.
Мой приемник - это основной пользовательский приемник, как указано ниже:
<html>
<head>
<title>Cast</title>
<script src="//www.gstatic.com/cast/sdk/libs/receiver/2.0.0/cast_receiver.js"></script>
</head>
<body>
<video id='media' width="100%" height="auto" />
<script>
window.onload = function() {
window.mediaElement = document.getElementById('media');
window.mediaManager = new cast.receiver.MediaManager(window.mediaElement);
window.castReceiverManager = cast.receiver.CastReceiverManager.getInstance();
window.castReceiverManager.start();
}
</script>
</body>
</html>
Согласно обновленным документам, теперь поддерживается HLS, но я не могу заставить его работать: https://developers.google.com/cast/docs/media
Следует также упомянуть, что этот код прекрасно работает при использовании прогрессивного MP4 и изменении типа контента на video/mp4
,
ОБНОВЛЕНИЕ: Я решил попробовать удалить основной список воспроизведения (адаптивную потоковую передачу битрейта) из микса и просто использовать один список воспроизведения m3u8, который содержит одно качество сегментов TS. Это произвело ту же самую точную ошибку. Так что, по крайней мере, мы знаем, что проблема не связана именно с адаптивной потоковой передачей битрейта, а со всей поддержкой HLS.
1 ответ
Адаптивные протоколы BitRate нуждаются в библиотеке медиаплеера. Посмотрите либо образец библиотеки Cast Media Player, либо образцы Cast Custom Receiver.