AVPlayer seekToTime:不使用缓冲区

时间:2013-05-23 08:06:43

标签: ios video avfoundation http-live-streaming http-streaming

我正在开发一个使用 HTTP Live Streaming 技术播放视频的应用程序 为此,我使用 AVPlayer ,其初始化如下:

[[AVPlayer alloc] initWithURL:[NSURL URLWithString:VIDEO_URL]];

然后我使用self.player.currentItem.loadedTimeRanges检查缓冲区的状态,并在我的自定义视图中显示此范围。

问题是当在由[self.player seekToTime:timeToSeek toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];加载的区域中倒带时,加载视频就像它不在缓冲区中一样。

2 个答案:

答案 0 :(得分:3)

首先,我的回答是假设您使用HTTP Live Streaming作为静态m3u8列表,否则在视频中搜索将没有多大意义。

可能的原因

HTTP Live Streaming使用嵌入子播放列表的m3u样式播放列表。 每个子播放列表显示不同的视频质量,AVPlayer根据网络速度选择使用哪一个。

但是,根据Apple's documentation,当玩家最初开始播放时,首先选择第一个子播放列表,并且只有在播放了几个ts文件后,才会选择相应的子播放列表,如上所述。

所以可能是当你寻找某个时间时,玩家首先尝试播放第一个没有缓存的子列表。

建议的解决方案

尝试以下方法:

  1. 将m3u8流更改为只有一个子流。
  2. 使用kCMTimeZero以外的值作为容差,即CMTimeMake(30, 60)
  3. 监控网络电话以了解播放器下载的确切内容以及何时下载,例如,您可以使用Charles proxy

答案 1 :(得分:1)

尝试使用iOS开发人员库中提供的示例代码StitchedStreamPlayer作为答案。