iPhone OS 主要提供了几种播放音频的方法
- SystemSound Services
- AVAudioPlayer 类
- 只能播放本地和网络音频, 网络音频需要缓存到本地.
- AVPlayer
- Audio Queue Services
- OpenAL
AVAudioPlayer类调用哪个框架, 使用步骤
框架: AVAudioPlayer
步骤
- 配置 AVAudioPlayer 对象
- 实现 AVAudioPlayer 类的代理方法
- 控制 AVAudioPlayer 类的对象
- 监控音量
- 回放进度和拖拽播放
AVPlayer
使用AVPlayer 会使用的三个类
- AVPlayerItem
self.playerItem = [AVPlayerItem playerItemWithURL:videoURL];
- AVPlayer
self.player = [AVPlayer playerWithPlayerItem:_playerItem];
- AVPlayerLayer
self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player];
开始
[self.player play]
暂停
[self.player pause]
- AVPlayer 有个 rate 属性, 1 时正常播放, 0 时是暂停播放.
- AVPlayerItem 有个 videoGravity 属性, 常用的2个枚举
- AVLayerVideoGravityResizeAspectFill 等比例填充多余裁剪
- AVLayerVideoGravityResizeAspect 等比例填充留下黑边
调节音量
- 添加手势调节
- 使用 UISlider 滑动调节
获取播放时间
- AVPlayer 并么有直接提供 API 来获取播放时间, 需要我们通过该计算得到
- AVPlayer 下有个 CMTime 属性, 这个属性由 value 和 timeScale 组成, value / timeScale 得到秒数
- 通过CMTimeGetSeconds([_player currentTime]) / 60可以获得当前分钟,CMTimeGetSeconds([_player currentTime]) % 60可以获得当前秒数
- 通过playerItem.duration.value / _playerItem.duration.timescale / 60可以获得视频总分钟数,通过playerItem.duration.value / _playerItem.duration.timescale % 60可以获得视频总时间减分钟的秒数
- 搭配定时器就可以设置视频当前播放时长和视频总时长
Slider滑动结束视频跳转
- 通过 seekToTime 可以跳转到视频的某个点, 传入的值也是 CMTime 类型的
- 通过以上方法我们也可以实现记录上次播放的时间接节点, 在下次播放时跳转到上次播放的地方, 这里要注意的是必须要等到播放器准备好以后才可以调用 seekToTime 这个方法, 否则会崩溃, 通过 KVO 来监听 Status 属性, 当
self.player.status == AVPlayeStatusReadyToPlay
的时候调用 seekToTime 方法
全屏播放
- 把播放器添加在 keyWindow 上, 可以实现全屏.