iOS开发-AVPlayer的使用
2016-03-18 本文已影响6521人
没阳光的午后
最近项目需求做个播放视频功能,之前对这方面接触的也不多,阅读了一些开源播放器的源码学习了一下,总结了一些使用方法
基本使用
- 使用AVPlayer一般会用到3种类,分别为
AVPlayer
,AVPlayerItem
,AVPlayerLayer
self.playerItem = [AVPlayerItem playerItemWithURL:videoURL];
self.player = [AVPlayer playerWithPlayerItem:_playerItem];
self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player];
以上代码用来初始化播放器,然后调用[self.player play]
开始播放视频,通过调用[self.player pause]
可以用来暂停视频
-
AVPlayer
有个属性rate
,当为1时是正常播放状态,为0时是暂停状态,通过这个属性可以用来判断播放还是暂停 -
AVPlayerItem
有个videoGravity
属性,常用的2个枚举分别为AVLayerVideoGravityResizeAspectFill
和AVLayerVideoGravityResizeAspect
.前者是等比例填充并且会裁减掉部分区域,后者也是等比例填充但会留下黑边.
调节音量
MPVolumeView *volumeView = [[MPVolumeView alloc] init];
_volumeViewSlider = nil;
for (UIView *view in [volumeView subviews]){
if ([view.class.description isEqualToString:@"MPVolumeSlider"]){
_volumeViewSlider = (UISlider *)view;
break;
}
}
以上代码可以用来获取音量,一般2种方式调节音量,一种是添加手势调节,一种是UISlider
去调节,这两种方法都是通过获取滑动的值去改变音量的
获取播放时间
-
AVPlayer
并没有直接提供API来获取播放时间,需要我们通过计算得到 -
AVPlayer
下有个CMTime
这个属性,这个属性由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 == AVPlayerStatusReadyToPlay
时调用seekToTime
方法
全屏播放
- 手机应用的话需要旋转屏幕来实现,但是我项目是Pad的,使用旋转屏幕不能实现,需要在需要全屏时将播放器添加到
keyWindow
上,这样就可以在横屏状态下实现小屏变全屏的功能