本文可以解決緩沖和播放會暫停的問題
在iOS開發(fā)中吭从,播放視頻通常有兩種方式鸿市,一種是使用MPMoviePlayerController(需要導(dǎo)入MediaPlayer.Framework)倒得,還有一種是使用AVPlayer。關(guān)于這兩個類的區(qū)別可以參考http://stackoverflow.com/questions/8146942/avplayer-and-mpmovieplayercontroller-differences姜骡,)
簡而言之就是MPMoviePlayerController使用更簡單弃理,功能不如AVPlayer強(qiáng)大,而AVPlayer使用稍微麻煩點(diǎn)滔金,不過功能更加強(qiáng)大色解。這篇博客主要介紹下AVPlayer的基本使用,由于 我也是剛剛接觸餐茵,所以有問題大家直接指出~
監(jiān)聽playerItem的status和loadedTimeRange屬性科阎,status有三種狀態(tài):
AVPlayerStatusUnknown,
AVPlayerStatusReadyToPlay,
AVPlayerStatusFailed
當(dāng)status等于AVPlayerStatusReadyToPlay時代表視頻已經(jīng)可以播放了,我們就可以調(diào)用play方法播放了忿族。
loadedTimeRange屬性代表已經(jīng)緩沖的進(jìn)度锣笨,監(jiān)聽此屬性可以在UI中更新緩沖進(jìn)度,也是很有用的一個屬性道批。
最后添加一個通知错英,用于監(jiān)聽視頻是否已經(jīng)播放完畢,然后實(shí)現(xiàn)KVO的方法:
- (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) {
NSLog(@"AVPlayerStatusReadyToPlay");
self.stateButton.enabled = YES;
CMTime duration = self.playerItem.duration;// 獲取視頻總長度
CGFloat totalSecond = playerItem.duration.value / playerItem.duration.timescale;// 轉(zhuǎn)換成秒
_totalTime = [self convertTime:totalSecond];// 轉(zhuǎn)換成播放時間
[self customVideoSlider:duration];// [自定義]UISlider外觀
NSLog(@"movie totalduration:%f",CMTimeGetSeconds(duration));
[self monitoringPlayback:self.playerItem];// 監(jiān)聽播放狀態(tài)
} else if ([playerItem status] == AVPlayerStatusFailed) {
NSLog(@"AVPlayerStatusFailed");
}
} else if ([keyPath isEqualToString:@"loadedTimeRanges"]) {
NSTimeInterval timeInterval = [self availableDuration];// 計(jì)算緩沖進(jìn)度
NSLog(@"Time Interval:%f",timeInterval);
CMTime duration = self.playerItem.duration;
CGFloat totalDuration = CMTimeGetSeconds(duration);
[self.videoProgress setProgress:timeInterval / totalDuration animated:YES];
}}
- (NSTimeInterval)availableDuration {
NSArray *loadedTimeRanges = [[self.playerView.player currentItem] loadedTimeRanges];
CMTimeRange timeRange = [loadedTimeRanges.firstObject CMTimeRangeValue];// 獲取緩沖區(qū)域
float startSeconds = CMTimeGetSeconds(timeRange.start);
float durationSeconds = CMTimeGetSeconds(timeRange.duration);
NSTimeInterval result = startSeconds + durationSeconds;// 計(jì)算緩沖總進(jìn)度
return result;
}
- (NSString *)convertTime:(CGFloat)second{ NSDate *d = [NSDate dateWithTimeIntervalSince1970:second];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
if (second/3600 >= 1) { [formatter setDateFormat:@"HH:mm:ss"];
} else {
[formatter setDateFormat:@"mm:ss"];
}
NSString *showtimeNew = [formatter stringFromDate:d];
return showtimeNew;
}