IOS开发入门之AVPlayer的精彩使用---)网易新闻视频播放界面的另类实现
白羽 2018-11-26 来源 :网络 阅读 586 评论 0

摘要:本文将带你了解IOS开发入门AVPlayer的精彩使用---)网易新闻视频播放界面的另类实现,希望本文对大家学IOS有所帮助。

    本文将带你了解IOS开发入门AVPlayer的精彩使用---)网易新闻视频播放界面的另类实现,希望本文对大家学IOS有所帮助。



        

遇到个需求需要涉及到视频播放,那么没办法,先找资料开始进一步了解下这个不熟悉的东西.一个是MP,一个是AV,MP是封装好的,用起来非常简单,但是自定义样式就基本不可能了。AVPlayer存在于AVFundation中,更接近于底层,所以灵活性更强大,废话不多说,咱们先简单写个Demo看下他的工作原理,然后模仿网易新闻写个界面出来,这里用到了一个封装的框架,如果不熟悉内部原理的同学可以先看看我写的第一个Demo,基本所有逻辑都有。

 

这里容我啰嗦一句:

开发中,单纯的使用AVPlayer类是无法播放视频的,需要将视频层添加到AVPLayerLayer层,这样视频才能显示出来,Layer的定义方式有两种,一种是下面这种直接使用PlayerLayer,还有一个就是自己做一个View,然后把他自身的Layer改成playerLayer

第一种方式:

 


   

self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];

self.playerLayer.videoGravity     = AVLayerVideoGravityResizeAspect;

self.playerLayer.frame = self.view.bounds;

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

   

 

 

第二种方式:


   

//修改当前view的 layer的 class

+(Class)layerClass

{

    //AVPlayerLayer

    return [AVPlayerLayer class];

}

   


不BB了,直接看图说话,先看看最终的效果图 

 

 

 

只能上传2M的东东,这视频一帧一帧消耗太快了,都不敢多录了,各位大爷将就着看吧。。。。。。

不要来打我,不然我让我表哥打死你

 

先简单介绍下AVPlayer的用法

很多朋友应该和我一样,一开始接触视频的时候都不知道用什么东东来写,如果是大神

就直接下载Demo吧。小白来介绍下,我也第一次用

第一:初始化播放器

 


   

// 初始化播放器item

    self.playerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:@"https://flv2.bn.netease.com/videolib3/1608/30/zPuaL7429/SD/zPuaL7429-mobile.mp4"]];

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

    // 初始化播放器的Layer

    self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];

    // layer的frame

    self.playerLayer.frame = self.backView.bounds;

    // layer的填充属性 和UIImageView的填充属性类似

    // AVLayerVideoGravityResizeAspect 等比例拉伸,会留白

    // AVLayerVideoGravityResizeAspectFill // 等比例拉伸,会裁剪

    // AVLayerVideoGravityResize // 保持原有大小拉伸

    self.playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;

    // 把Layer加到底部View上

    [self.backView.layer insertSublayer:self.playerLayer atIndex:0];

   


 第二 :给播放器加监听以及屏幕旋转的通知

 

 


   

// 监听播放器状态变化

    [self.playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];

    // 监听缓存进去,就是大家所看到的一开始进去底部灰色的View会迅速加载

    [self.playerItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];

     

     

    //旋转屏幕通知

    [[NSNotificationCenter defaultCenter] addObserver:self

                                             selector:@selector(onDeviceOrientationChange)

                                                 name:UIDeviceOrientationDidChangeNotification

                                               object:nil

     ];

   


第三步:实现KVO的监听方法

 

 


   

// 监听播放器的变化属性

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<nsstring id=""> *)change context:(void *)context

{

    if ([keyPath isEqualToString:@"status"])

    {

         AVPlayerItemStatus statues = [change[NSKeyValueChangeNewKey] integerValue];

        switch (statues) {

                // 监听到这个属性的时候,理论上视频就可以进行播放了

            case AVPlayerItemStatusReadyToPlay:

                 

                // 最大值直接用sec,以前都是

                // CMTimeMake(帧数(slider.value * timeScale), 帧/sec)

                self.slider.maximumValue = CMTimeGetSeconds(self.playerItem.duration);

                [self initTimer];

                // 启动定时器 5秒自动隐藏

                if (!self.autoDismissTimer)

                {

                    self.autoDismissTimer = [NSTimer timerWithTimeInterval:8.0 target:self selector:@selector(autoDismissView:) userInfo:nil repeats:YES];

                    [[NSRunLoop currentRunLoop] addTimer:self.autoDismissTimer forMode:NSDefaultRunLoopMode];

                }

                break;

                 

            case AVPlayerItemStatusUnknown:

                 

                 

                 

                break;

                // 这个就是不能播放喽,加载失败了

            case AVPlayerItemStatusFailed:

                 

                // 这时可以通过`self.player.error.description`属性来找出具体的原因

                 

                break;

                 

            default:

                break;

        }

    }

    else if ([keyPath isEqualToString:@"loadedTimeRanges"]) // 监听缓存进度的属性

    {

        // 计算缓存进度

        NSTimeInterval timeInterval = [self availableDuration];

        // 获取总长度

        CMTime duration = self.playerItem.duration;

         

        CGFloat durationTime = CMTimeGetSeconds(duration);

        // 监听到了给进度条赋值

        [self.progressView setProgress:timeInterval / durationTime animated:NO];

    }

}</nsstring>

   

 

 

AVPlayerItemStatusReadyToPlay

 

AVPlayerItemStatusFailed

这两个属性还比较好理解,是个人都知道,但是这个是什么鬼

 

AVPlayerItemStatusUnknown

内部是这么解释的

 

Indicates that the status of the player item is not yet known because it has not tried to load new media resources

for playback.

fk u 我英语不好,看不懂啊,估计是playerItem这个视频资源对象挂了,识别不了,暂时不知道怎么处理



第四步:调用Play er的方法观察时间变化 更新播放进度

来个官方的说话,显得我比较牛B

 

 


   

// 调用plaer的对象进行UI更新

- (void)initTimer

{

    // player的定时器

    __weak typeof(self)weakSelf = self;

    // 每秒更新一次UI Slider

    [self.player addPeriodicTimeObserverForInterval:CMTimeMake(1, 1) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {

         

        // 当前时间

        CGFloat nowTime = CMTimeGetSeconds(weakSelf.playerItem.currentTime);

        // 总时间

        CGFloat duration = CMTimeGetSeconds(weakSelf.playerItem.duration);

        // sec 转换成时间点

        weakSelf.nowLabel.text = [weakSelf convertToTime:nowTime];

        weakSelf.remainLabel.text = [weakSelf convertToTime:(duration - nowTime)];

         

        // 不是拖拽中的话更新UI

        if (!weakSelf.isDragSlider)

        {

            weakSelf.slider.value = CMTimeGetSeconds(weakSelf.playerItem.currentTime);

        }

         

    }];

}

   


   

// sec 转换成指定的格式

- (NSString *)convertToTime:(CGFloat)time

{

    // 初始化格式对象

    NSDateFormatter *fotmmatter = [[NS    

   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程