AVFoundation系列二:用AVPlayer播放视频

AVFoundation系列二:用AVPlayer播放视频
发现一个比较好的文章,搬来借用,这是根据苹果官方文档翻译的,并加入了自己的见解;尤其是加载网络的url分析见解,之后可能会根据另一大神的开源demo,总结一下边下边播,所以这里我无耻的设为了原创




原文链接:
控制assets的播放,你可以使用AVPlayer对象。在播放的过程中,你可以使用AVPlayerItem对象来管理asset的呈现,AVPlayerItemTrack来管理track。要显示视频,需要使用AVPlayerLayer。

播放Assets

一个播放器就是控制asset播放的对象,比如开始和结束,seek到指定的时间。可以使用AVPlayer来播放单个asset,用AVQueuePlayer来播放多个连续的asset。
一个player向你提供播放的信息,如果需要,你通过player的状态同步显示到界面上。你也可以直接把player的输出显示笑傲指定的动画层(AVPlayerLayer或者AVSynchronizedLayer),想知道更多关于layer的信息,请查看

多个layer的情况:你可以创建多个AVPlayerLayer对象,但是只有最近创建的layer才会显示视频画面。

虽然是播放asset,但是不能直接把asset传给AVPlayer对象,你应该提供AVPlayerItem对象给AVPlayer。一个player item管理着和它相关的asset。一个player item包括player item tracks-(AVPlayerItemTrack对象,表示asset中的tracks)。

这表明你可以同时用不同的player播放同一个asset,如下图显示,两个不同的player播放同一个asset。你可以用一个存在asset直接初始化player,或者直接用URL初始化。和AVAsset一样,简单的初始化一个player并不表示可以马上进行播放,你需要观察它的status(通过kvo)来决定是否可以播放。

处理不同类型的asset

配置asset的方式由需要播放的asset的类型决定的。概括的说,有两种方式:基于文件的asset,基于流式的(http live streaming format)

加载基于文件的asset,有如下几步:

· 使用AVURLAsset创建一个asset。<p>
· 使用创建的asset来创建一个AVPlayerItem对象item<p>
· item和AVPlayer关联<p>
· 等待item的状态,知道可以播放。

创建基于HTTP live stream的播放器。

用url初始化一个AVPlayerItem对象。(http live stream的情况下不能直接创建AVAsset对象)

NSURL *url = [NSURL URLWithString:@"<#Live stream URL#>];
// You may find a test stream at <http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8>.
self.playerItem = [AVPlayerItem playerItemWithURL:url];
[playerItem addObserver:self forKeyPath:@"status" options:0 context:&ItemStatusContext];
self.player = [AVPlayer playerWithPlayerItem:playerItem];

当你关联一个player item到player的时候,这个播放器开始准备播放。当它可以播放的时候,player item会创建AVAsset和AVAssetTrack对象,这些对象可以用来检查live stream的内容。
为了获取stream的时间,可以通过kvo的方式观察player item的duration的属性。当可以播放的时候,这个属性被设置为正确的值,这时就可以获取时间。

注意:只能在iOS4.3之后使用player item的duration属性。下面这种获取duration的方法适用于所有的iOS系统版本:当player item的状态变为AVPlayerItemStatusReadyToPlay时,duration可以通过下面代码获取
[[[[[playerItem tracks] objectAtIndex:0] assetTrack] asset] duration];

如果仅仅是想播放一个live stream,可以直接用下面的简短代码实现:

self.player = [AVPlayer playerWithURL:<#Live stream URL#>];
[player addObserver:self forKeyPath:@"status" options:0 context:&PlayerStatusContext];

正如assets和items一样,初始化一个player之后并不表明可以马上播放,你需要观察player的status属性,当status变为AVPlayerStatusReadyToPlay时表示可以播放了,你也需要观察curretItem属性来访问player item。

如果你不能确定你用的url是什么类型,可以用下面的方法检测: