最近項目需求做個播放視頻功能,之前對這方面接觸的也不多,閱讀了一些開源播放器的源碼學(xué)習(xí)了一下,總結(jié)了一些使用方法
基本使用
- 使用AVPlayer一般會用到3種類,分別為
AVPlayer
,AVPlayerItem
,AVPlayerLayer
self.playerItem = [AVPlayerItem playerItemWithURL:videoURL];
self.player = [AVPlayer playerWithPlayerItem:_playerItem];
self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player];
以上代碼用來初始化播放器,然后調(diào)用[self.player play]
開始播放視頻,通過調(diào)用[self.player pause]
可以用來暫停視頻
-
AVPlayer
有個屬性rate
,當(dāng)為1時是正常播放狀態(tài),為0時是暫停狀態(tài),通過這個屬性可以用來判斷播放還是暫停 -
AVPlayerItem
有個videoGravity
屬性,常用的2個枚舉分別為AVLayerVideoGravityResizeAspectFill
和AVLayerVideoGravityResizeAspect
.前者是等比例填充并且會裁減掉部分區(qū)域,后者也是等比例填充但會留下黑邊.
調(diào)節(jié)音量
MPVolumeView *volumeView = [[MPVolumeView alloc] init];
_volumeViewSlider = nil;
for (UIView *view in [volumeView subviews]){
if ([view.class.description isEqualToString:@"MPVolumeSlider"]){
_volumeViewSlider = (UISlider *)view;
break;
}
}
以上代碼可以用來獲取音量,一般2種方式調(diào)節(jié)音量,一種是添加手勢調(diào)節(jié),一種是UISlider
去調(diào)節(jié),這兩種方法都是通過獲取滑動的值去改變音量的
獲取播放時間
-
AVPlayer
并沒有直接提供API來獲取播放時間,需要我們通過計算得到 -
AVPlayer
下有個CMTime
這個屬性,這個屬性由value
和timeScale
組成,前者除以后者就可以得出秒數(shù) - 通過
CMTimeGetSeconds([_player currentTime]) / 60
可以獲得當(dāng)前分鐘,CMTimeGetSeconds([_player currentTime]) % 60
可以獲得當(dāng)前秒數(shù) - 通過
playerItem.duration.value / _playerItem.duration.timescale / 60
可以獲得視頻總分鐘數(shù),通過playerItem.duration.value / _playerItem.duration.timescale % 60
可以獲得視頻總時間減分鐘的秒數(shù) - 通過以上幾種計算方式搭配定時器就可以設(shè)置視頻當(dāng)前播放時長和視頻總時長
Slider滑動結(jié)束視頻跳轉(zhuǎn)
- 通過
seekToTime
這個方法可以用來跳轉(zhuǎn)到視頻的某個時間點,傳入的值也是CMTime
類型的 - 通過以上方法我們也可以實現(xiàn)記錄上次播放的時間節(jié)點,在下次播放時跳轉(zhuǎn)到上次播放的地方,這里要注意的是必須要等到播放器準(zhǔn)備好以后才可以調(diào)用
seekToTime
這個方法,否則會崩潰.通過KVO來監(jiān)聽status
屬性,當(dāng)self.player.status == AVPlayerStatusReadyToPlay
時調(diào)用seekToTime
方法
全屏播放
- 手機應(yīng)用的話需要旋轉(zhuǎn)屏幕來實現(xiàn),但是我項目是Pad的,使用旋轉(zhuǎn)屏幕不能實現(xiàn),需要在需要全屏?xí)r將播放器添加到
keyWindow
上,這樣就可以在橫屏狀態(tài)下實現(xiàn)小屏變?nèi)恋墓δ?/li>