AVPlayer – 在播放时切换stream的质量

我正在使用AVPlayer播放YouTubevideo,对于每个YouTubevideoID我检索几个不同品质的streamurl。

我想根据networking状态播放特定的stream媒体质量。 例如,如果用户在3G上,我想播放质量最低的URL,但是如果用户移动到WiFi,我想无缝切换到更好的质量stream。

这不是什么新鲜事,YouTube正在他们的应用程序和其他许多应用程序中这样做。

所以我想知道用AVPlayer进行这种切换的最佳方法是什么,我不希望用户注意到切换,而不会暂停video播放或缓冲。
任何build议?

我不确定在YouTube服务器上是否支持这种function,或者是否需要在客户端执行此function。

你应该看看关于HTTP直播的Apple 文档 。

实现所需的交换types的唯一方法是在文档中讨论使用m3u索引文件和包含video数据的TS文件。

您连接到索引文件并存储其内容,这将是多个URL以及带宽要求。 看到这里的例子。 然后使用Reachability类来检查networking状态并连接到适当的stream。 启动Reachability通知程序,通过更改连接的stream来响应事件。 这将导致属于该stream的TS文件被下载并缓冲回放,实现您想要的切换types。

正如我以前所说,缺点是要使用TS文件。 这意味着你必须从Youtube上下载video文件,使用Apple提供的mediafilesegmenter命令行工具准备好并存储在FTP服务器上! 根本不理想,但据我所知只有这样做的唯一方法。

查看AVPlayer的 replaceCurrentItemWithPlayerItem:方法。 如果我是你,我会使用Reachbility来观察用户的networking状态。 当networking可达性降低时,可以这样做:

 AVPlayerItem *item = [AVPlayerItem playerItemWithURL:urlOfLowerQuality]; [item seekToTime:player.currentTime]; [player replaceCurrentItemWithPlayerItem:playerItem]; 

使用ReachabilityManager检查数据types无线或3G的当前状态。 根据数据模式切换urltypes。切换url需要video当前时间,需要设置video查找时间。