2015-10-8--avplayer

第一次看到簡(jiǎn)書(shū),感覺(jué)就喜歡上了它,想我這么懶的人,看到簡(jiǎn)書(shū)后,第一次有了寫(xiě)點(diǎn)什么東西的欲望。工作也有一段時(shí)間了,有時(shí)候很想把工作上學(xué)到的東西或者一些感悟?qū)懴聛?lái),但總是由于種種原因沒(méi)有動(dòng)手。以后工作的時(shí)間,每天抽半個(gè)小時(shí)時(shí)間,寫(xiě)技術(shù)博客,自認(rèn)為能力還遠(yuǎn)遠(yuǎn)不夠,記錄下每日點(diǎn)滴感悟,便是足夠了,希望能夠堅(jiān)持下去。

做視頻播放,邊下邊播,都做了一個(gè)多月了,前前后后3套方案,最后終于算是完美的解決了。今天關(guān)于avplayer又學(xué)到了一點(diǎn)新的知識(shí)。

1.一般情況下需要實(shí)現(xiàn)的4個(gè)監(jiān)聽(tīng)屬性

//預(yù)播放狀態(tài),有三種情況AVPlayerItemStatusUnknown,AVPlayerItemStatusReadyToPlay,AVPlayerItemStatusFailed

[self.videoPlayItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];

//緩沖進(jìn)度,可有可無(wú),可以增加用戶體驗(yàn)

[self.videoPlayItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];

//seekToTime后,緩沖數(shù)據(jù)為空,而且有效時(shí)間內(nèi)數(shù)據(jù)無(wú)法補(bǔ)充,播放失敗

[self.videoPlayItem addObserver:self forKeyPath:@"playbackBufferEmpty" options:NSKeyValueObservingOptionNew context:nil];

//seekToTime后,可以正常播放,相當(dāng)于readyToPlay,一般拖動(dòng)滑竿菊花轉(zhuǎn),到了這個(gè)這個(gè)狀態(tài)菊花隱藏

[self.videoPlayItem addObserver:self forKeyPath:@"playbackLikelyToKeepUp" options:NSKeyValueObservingOptionNew context:nil];

2. 一般情況下需要監(jiān)聽(tīng)的4個(gè)通知中心

[[NSNotificationCenter defaultCenter]addObserver:self

selector:@selector(moviePlayDidEnd:)

name:AVPlayerItemDidPlayToEndTimeNotification

object:_videoPlayItem];? // 添加視頻播放結(jié)束通知

[[NSNotificationCenter defaultCenter]addObserver:self

selector:@selector(moviePlayInterrupt:)

name:AVPlayerItemPlaybackStalledNotification

object:_videoPlayItem];? //添加視頻異常中斷通知

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(enterBcakground:)

name:UIApplicationWillResignActiveNotification

object:nil]; //進(jìn)入后臺(tái)

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(enterPlayGround:)

name:UIApplicationDidBecomeActiveNotification

object:nil]; // 返回前臺(tái)

3. rate屬性

avplayer自身有一個(gè)rate屬性

rate ==1.0,表示正在播放;rate == 0.0,暫停;rate == -1.0,播放失敗

為了嚴(yán)謹(jǐn),可以這樣判斷播放器狀態(tài)

if (avplayer.rate > 0 && avplayer.error == nil) {

//playing

} else {

//failed

}

4. slider

為了更好地用戶體驗(yàn),一般在滑竿滑動(dòng)過(guò)程中,停止播放時(shí)間的走動(dòng),當(dāng)前時(shí)間的顯示隨滑竿移動(dòng)而改變,當(dāng)手指離開(kāi)滑竿后,播放器從當(dāng)前點(diǎn)開(kāi)始播放,在從當(dāng)前點(diǎn)開(kāi)始播放的時(shí)候,有可能沒(méi)有緩沖數(shù)據(jù),需要臨時(shí)加載,這時(shí)候就需要掏用到上面的方法來(lái)判斷當(dāng)前狀態(tài),加載數(shù)據(jù)還沒(méi)有播放的時(shí)候,時(shí)間走動(dòng)需要停止,當(dāng)開(kāi)始播放了,才開(kāi)始時(shí)間走動(dòng)。

[_playSlider addTarget:self action:@selector(playSliderChange:) forControlEvents:UIControlEventValueChanged]; //拖動(dòng)滑竿更新時(shí)間

[_playSlider addTarget:self action:@selector(playSliderChangeEnd:) forControlEvents:UIControlEventTouchUpInside];? //松手,滑塊拖動(dòng)停止

