视频播放

视频播放

方法一

  • 最新的框架
    • 需要导入两个框架才能使用 <AVFoundation/AVFoundation.h>,
      <AVKit/AVKit.h>
  • 使用方法:
  // 创建一个属性
 -  @property(nonatomic,strong) AVPlayerViewController *playerViewController;
 
 //播放器的对象
 - @property(nonatomic,strong) AVPlayer *player;
//媒体资源管理对象,
 - @property(nonatomic,strong) AVPlayerItem *playerItem;
  • 两种播放样式 :

    • 样式一:再重开一个控制器,来实现全屏播放

      // 1,初始化视图控制器的对象
      

    self.playVC = [[AVPlayerViewController alloc] init];
    // 2、设置播放器的对象
    AVPlayer *player = [[AVPlayer alloc] initWithURL:[NSURL URLWithString:@""]];
    self.playVC.player = player;
    // 4、设置样式
    self.playVC.videoGravity = AVLayerVideoGravityResizeAspect;
    // 5. 播放
    [self.playVC.player play];
    [self presentViewController:self.playVC animated:YES completion:^{
    NSLog(@"开始播放");
    }];

    - 样式二 :在自身控制器上的view内直接播放
    
    

    //懒加载两个对象

    -(AVPlayer *) player{
    if (_player) {
    return _player;
    }

    //1.创建player对象

    _player=[[AVPlayer alloc] initWithPlayerItem:self.playerItem];

    //2.监听当前播放的时间

    __weak ViewController *vc=self;

    [_player addPeriodicTimeObserverForInterval:CMTimeMake(1, 1) queue:nil usingBlock:^(CMTime time){

     float seconds=CMTimeGetSeconds(time);
     
     NSLog(@"当前播放的时间%f",seconds);
     
     dispatch_async(dispatch_get_main_queue(), ^{
         [vc.proSlider setValue:seconds animated:YES];
     });
    

    }];

    return _player;

}

-(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(@"开始播放");
 }];

```
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容