视频播放

2016-08-05  本文已影响29人  青春flame

视频播放

方法一

  // 创建一个属性
 -  @property(nonatomic,strong) AVPlayerViewController *playerViewController;
 
 //播放器的对象
 - @property(nonatomic,strong) AVPlayer *player;
//媒体资源管理对象,
 - @property(nonatomic,strong) AVPlayerItem *playerItem;

}

-(AVPlayerItem *) playerItem{

if(_playerItem){
    return _playerItem;
}
//1.url对象
NSURL *url=[NSURL URLWithString:@"http://static.tripbe.com/videofiles/20121214/9533522808.f4v.mp4"];
//2.生成AVPlayerItem对象
_playerItem=[[AVPlayerItem alloc] initWithURL:url];
//3.注册监听
[self addObserverForPlayer];
return _playerItem;

}

//kvo的方式注册监听

-(void) addObserverForPlayer{

//监听播放的状态
[self.playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
//监听当前视频缓冲的进度
[self.playerItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];
//添加通知中心以监听当播放结束的时候 调用的方法
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playFinished:) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];

}

-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{

AVPlayerItem *item=(AVPlayerItem *)object;
if ([keyPath isEqualToString:@"status"]) {
    if(item.status==AVPlayerStatusReadyToPlay){
        //初始化slider值
    CMTime time=item.duration;
    CGFloat seconds=time.value/time.timescale;
        self.proSlider.maximumValue=seconds;
    }else if(item.status==AVPlayerStatusFailed){
        NSLog(@"播放视频失败");
    }
}else if([keyPath isEqualToString:@"loadedTimeRanges"]){
    //处理当前缓存的进度
    NSArray *timeArr=change[@"new"];
    //获取当前缓存的进度
    CMTimeRange range=[timeArr.firstObject CMTimeRangeValue];
    float start=CMTimeGetSeconds(range.start);
    float end=CMTimeGetSeconds(range.duration);
    NSLog(@"%f %f",start,end);
    //计算缓存的比例
    float totalBuffer=start+end;
    float value=totalBuffer/CMTimeGetSeconds(item.duration);
    self.progressView.progress=value;
    
}

}

-(void) playFinished:(NSNotification *) notification{

NSLog(@"播放结束");
_progressView.progress=0;
_proSlider.value=0;

}

//移除监听
-(void)dealloc{

[self.playerItem removeObserver:self forKeyPath:@"status"];

[self.playerItem removeObserver:self forKeyPath:@"loadedTimeRanges"];

}

-(IBAction)PlayerBtn:(id)sender{

UIButton *btn=(UIButton *)sender;
if (!_isPlaying) {
    //播放
    BOOL isOpen=false;
    for (CALayer *layer in _playView.layer.sublayers) {
        //判断图层是否是播放器的图层
        if ([layer isKindOfClass:[AVPlayerLayer class]]) {
            isOpen=YES;
        }
    }
    if (!isOpen) {
        //不存在此图层
        [self addSubLayer];
    }
    [btn setTitle:@"暂停" forState:UIControlStateNormal];
    [self.player play];
}else{
    //暂停
    [btn setTitle:@"播放" forState:UIControlStateNormal];
    [self.player pause];
}
_isPlaying=!_isPlaying;

}

//添加播放视图的图层
-(void) addSubLayer{

//1.初始化PalyerLayer的对象
AVPlayerLayer *playerlayer=[AVPlayerLayer playerLayerWithPlayer:self.player];
//1.1设置frame
playerlayer.frame=_playView.layer.bounds;
//1.2 内容填充的模式
playerlayer.videoGravity=AVLayerVideoGravityResize;
//2.添加到图层上
[_playView.layer addSublayer:playerlayer];

}

-(IBAction)sliderValue:(UISlider *)sender{

[self.playerItem seekToTime:CMTimeMake(sender.value, 1) completionHandler:^(BOOL finished){
    NSLog(@"滑动结束");
    //播放
    [self.player play];
    _isPlaying=YES;
}];

}

   


##方法二

- 此方法不推荐使用,将要废弃
- 苹果自带的框架: <MediaPlayer/MediaPlayer.h>

```
// 只创建控制器
- @property (nonatomic,strong) MPMoviePlayerController *mpController;
// 创建的是视图控制器
- @property (nonatomic,strong) MPMoviePlayerViewController *movieVC;

```
例子:

```    
// 1.创建url
 NSURL *url = [NSURL URLWithString:@"http://static.tripbe.com/videofiles/20121214/9533522808.f4v.mp4"];
// 2.初始化
 _mpController = [[MPMoviePlayerController alloc] initWithContentURL:url];
// 3.设置播放器样式
 _mpController.controlStyle = MPMovieControlStyleEmbedded;  // 4 设置frame
 _mpController.view.frame = CGRectMake(0,160,self.view.frame.size.width, 400);         // 5.添加到view上
 [self.view addSubview:_mpController.view];
// 6.开始播放
 [_mpController play];
 
####或者--另外打开一个控制器全屏播放
// 1.创建url
 NSURL *url = [NSURL URLWithString:@"http://static.tripbe.com/videofiles/20121214/9533522808.f4v.mp4"];
// 2.创建控制器
 MPMoviePlayerViewController *playerVC = [[MPMoviePlayerViewController alloc] initWithContentURL:url];
// 3.播放- 另外打开一个控制器全屏播放
 [self presentViewController:playerVC animated:YES completion:^{
     NSLog(@"开始播放");
 }];

```
上一篇 下一篇

猜你喜欢

热点阅读