2015-10-8--avplayer

第一次看到簡(jiǎn)書(shū)蚕捉,感覺(jué)就喜歡上了它薪前,想我這么懶的人,看到簡(jiǎn)書(shū)后关斜,第一次有了寫點(diǎn)什么東西的欲望示括。工作也有一段時(shí)間了,有時(shí)候很想把工作上學(xué)到的東西或者一些感悟?qū)懴聛?lái)痢畜,但總是由于種種原因沒(méi)有動(dòng)手垛膝。以后工作的時(shí)間鳍侣,每天抽半個(gè)小時(shí)時(shí)間,寫技術(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í)間顯示小技巧

這樣寫主籍,不管時(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)系作者
  • 序言:七十年代末物独,一起剝皮案震驚了整個(gè)濱河市袜硫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挡篓,老刑警劉巖婉陷,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異官研,居然都是意外死亡秽澳,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門戏羽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)担神,“玉大人,你說(shuō)我怎么就攤上這事始花⊥叮” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵酷宵,是天一觀的道長(zhǎng)亥贸。 經(jīng)常有香客問(wèn)我,道長(zhǎng)浇垦,這世上最難降的妖魔是什么砌函? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上讹俊,老公的妹妹穿的比我還像新娘。我一直安慰自己煌抒,他們只是感情好仍劈,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著寡壮,像睡著了一般贩疙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上况既,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天这溅,我揣著相機(jī)與錄音,去河邊找鬼棒仍。 笑死悲靴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的莫其。 我是一名探鬼主播癞尚,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼乱陡!你這毒婦竟也來(lái)了浇揩?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤憨颠,失蹤者是張志新(化名)和其女友劉穎胳徽,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體爽彤,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡养盗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年审葬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了亮隙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梯捕,死狀恐怖匙瘪,靈堂內(nèi)的尸體忽然破棺而出铆铆,到底是詐尸還是另有隱情,我是刑警寧澤丹喻,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布薄货,位于F島的核電站,受9級(jí)特大地震影響碍论,放射性物質(zhì)發(fā)生泄漏谅猾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望税娜。 院中可真熱鬧坐搔,春花似錦、人聲如沸敬矩。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)弧岳。三九已至凳忙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間禽炬,已是汗流浹背涧卵。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腹尖,地道東北人柳恐。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像桐臊,于是被迫代替她去往敵國(guó)和親胎撤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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