美文网首页iOS iOS直播视频iOS-OC初级
使用AVPlayer自定义支持全屏的播放器(二)

使用AVPlayer自定义支持全屏的播放器(二)

作者: 季末微夏 | 来源:发表于2016-11-20 00:19 被阅读1211次

    前言

    前段时间封装了一个视频播放器,由于时间匆忙,还有很多问题以及细节还没有来得及修改,最近挤了一点时间,将播放器完善了一下,具体思路请参考使用AVPlayer自定义支持全屏的播放器(一),本篇文章主要讲解如何在tableView上面使用。

    思路

    播放器播放视频肯定会占用内存,如果每一个cell建立一个播放器,会占用不少的内存,所有全局只建立一个播放器,当播放器所在cell滑出屏幕,将播放器销毁。

    使用代码

    当点击cell时,创建播放器,并且添加到当前cell上。因为全局只有一个播放器,并且需要在滑动的时候动态计算当前播放器所在cell的位置,所以使用代理将被点击的cell传回所在控制器做相应的处理。不需要播放器的时候记得销毁播放器,用以释放内存。

    #pragma mark - 点击播放代理
    - (void)PlayVideoWithCell:(TableViewCell *)cell;
    {
        //记录被点击的cell
        _cell = cell;
        
        //销毁播放器
        [_playerView destroyPlayer];
        _playerView = nil;
        
        _playerView = [[CLPlayerView alloc] initWithFrame:CGRectMake(0, 0, cell.width, cell.height)];
        [cell.contentView addSubview:_playerView];
        
        //根据旋转自动支持全屏,默认支持
        //    playerView.autoFullScreen = NO;
        //重复播放,默认不播放
        //    playerView.repeatPlay     = YES;
        //如果播放器所在页面支持横屏,需要设置为Yes,不支持不需要设置(默认不支持)
        //    playerView.isLandscape    = YES;
        
        //视频地址
        _playerView.url = [NSURL URLWithString:cell.model.videoUrl];
        
        //播放
        [_playerView playVideo];
        
        //返回按钮点击事件回调
        [_playerView backButton:^(UIButton *button) {
            NSLog(@"返回按钮被点击");
        }];
        
        //播放完成回调
        [_playerView endPlay:^{
            
            //销毁播放器
            [_playerView destroyPlayer];
            _playerView = nil;
            NSLog(@"播放完成");
        }];
     
    }
    
    

    tableView滑动代理中,需要使用- (void)calculateScrollOffset:(UITableView *)tableView cell:(UITableViewCell *)cell方法,将tableView和播放器所在cell传递给播放器,播放器会在内部计算播放器所在位置,在超出的时候,会将播放器销毁。

    /**
     根据播放器所在位置计算偏移,添加在TableView上时使用
     
     @param tableView tableView
     @param cell 播放器所在cell
     */
    - (void)calculateScrollOffset:(UITableView *)tableView cell:(UITableViewCell *)cell;
    
    #pragma mark - 滑动代理
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
       //计算偏移来销毁播放器
        [_playerView calculateScrollOffset:self.tableView cell:_cell];
    }
    
    

    播放器效果图

    效果图1.gif 效果图2.gif 效果图3.gif

    Demo地址

    Demo地址---->CLPlayer 如果喜欢,欢迎star。

    相关文章

      网友评论

      • 叫我马小帅:哥 监听卡顿后,你知道怎么做一个加载的百分比吗
      • 我要有腹肌了:找了好多 这个最赞
      • 我要有腹肌了:十分感谢
      • 叫我马小帅:您好,我想问一下,您知道监听播放视频,视频卡顿时的方法吗
        季末微夏:@Mio_黄苗炜 刚刚在10.2.1真机测试了一下,没有发现界面闪屏。
        Mio_黄苗炜:我发现在10的系统下,播放十几秒的视频的时候,暂定播放,然后在点击home键进入后台,再回到前台,会发现界面闪屏了一下。
        季末微夏:@啦啦啦啦_mcy 没做那么深入
      • 季末微夏:@Helong videoGravity属性可以设置拉伸方式,设置AVLayerVideoGravityResizeAspect可以按照原比例不拉伸,缓存?内存?程序进入后台会暂停播放器,从后台返回需要设置播放,代码里边我只做了暂停,返回没有设置播放,具体你可以去看看最新的demo,最近修改了很多。
        Helong:@枫叶流转 好的,感谢。我再研究研究 :+1:
      • Helong:自己录制的视频,竖屏录制的,播放的时候画面是截断的。这应该怎么处理?还有缓存加载的时候会暂停(播放按钮还是暂停),完事不能继续播放,需要点击暂停再点击播放

      本文标题:使用AVPlayer自定义支持全屏的播放器(二)

      本文链接:https://www.haomeiwen.com/subject/hyvepttx.html