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,苹果说:

对于视频点播 (VOD) 会话,可以使用媒体文件 表示演示文稿的整个持续时间。索引文件 是静态的,包含所有媒体文件的 URL 的完整列表 自演示文稿开始以来创建。这种会议 允许客户端完全访问整个程序。

当我将此播放列表流式传输到 iOS 本机播放器或其他自定义 iOS 播放器时,播放器会确定内容的总持续时间并显示它。

现在我正在尝试投射相同的媒体,Chromecast似乎不知道总持续时间。 我已经连接了GCKUIMediaController和UILabels以及所有爵士乐,但播放器将播放列表视为实时流,显示整个持续时间的--:--

如何让Chromecast从HLS播放列表中读取总持续时间?

以下是我在iOS发件人应用程序中加载此项目的方式:(或多或少)

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。似乎与 QueueItemBuilder 上的playbackDuration相反? 我将其设置为零。

我缺少哪些设置才能让 Chromecast 读取我的 HLS 流视频的时长?

问题显然出在我正在使用的样式媒体接收器中:

版本说明:接收器 API 和媒体播放器库基于 Cast SDK v2,并且与 v2 和 CAF 发送方兼容。

当我切换到默认媒体接收器时,这个问题消失了;我能够在 VOD HLS 流上看到持续时间。

据我所知,此类信息是由Chromecast设备中运行的接收器应用程序暴露给iOS Cast SDK的。 我想样式接收器没有内置的功能来计算 HLS 播放列表的持续时间。

相关内容

最新更新