iOS Chromecast: чтение продолжительности из списка воспроизведения HLS
У меня есть плейлист m3u8 для полнометражного фильма:
#EXTM3U
#EXT-X-VERSION:4
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-TARGETDURATION:3
#EXTINF:2.987,
https://...segment0.ts
#EXTINF:2.987,
https://...segment1.ts
#EXTINF:2.987,
https://...segment2.ts
...
с тегом #EXT-X-PLAYLIST-TYPE:VOD
о котором Apple говорит:
Для сеансов видео по запросу (VOD) доступны медиафайлы, представляющие всю продолжительность презентации. Индексный файл является статическим и содержит полный список URL-адресов ко всем мультимедийным файлам, созданным с начала презентации. Этот вид сеанса предоставляет клиенту полный доступ ко всей программе.
Когда я передаю этот плейлист на собственный проигрыватель iOS или другие пользовательские проигрыватели iOS, проигрыватель определяет общую продолжительность содержимого и отображает его.
Сейчас я пытаюсь разыграть этот же носитель, а Chromecast, похоже, не знает общей продолжительности. Я подключил GCKUIMediaController и UILabels и весь этот джаз, но игрок рассматривает плейлист как прямой эфир, показывая --:--
на общую продолжительность.
Как сделать так, чтобы Chromecast считывал общую продолжительность из списка воспроизведения HLS?
Вот как я загружаю этот элемент в мое приложение iOS Sender: (более или менее)
let metadata = GCKMediaMetadata(metadataType: .movie)
metadata.setString("Blah", forKey: kGCKMetadataKeyTitle)
let mediaInfo = GCKMediaInformation(contentID: URL(string: "https://blah.m3u8"), streamType: GCKMediaStreamType.buffered, contentType: contentType, metadata: metadata, streamDuration: 0, mediaTracks: nil, textTrackStyle: GCKMediaTextTrackStyle.createDefault(), customData: nil)
let builder = GCKMediaQueueItemBuilder()
builder.mediaInformation = mediaInfo
builder.preloadTime = 10.0
builder.playbackDuration = .infinity
let item = builder.build()
item.clearItemID()
let rmc = GCKCastContext.sharedInstance().sessionManager.currentCastSession.remoteMediaClient
rmc.queueLoad([item], start: 0, playPosition: TimeInterval(0.0), repeatMode: .off, customData: nil)
Некоторые документы, которые я нашел:
builder.playbackDuration = .infinity
Продолжительность воспроизведения для элемента в секундах или INFINITY, если должна использоваться фактическая продолжительность потока. (Итак, должно быть установлено правильно.)
GCKMediaStreamType.buffered
Тип буферизованного потока. (Не уверен, что это делает, но я не устанавливаю это
.live
по крайней мере.)
streamDuration: 0
Длина потока в секундах или INFINITY, если это живой поток. По умолчанию 0. Похоже, что наоборот
playbackDuration
на QueueItemBuilder? Я установил это на ноль.
Какие настройки мне не хватает, чтобы Chromecast считывал длительность из моего потокового видео HLS?
1 ответ
По-видимому, проблема заключалась в используемом мной стилевом медиа-ресивере:
Примечание к версии: Receiver API и Media Player Library основаны на Cast SDK v2 и совместимы с отправителями v2 и CAF.
Когда я переключился на медиаресивер по умолчанию, эта проблема исчезла; Я смог увидеть продолжительность в потоке VOD HLS.
Я понял, что такого рода информация предоставляется iOS Cast SDK приложением Receiver, работающим на устройстве Chromecast. Я полагаю, что в Styled Receiver не встроена возможность расчета продолжительности списка воспроизведения HLS.