iOS 音視頻開發(fā)(六)AVPlayer播放本地、遠程視頻

文章規(guī)劃

iOS 音視頻開發(fā)(一)常用音視頻框架介紹

iOS 音視頻開發(fā)(二)AVAudioRecorder實現(xiàn)錄音功能

iOS 音視頻開發(fā)(三)MediaPlayer播放本地、遠程音頻

iOS 音視頻開發(fā)(四)MediaPlayer播放本地、遠程視頻

iOS 音視頻開發(fā)(五)AVAudioPlayer/AVPlayer播放本地、遠程音頻

iOS 音視頻開發(fā)(六)AVPlayer播放本地、遠程視頻(本篇)

iOS 音視頻開發(fā)(七)AudioToolbox音效播放

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 中添加

Info.plist截圖

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

上一篇:iOS 音視頻開發(fā)(五)AVPlayer播放本地、遠程音頻

下一篇:iOS 音視頻開發(fā)(七)AudioToolbox音效播放

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容