AVFoundation(五):Playback

要控制资源的播放,请使用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类型,请按照以下步骤操作:

  1. 尝试使用URL初始化AVURLAsset,然后加载其tracks键。
  2. 如果曲目加载成功,则为资源创建播放器项。

如果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)</
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值