文章規(guī)劃
iOS 音視頻開發(fā)(二)AVAudioRecorder實現(xiàn)錄音功能
iOS 音視頻開發(fā)(三)MediaPlayer播放本地、遠程音頻
iOS 音視頻開發(fā)(四)MediaPlayer播放本地、遠程視頻
iOS 音視頻開發(fā)(五)AVAudioPlayer/AVPlayer播放本地、遠程音頻
iOS 音視頻開發(fā)(六)AVPlayer播放本地、遠程視頻(本篇)
AVPlayer 屬于 AVFoundation 框架,使用時需要先導(dǎo)入<AVFoundation/AVFoundation.h>框架頭文件。
AVPlayer 使用
在開發(fā)中,單純使用AVPlayer類是無法顯示視頻的,要將視頻層添加至AVPlayerLayer中,這樣才能將視頻顯示出來。
1、先將在線視頻鏈接存放在NSURL中,然后初始化AVPlayerItem對象,AVPlayerItem是管理資源的對象。
2、然后監(jiān)聽AVPlayerItem的 status 和 loadedTimeRange 屬性,status 屬性有三種狀態(tài):
typedef NS_ENUM(NSInteger, AVPlayerItemStatus) {
? ?AVPlayerItemStatusUnknown,
? ?AVPlayerItemStatusReadyToPlay,
? ?AVPlayerItemStatusFailed
};
1.當(dāng) AVPlayerItem 的 status 等于AVPlayerStatusReadyToPlay時代表視頻已經(jīng)可以播放了,我們就可以調(diào)用play方法播放了。
2.loadedTimeRange 屬性代表已經(jīng)緩沖的進度,監(jiān)聽此屬性可以在UI中更新緩沖進度。
3、addPeriodicTimeObserverForInterval
給AVPlayer 添加time Observer 有利于我們?nèi)z測播放進度。
4、使用 AVPlayer 對象的 seekToTime 方法 可以控制視頻播放進度。
下面是具體的代碼(Demo地址),先給大家截圖,看一下完整的效果:

第一步:初始化 播放器對象 以及 播放器層。
- (void)initPlayer{
/ /創(chuàng)建播放器層
AVPlayerLayer*playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
playerLayer.frame = self.view.bounds;
[self.view.layer addSublayer:playerLayer];
}
//初始化播放器
-(AVPlayer*)player{
if(!_player) {
NSURL*url = [NSURL URLWithString:@"http://images.apple.com/media/cn/apple-events/2016/5102cb6c_73fd_4209_960a_6201fdb29e6e/keynote/apple-event-keynote-tft-cn-20160908_1536x640h.mp4"];
AVPlayerItem*playerItem=[AVPlayerItem playerItemWithURL:url];
_player= [AVPlayer playerWithPlayerItem:playerItem];
// 通過 KVO 監(jiān)聽AVPlayerItem的status和loadedTimeRange屬性
[self addObserverToPlayerItem:playerItem];
// 給播放器添加進度更新 addPeriodicTimeObserverForInterval
[self addProgressObserver];
//給AVPlayerItem添加播放完成通知
[self addNotification];
}
return_player;
}
第二步:通過 KVO 監(jiān)聽AVPlayerItem的status和loadedTimeRange屬性
-(void)addObserverToPlayerItem:(AVPlayerItem*)playerItem {
//監(jiān)控狀態(tài)屬性,注意AVPlayer也有一個status屬性,通過監(jiān)控它的status也可以獲得播放狀態(tài)
[playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
//監(jiān)控網(wǎng)絡(luò)加載情況屬性
[playerItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];
}
-(void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context {
AVPlayerItem*playerItem=object;
if([keyPath isEqualToString:@"status"]) {
AVPlayerStatus status= [[change objectForKey:@"new"]intValue];
if(status==AVPlayerStatusReadyToPlay){
NSLog(@"正在播放...,視頻總長度:%.2f",CMTimeGetSeconds(playerItem.duration));
}
} else if ([keyPath isEqualToString:@"loadedTimeRanges"]){
NSArray*array=playerItem.loadedTimeRanges;
CMTimeRange timeRange = [array.firstObjectCMTimeRangeValue];//本次緩沖時間范圍
float startSeconds =CMTimeGetSeconds(timeRange.start);
float durationSeconds =CMTimeGetSeconds(timeRange.duration);
NSTimeIntervaltotalBuffer = startSeconds + durationSeconds;//緩沖總長度
NSLog(@"共緩沖:%.2f",totalBuffer);
}
}
第三步:給播放器添加進度更新 addPeriodicTimeObserverForInterval
-(void)addProgressObserver{
AVPlayerItem*playerItem=self.player.currentItem;
UIProgressView*progress=self.progress;
//這里設(shè)置每秒執(zhí)行一次
[self.player addPeriodicTimeObserverForInterval:CMTimeMake(1.0,1.0)queue:dispatch_get_main_queue()usingBlock:^(CMTimetime) {
float current=CMTimeGetSeconds(time);
float total=CMTimeGetSeconds([playerItem duration]);
NSLog(@"當(dāng)前已經(jīng)播放%.2fs.",current);
];
}
第四步:給AVPlayerItem添加播放完成通知
- (void)addNotification {
[[NSNotificationCenter defaultCenter]addObserver:self
selector:@selector(playbackFinished:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:self.player.currentItem];
}
//播放完成通知
-(void)playbackFinished:(NSNotification*)notification{
? ?NSLog(@"視頻播放完成.");
}
第五步:播放、暫停視頻
[self.player play];//播放視頻
[self.player pause];//暫停視頻
以上五步就是播放視頻的基本步驟,如果上面的代碼讓你看的頭疼,你也可以去下載文中的代碼,根據(jù)Demo效果一步一步去看這些方法(Demo中的代碼更復(fù)雜一些)。
注意:如果你是將文中的代碼拷貝到你新建的工程,記得在 Info.plist 中添加

允許工程支持HTTP協(xié)議(因為文中演示視頻是HTTP協(xié)議視頻)