AVPlayer
AVPlayer
-
初始化
AVPlayer
+ (instancetype)playerWithURL:(NSURL *)URL; + (instancetype)playerWithPlayerItem:(AVPlayerItem *)item; - (instancetype)initWithURL:(NSURL *)URL; - (instancetype)initWithPlayerItem:(AVPlayerItem *)item;
-
媒体资源管理对象
AVPlayerItem
,每个AVPlayerItem对应一个视频资源NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.161/%i.mp4",videoIndex]; urlStr =[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url=[NSURL URLWithString:urlStr]; AVPlayerItem *playerItem=[AVPlayerItem playerItemWithURL:url];
-
使用
AVPlayerLayer
展示AVPlayer:控制AVPlayerLayer来完成全屏等操作AVPlayerLayer *playerLayer=[AVPlayerLayer playerLayerWithPlayer:self.player]; playerLayer.frame=self.container.frame; //playerLayer.videoGravity=AVLayerVideoGravityResizeAspect;//视频填充模式 [self.container.layer addSublayer:playerLayer];
-
播放暂停方法
- (void)play; - (void)pause;
-
通过属性
rate
了解播放状态如果rate为0说明是停止状态,1为正常状态 ; 设置rate为0.0等同于pause方法,改为1.0等同于pause方法
-
通过属性
status
了解播放状态AVPlayerStatusUnknown, AVPlayerStatusReadyToPlay, AVPlayerStatusFailed
-
获得播放进度方法
addPeriodicTimeObserverForInterval
[self.player addPeriodicTimeObserverForInterval:CMTimeMake(1.0, 1.0) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) { float current=CMTimeGetSeconds(time); float total=CMTimeGetSeconds([playerItem duration]); NSLog(@"当前已经播放%.2fs.",current); NSLog(@" 播放进度%.2fs.",current/total);
-
切换视频方法
replaceCurrentItemWithPlayerItem
还可以使用AVQueuePlayer处理播放列表切换
AVPlayerItem
-
为AVPlayerItem添加视频播放完成通知
AVPlayerItemDidPlayToEndTimeNotification
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:) name:AVPlayerItemDidPlayToEndTimeNotification object:self.player.currentItem];
-
通过KVO监控
AVPlayerItem的status
、loadedTimeRanges
属性来获得 视频加载情况、缓冲情况、播放情况-(void)addObserverToPlayerItem:(AVPlayerItem *)playerItem{ //监控状态属性,注意AVPlayer也有一个status属性,通过监控它的status也可以获得播放状态 [playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil]; //监控网络加载情况属性 [playerItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil]; } -(void)removeObserverFromPlayerItem:(AVPlayerItem *)playerItem{ [playerItem removeObserver:self forKeyPath:@"status"]; [playerItem removeObserver:self forKeyPath:@"loadedTimeRanges"]; } -(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.firstObject CMTimeRangeValue];//本次缓冲时间范围 float startSeconds = CMTimeGetSeconds(timeRange.start); float durationSeconds = CMTimeGetSeconds(timeRange.duration); NSTimeInterval totalBuffer = startSeconds + durationSeconds;//缓冲总长度 NSLog(@"共缓冲:%.2f",totalBuffer); } }
AVQueuePlayer
是AVPlayer的子类,有一个items属性