iOS 动画 Animation-0-4:CALayer十则示例-AVPlayerLayer

iOS 动画 Animation

Posted by FishYan on August 3, 2016

iOS 动画 Animation-0-4:CALayer十则示例-AVPlayerLayer

AVPlayerLayer

AVPlayerLayer是建立在AVFoundation基础上的实用图层,持有一个AVPlayer,用来播放音视频媒体文件(AVPlayerItems),举例如下:

override func viewDidLoad() {
  super.viewDidLoad()
  // 1
  let playerLayer = AVPlayerLayer()
  playerLayer.frame = someView.bounds
  
  // 2
  let url = NSBundle.mainBundle().URLForResource("someVideo", withExtension: "m4v")
  let player = AVPlayer(URL: url)
  
  // 3
  player.actionAtItemEnd = .None
  playerLayer.player = player
  someView.layer.addSublayer(playerLayer)
  
  // 4
  NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerDidReachEndNotificationHandler:", name: "AVPlayerItemDidPlayToEndTimeNotification", object: player.currentItem)
}
  
deinit {
  NSNotificationCenter.defaultCenter().removeObserver(self)
}
  
// 5
@IBAction func playButtonTapped(sender: UIButton) {
  if playButton.titleLabel?.text == "Play" {
    player.play()
    playButton.setTitle("Pause", forState: .Normal)
  } else {
    player.pause()
    playButton.setTitle("Play", forState: .Normal)
  }
  
  updatePlayButtonTitle()
  updateRateSegmentedControl()
}
  
// 6
func playerDidReachEndNotificationHandler(notification: NSNotification) {
  let playerItem = notification.object as AVPlayerItem
  playerItem.seekToTime(kCMTimeZero)
}

上述代码解释:

  • 新建一个播放器图层,设置框架。
  • 使用AV asset资源创建一个播放器。
  • 告知命令播放器在播放完成后停止。其他选项还有暂停或自动播放下一个媒体资源。
  • 注册AVPlayer通知,在一个文件播放完毕后发送通知,并在析构函数中删除作为观察者的控制器。
  • 点击播放按钮时,触发控件播放AV asset并设置按钮文字。

注意这只是个入门示例,在实际项目中往往不会采用文字按钮控制播放。

AVPlayerLayer和其中创建的AVPlayer会像这样显示为AVPlayerItem实例的第一帧:

AVPlayerLayer还有一些附加属性:

  • videoGravity设置视频显示的缩放行为。
  • readyForDisplay检测是否准备好播放视频。

另一方面,AVPlayer也有不少附加属性和方法,有一个值得注意的是rate属性,对于0到1之间的播放速率,0代表暂停,1代表常速播放(1x)。

不过rate属性的设置是与播放行为联动的,也就是说调用pause()方法和把rate设为0是等价的,调用play()与把rate设为1也一样。

那快进、慢动作和反向播放呢?交给AVPlayerLayer把。rate大于1时会令播放器以相应倍速进行播放,例如rate设为2就是二倍速。

如你所想,rate为负时会让播放器以相应倍速反向播放。

然而,在以非常规速率播放之前,AVPlayerItem上会调用适当方法,验证是否能够以相应速率进行播放:

canPlayFastForward()对应大于1
canPlaySlowForward()对应0到1之间
canPlayReverse()对应-1
canPlaySlowReverse()对应-1到0之间
canPlayFastReverse()对应小于-1

绝大多数视频都支持以不同速率正向播放,可以反向播放的视频相对少一些。演示应用也包含了播放控件: