iOS視訊播放(二)

weixin_34007291發表於2016-09-24

這篇文章介紹一下基於AVPlayer的視訊播放器。

先上Demo,點選我的GitHub下載Demo。

AVPlayer介紹

AVPlayer最大的優勢是能夠定製播放器的介面樣式。AVPlayer本身是不能播放視訊的,要播放視訊,必須建立一個AVPlayerLayer,將AVPlayerLayer新增到控制器檢視才能播放。除了AVPlayer和AVPlayerLayer,還需要一個類AVPlayerItem。AVPlayerItem是媒體資源管理物件,管理視訊的一些基本資訊和狀態,一個AVPlayerItem對應著一個視訊資源。

建立好AVPlayer、AVPlayerLayer、AVPlayerItem物件之後就能開始播放視訊。下面一一介紹播放暫停、播放時間、緩衝進度等功能。

2403384-d4f463312e1d8277.png
ToolBar.png
1、播放/暫停

使用視訊URL初始化一個AVPlayerItem,把AVPlayerItem設定為AVPlayer的currentItem,然後通過KVO監聽AVPlayerItem的屬性[playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil],當屬性變為AVPlayerStatusReadyToPlay時,通過AVPlayer呼叫- (void)play方法即可播放視訊。

AVPlayer的- (void)play- (void)pause分別控制播放和暫停,根據AVPlayer的播放速度rate可以判斷當前是否為播放狀態,rate=0暫停,rate=1播放。視訊播放完成後AVPlayerItem會傳送AVPlayerItemDidPlayToEndTimeNotification通知。

2、視訊時間

視訊時間包含兩部分:視訊總時間和視訊當前播放時間。視訊總時間通過CMTimeGetSeconds(_player.currentItem.duration)獲取,當前播放時間通過CMTimeGetSeconds(_player.currentTime)獲取。

獲取到這兩個時間,就可以展示視訊播放進度。播放進度需要一秒更新一次,可以用定時器來更新,也可以用AVPlayer的方法- (id)addPeriodicTimeObserverForInterval:(CMTime)interval queue:(nullable dispatch_queue_t)queue usingBlock:(void (^)(CMTime time))block在Block裡更新。建議使用這個方法更新時間,因為它更新時間更加準確,使用block的引數time獲得準確的播放進度。

獲取播放進度之後,分別給顯示時間的Label和UISlider賦值,使用者可以拖動UISlider對視訊進行拖動播放,在拖拽結束之後,使用- (void)seekToTime:(CMTime)time toleranceBefore:(CMTime)toleranceBefore toleranceAfter:(CMTime)toleranceAfter讓視訊從拖拽到的地方開始播放。

3、緩衝進度

通過KVO監聽AVPlayerItem的loadedTimeRanges屬性來監聽緩衝進度更新,在KVO中新增下面程式碼獲取當前緩衝進度。

NSArray *array = _player.currentItem.loadedTimeRanges;
CMTimeRange timeRange = [array.firstObject CMTimeRangeValue];//本次緩衝時間範圍
NSTimeInterval startSeconds = CMTimeGetSeconds(timeRange.start);//本次緩衝起始時間
NSTimeInterval durationSeconds = CMTimeGetSeconds(timeRange.duration);//緩衝時間
NSTimeInterval totalBuffer = startSeconds + durationSeconds;//緩衝總長度
float totalTime = CMTimeGetSeconds(_player.currentItem.duration);//視訊總長度
float progress = totalBuffer/totalTime;//緩衝進度
4、視訊切換

每個AVPlayer只能播放一個視訊,切換視訊可以用- (void)replaceCurrentItemWithPlayerItem:(AVPlayerItem *)item來實現。

2403384-9a2338ad00239153.png
視訊切換.png

播放器程式碼已經上傳了我的GitHub,歡迎下載,這裡就不貼程式碼了。

** 全屏播放效果:**

2403384-9cd96afd73086ab1.png
全屏播放.png

相關文章