要控制资源的播放,请使用AVPlayer对象。在播放过程中,可以使用AVPlayerItem实例来管理整个资源的显示状态,使用AVPlayerItemTrack对象来管理单个曲目的显示状态。要显示视频,请使用AVPlayerLayer对象。
播放 asset
播放器是一个控制器对象,用于管理资源的播放,例如开始和停止播放以及查找特定时间。您可以使用AVPlayer的一个实例来播放单个资源。可以使用AVQueuePlayer对象按顺序播放多个项目(AVQueuePlayer是AVPlayer的子类)。在OSX上,您可以选择使用AVKit框架的AVPlayerView类在视图中播放内容。
播放器为您提供有关播放状态的信息,因此,如果需要,您可以将用户界面与播放机的状态同步。通常将播放器的输出定向到专用的核心动画层(AVPlayerLayer或AVSynchronizedLayer的实例)。要了解有关层的详细信息,请参见《核心动画编程指南》。
多播放器层:您可以从单个AVPlayer实例创建多个AVPlayerLayer对象,但只有最近创建的此类层才能在屏幕上显示任何视频内容。
虽然最终您希望使用asset,但并不直接向AVPlayer对象提供asset。相反,您提供了一个AVPlayerItem实例。播放器项管理与其关联的asset的显示状态。播放器项包含与资源中的曲目相对应的AVPlayerItemTrack的播放器项曲目实例。各种对象之间的关系如图2-1所示。
这种抽象意味着您可以同时使用不同的播放器同时播放被给定的 asset,但每个播放器以不同的方式渲染。图2-2显示了一种可能性,两个不同的播放器使用不同的设置播放相同的asset。例如,使用“曲目”项,可以在播放过程中禁用特定曲目(例如,您可能不想播放声音组件)。
您可以使用现有资源初始化播放器项目,也可以直接从URL初始化播放器项目,以便在特定位置播放资源(AVPlayerItem随后将为资源创建和配置资源)。不过,与AVAsset一样,简单地初始化播放器项目并不一定意味着它可以立即播放。您可以观察(使用键值观察)项目的状态属性,以确定它是否以及何时准备好播放。
处理不同类型的asset
配置播放资源的方式可能取决于要播放的资源的种类。广义上讲,有两种主要类型:基于文件的asset(您可以随机访问这些资产(例如从本地文件、摄像机卷或媒体库)和基于流的资产(HTTP直播格式)。
加载和播放基于文件的资源。播放基于文件的资产有几个步骤:
- 使用AVURLAsset创建一个asset。
- 使用资源创建AVPlayerItem的实例。
- 将该项与AVPlayer实例关联。
- 等待项目的status属性指示它已准备好播放(通常使用key value observing在状态更改时接收通知)。
这种方法在将其放在一起的过程中得到了说明:使用AVPlayerLayer播放视频文件。
创建并准备用于播放的HTTP实时流。使用URL初始化AVPlayerItem的实例。(不能直接创建AVAsset实例来表示HTTP实时流中的媒体。)
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关联时,它将开始准备好进行play。当它准备好播放时,播放器项创建AVAsset和AVAssetTrack实例,您可以使用它们来检查直播流的内容。
要获取流项目的持续时间,可以观察播放器项目的持续时间属性。当项目准备好播放时,此属性将更新为流的正确值。
注意:在播放器项目上使用duration属性需要iOS 4.3或更高版本。与所有版本的iOS兼容的方法包括观察播放器项的状态属性。当状态变为AVPlayerItemStatusReadyToPlay时,可以使用以下代码行获取持续时间:
[[[[[playerItem tracks] objectAtIndex:0] assetTrack] asset] duration];
如果您只是想播放直播流,您可以使用快捷方式直接使用URL创建播放器,并使用以下代码:
self.player = [AVPlayer playerWithURL:<#Live stream URL#>];
[player addObserver:self forKeyPath:@"status" options:0 context:&PlayerStatusContext];
与asset和item一样,初始化播放器并不意味着它已准备好播放。您应该观察player`s的状态属性,当准备好播放时,该属性将更改为AVPlayerStatusReadyToPlay。您还可以观察currentItem属性来访问为流创建的播放器项。
如果您不知道自己的URL类型,请按照以下步骤操作:
- 尝试使用URL初始化AVURLAsset,然后加载其tracks键。
- 如果曲目加载成功,则为资源创建播放器项。
如果1失败,则直接从URL创建AVPlayerItem。
观察player的状态属性以确定它是否可play。
如果任何一条路线成功,您将得到一个play item,然后可以与player关联。
播放item
要开始播放,请向播放机发送播放消息。
- (IBAction)play:sender {
[player play];
}
除了简单的播放之外,您还可以管理播放的各个方面,例如播放头的速率和位置。您还可以监视播放器的播放状态;例如,如果要将用户界面与资源的显示状态同步,这将非常有用。请参见监视播放。
更改播放速率
您可以通过设置播放机的“速率”属性来更改播放速率。
aPlayer.rate = 0.5;
aPlayer.rate = 2.0;
值为1.0表示“按当前项目的自然速率播放”。将速率设置为0.0与暂停播放相同,也可以使用“暂停”。
支持反向播放的项目可以使用带有负数的rate属性来设置反向播放速率。您可以使用playerItem属性canPlayReverse(支持速率值-1.0)、canPlaySlowReverse(支持介于0.0和-1.0之间的速率)和canPlayFastReverse(支持小于-1.0的速率值)来确定支持的反向播放类型。
寻求重新定位Playhead
要将播放头移动到特定时间,通常使用seekToTime:如下所示:
CMTime fiveSecondsIn = CMTimeMake(5, 1);
[player seekToTime:fiveSecondsIn];
然而,seekToTime:方法是针对性能而不是精度进行调整的。如果需要精确移动播放头,请使用seekToTime:permissionbefore:permissionafter:作为以下代码片段:
CMTime fiveSecondsIn = CMTimeMake(5, 1)</