//在松手的時(shí)候,也有可能會(huì)走下面其中某一個(gè)時(shí)間,為了嚴(yán)謹(jǐn),建議加上這些事件,當(dāng)然,松手的時(shí)候,只可能走這3個(gè)事件中的某一個(gè)

[_playSlider addTarget:self action:@selector(playSliderChangeOutEnd:) forControlEvents:UIControlEventTouchUpOutside];

[_playSlider addTarget:self action:@selector(playSliderChangeCancel:) forControlEvents:UIControlEventTouchCancel];

5.視頻播放時(shí)間顯示小技巧

這樣寫(xiě),不管時(shí)間有多長(zhǎng),都可以按照 ?小時(shí):分鐘:秒數(shù) 的形式來(lái)顯示,簡(jiǎn)單吧!

NSString *str = nil;

if (videocurrent < 3600) {

str =? [NSString stringWithFormat:@"%02li:%02li",lround(floor(videocurrent/60.f)),lround(floor(videocurrent/1.f))%60];

} else {

str =? [NSString stringWithFormat:@"%02li:%02li:%02li",lround(floor(videocurrent/3600.f)),lround(floor(videocurrent%3600)/60.f),lround(floor(videocurrent/1.f))%60];

}

6.附上比較重要的一段代碼,監(jiān)聽(tīng)事件

//kvo監(jiān)聽(tīng)播放狀態(tài)

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{

AVPlayerItem *playerItem = (AVPlayerItem *)object;

if ([keyPath isEqualToString:@"status"]) {

if ([playerItem status] == AVPlayerStatusReadyToPlay) {

CGFloat totalSecond = playerItem.duration.value / playerItem.duration.timescale;// 轉(zhuǎn)換成秒

[self updateTotolTime:totalSecond];

[self setPlaySliderValue:totalSecond];

_videoLength = totalSecond;

[self monitoringPlayback:_videoPlayItem];// 監(jiān)聽(tīng)播放狀態(tài)

NSLog(@"readytoPlayreadytoPlayreadytoPlayreadytoPlay");

if ([self.delegate respondsToSelector:@selector(TBAVplayerReadyToPlay:)]) {

[self.delegate TBAVplayerReadyToPlay:self];

}

[_showView.layer addSublayer:self.videoPlayerLayer];

} else if ([playerItem status] == AVPlayerStatusFailed || [playerItem status] == AVPlayerStatusUnknown) {

if ([self.delegate respondsToSelector:@selector(TBAVPlayerPlayReadyFailed:)]) {

[self.delegate TBAVPlayerPlayReadyFailed:self];

}

}

} else if ([keyPath isEqualToString:@"loadedTimeRanges"]) {

if (_isFinishLoading || _localVideo) {

[self.videoProgressView setProgress:1 animated:NO];? ? //如果視頻下載完成,把緩沖進(jìn)度置為滿格

} else {

NSTimeInterval timeInterval = [self availableDuration];// 計(jì)算緩沖進(jìn)度

CMTime duration = self.videoPlayItem.duration;

CGFloat totalDuration = CMTimeGetSeconds(duration);

[self.videoProgressView setProgress:timeInterval / totalDuration animated:YES];

}

} else if (object == playerItem && [keyPath isEqualToString:@"playbackBufferEmpty"]) {

if (playerItem.playbackBufferEmpty) {

//Your code here

[_videoPlayerLayer.player pause];

[_hudHelper showHudOnView:_showView caption:nil image:nil acitivity:YES autoHideTime:0];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

[_videoPlayerLayer.player play];

//rate 是avplayer 是一個(gè)屬性,rate 1.0表示正在播放,0.0暫停, -1播放器失效

if (self.rate <= 0) {

[[iToast makeText:@"播放異常"] show];

}

});

}

} else if (object == playerItem && [keyPath isEqualToString:@"playbackLikelyToKeepUp"])

{

if (playerItem.playbackLikelyToKeepUp)

{

_playState = YES;

//Your code here拖動(dòng)之后開(kāi)始播放

[_hudHelper hideHud];

}

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評(píng)論 6 546
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,814評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,980評(píng)論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 64,064評(píng)論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,779評(píng)論 6 414
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 56,109評(píng)論 1 330
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評(píng)論 3 450
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 43,287評(píng)論 0 291
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,799評(píng)論 1 338
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,515評(píng)論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,750評(píng)論 1 375
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,933評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,327評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,667評(píng)論 1 296
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,492評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,703評(píng)論 2 380

推薦閱讀更多精彩內(nèi)容