在使用AVPlayer创建显示 HLS实时流的应用程序时,我遇到了无法控制播放器需要缓冲多少数据的问题。我想向用户介绍暂停直播的可能性,可以说最多3分钟,然后自动恢复播放。但是似乎无法将AVplayer / AVplayerItem配置为至少缓冲3分钟的视频数据。
我尝试了
的组合playerItem.canUseNetworkResourcesForLiveStreamingWhilePaused = true;
playerItem.preferredForwardBufferDuration = 180;
但是,在暂停流时,大多数流会缓冲多达一分钟的数据,允许在暂停后继续播放视频,但是当暂停时间较长时,缓冲会被清除并且实时播放会恢复。
目前还不清楚如何从playerItem解释loadingTimeRanges :(在t = 35处按下暂停)
16:53:06.30 : BUFFER = [ 32 < _35_ < 60 ] => 25 seconds available | buffer = 28
16:53:07.30 : BUFFER = [ 32 < _35_ < 62 ] => 27 seconds available | buffer = 30
16:53:08.30 : BUFFER = [ 34 < _35_ < 62 ] => 27 seconds available | buffer = 28
16:53:09.30 : BUFFER = [ 34 < _35_ < 64 ] => 29 seconds available | buffer = 30
16:53:10.30 : BUFFER = [ 34 < _35_ < 64 ] => 29 seconds available | buffer = 30
16:53:11.30 : BUFFER = _35_ < [ 36 < 66 ] => 31 seconds available | buffer = 30
16:53:12.30 : BUFFER = _35_ < [ 38 < 66 ] => 31 seconds available | buffer = 28
16:53:13.30 : BUFFER = _35_ < [ 38 < 68 ] => 33 seconds available | buffer = 30
在此示例中,我仅收到1个范围,即从38秒到68秒,这给了我实时时刻前30秒的缓冲,该缓冲随着时间的流逝而更新。视频在t = 35(此范围之外)处暂停。恢复播放可以正确输出视频,而当前时间仍保持在给定范围之外...因此,某种程度上,缓冲的数据要大于loadTimeRanges中提供的信息(同样适用于seekableTimeRanges)。
暂停时间超过100秒(在t = 267时)后,缓冲区将被清除:
16:58:51.47 : BUFFER = _267_ < [ 370 < 375 ] => 99 seconds available | buffer = 5
16:58:51.72 : BUFFER = _267_ < [ 370 < 375 ] => 99 seconds available | buffer = 5
16:58:51.97 : BUFFER playbackBuffer EMPTY
16:58:51.97 : BUFFER playbackBuffer LIKELY TO KEEP UP
16:58:52.19 : BUFFER playbackBuffer FULL
16:58:52.19 : BUFFER playbackBuffer EMPTY
16:58:53.18 : BUFFER playbackBuffer LIKELY TO KEEP UP
16:58:53.21 : BUFFER = [ 400 < _400_ < 402 ] => 2 seconds available | buffer = 2