【问题标题】:AVPlayer seekToTime: doesn't use bufferAVPlayer seekToTime:不使用缓冲区
【发布时间】:2013-05-18 12:05:57
【问题描述】:

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

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

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

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

【问题讨论】:

  • 在设备上运行有帮助
  • 嘿 Pavel - 你发现了吗?我现在遇到这个问题。我正在物理设备上进行测试。在设备上进行测试是否为您解决了问题?
  • 不用找,当你使用直播的时候..你只需要播放当前的流对吗?
  • @AshishKakkad - 我正在将 3/4 分钟的视频流式传输到设备。我的问题是,当用户在他们正在流式传输的视频中寻找某个位置时,缓冲区会被清除。

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


【解决方案1】:

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

可能的原因

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

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

因此,当您搜索到某个时间时,播放器可能首先尝试播放未缓存的第一个子列表。

建议的解决方案

尝试以下方法:

  1. 将 m3u8 流更改为只有一个子流。
  2. 使用 kCMTimeZero 以外的值作为容差,即CMTimeMake(30, 60)
  3. 监控网络调用以查看播放器下载的具体内容以及下载时间,例如,您可以使用 Charles proxy

【讨论】:

  • 如果我们采用第一种解决方案,那么我猜 Apple 会拒绝该应用程序。作为流媒体,子流会扼杀使用HLS视频的目的
【解决方案2】:

尝试使用 iOS 开发者库中提供的示例代码 StitchedStreamPlayer 来回答您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多