AVPlayer

AVPlayer

一、定义必要的属性

//AVplayer
@property (strong, nonatomic)AVPlayer *player;//播放器
@property (strong, nonatomic)AVPlayerItem *playerItem;//播放单元
@property (strong, nonatomic)AVPlayerLayer *playerLayer;//播放界面(layer)

二、必要的配置

1.视频URL:

/ 本地视频
- (NSURL *)getLocalUrl{
    NSString *urlString = [[NSBundle mainBundle] pathForResource:@"xxx.mp4" ofType:nil];
    NSURL *url = [NSURL fileURLWithPath:urlString];
    return url;
}

// 网络视频
- (NSURL *)getNetworkUrl{
    NSString *urlString = @"http://xxx.xxx/xxx.mp4";
    NSURL *url = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    return url;
}

2.播放单元

NSURL *mediaURL = [self getLocalUrl]; //或getNetworkUrl
//AVPlayerItem
self.playerItem = [AVPlayerItem playerItemWithURL:mediaURL];

3.播放对象

//AVPlayer
self.player = [AVPlayer playerWithPlayerItem:self.playerItem];

4.播放器的Layer

//AVPlayerLayer
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 200, 200)];

self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
self.playerLayer.frame = view.bounds;  self.playerLayer.videoGravity=AVLayerVideoGravityResizeAspectFill;//视频填充模式   

[view.layer addSublayer:self.playerLayer];   
[self.view addSubview:view];

5.开始播放

[self.player play];

到此一个简单的视频播放器完成。

三、常规设置

1.播放/暂停

[self.player play];
[self.player pause];

2.指定位置播放

//指定位置播放
[self.player seekToTime:startTime completionHandler:^(BOOL finished) {
        if (finished) {
            //到达指定位置,可以播放
            [self.player play]; //注意使用weakself,此处仅为示例
        }else{
            //没有完成
        }
    }];

3.观察状态变化

//通过KVO来观察status属性的变化,来获得状态信息
[self.playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
//在observe方法中判断status
AVPlayerItemStatusUnknown,    //未知错误
AVPlayerItemStatusReadyToPlay,//已准备好
AVPlayerItemStatusFailed      //获取失败

四、其他操作

1.视频替换

NSURL *mediaURL = [self getNetworkUrl];
//AVPlayerItem
self.playerItem = [AVPlayerItem playerItemWithURL:mediaURL];
[self.player replaceCurrentItemWithPlayerItem:self.playerItem];

2.缓冲进度

NSArray *array = _player.currentItem.loadedTimeRanges;
CMTimeRange timeRange = [array.firstObject CMTimeRangeValue];//本次缓冲时间范围
NSTimeInterval startSeconds = CMTimeGetSeconds(timeRange.start);//本次缓冲起始时间
NSTimeInterval durationSeconds = CMTimeGetSeconds(timeRange.duration);//缓冲时间
NSTimeInterval totalBuffer = startSeconds + durationSeconds;//缓冲总长度
float totalTime = CMTimeGetSeconds(_player.currentItem.duration);//视频总长度
float progress = totalBuffer/totalTime;//缓冲进度

3.视频时间

CMTimeGetSeconds(_player.currentItem.duration)//视频总时间
CMTimeGetSeconds(_player.currentTime)//当前时间
//更新视频时间的方法
- (id)addPeriodicTimeObserverForInterval:(CMTime)interval queue:(nullable dispatch_queue_t)queue usingBlock:(void (^)(CMTime time))block

猜你喜欢

转载自blog.csdn.net/zramals/article/details/79220728