[iOS]5 分钟实现抖音 APP

作者: e2f2d779c022 | 来源:发表于2018-04-12 23:02 被阅读3035次

    大家好,我是 NewPan,这篇文章我们一起来挑战 “5 分钟实现现下最火的视频 APP 抖音”,也就是下面的效果。

    首先我们来分析一下这个界面,这是个竖向滑动的 scrollView,我们可以在 scrollView 上添加 3 个 view,然后将 scrollView 滚到中间红色 view 的位置,以后每次用户滑动完成以后,都将 scrollView 重置到这个状态,这样就能实现抖音那种无限滑动的效果。

    然后,每次用户滑动完就开始播放视频,这样我们就能实现抖音这个效果了。有了思路,接下来开始写代码。

    - (void)viewDidAppear:(BOOL)animated {
        [super viewDidAppear:animated];
        self.scrollViewOffsetYOnStartDrag = -100;
        [self scrollViewDidEndScrolling];
    }
    
    - (void)viewDidDisappear:(BOOL)animated {
        [super viewDidDisappear:animated];
        [self.secondImageView jp_stopPlay];
    }
    
    #pragma mark - UIScrollViewDelegate
    
    - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView
                      willDecelerate:(BOOL)decelerate {
        if (decelerate == NO) {
            [self scrollViewDidEndScrolling];
        }
    }
    
    - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
        [self scrollViewDidEndScrolling];
    }
    
    - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
        self.scrollViewOffsetYOnStartDrag = scrollView.contentOffset.y;
    }
    
    #pragma mark - JPVideoPlayerDelegate
    
    - (BOOL)shouldShowBlackBackgroundBeforePlaybackStart {
        return YES;
    }
    
    #pragma mark - Private
    
    - (void)scrollViewDidEndScrolling {
        if(self.scrollViewOffsetYOnStartDrag == self.scrollView.contentOffset.y){
            return;
        }
    
        CGSize referenceSize = UIScreen.mainScreen.bounds.size;
        [self.scrollView setContentOffset:CGPointMake(0, referenceSize.height) animated:NO];
    }
    
    - (NSURL *)fetchDouyinURL {
        if(self.currentVideoIndex == (self.douyinVideoStrings.count - 1)){
            self.currentVideoIndex = 0;
        }
        NSURL *url = [NSURL URLWithString:self.douyinVideoStrings[self.currentVideoIndex]];
        self.currentVideoIndex++;
        return url;
    }
    

    代码写到这里就能实现无限滑动的效果了,这很简单,对吧?

    那如何播放视频呢?我们应该引入 AVFoundation,然后实例化 AVPlayer,然后创建视频图层,然后监听视频播放状态,再开始播放视频。这只是一部分,接下来开始监听播放器的视频进度变化,开始定制播放进度指示器。然后还要处理音频的输出问题,还要处理前后台事件……

    像抖音这样好的用户体验,视频数据都是边下边播缓存在本地的,那如何实现基于 AVPlayer 的边下边播技术呢?

    问题似乎没有那么简单,这样算下来,5 分钟绝对写不完。

    这时就轮到视频利器 JPVideoPlayer 上场了。只要下面一行代码,上面所有的事情全部帮你搞定,信不信?不信就试试看,demo 地址在这里 JPVideoPlayer

        [self.secondImageView jp_playVideoMuteWithURL:[self fetchDouyinURL]
                                   bufferingIndicator:nil
                                         progressView:[JPDouyinProgressView new]
                              configurationCompletion:^(UIView *view, JPVideoPlayerModel *playerModel) {
                                  view.jp_muted = NO;
                              }];
    
    

    感兴趣的同学可以阅读下面这篇关于 JPVideoPlayer 的使用说明。

    [iOS]JPVideoPlayer 3.0 使用介绍

    我的文章集合

    下面这个链接是我所有文章的一个集合目录。这些文章凡是涉及实现的,每篇文章中都有 Github 地址,Github 上都有源码。

    我的文章集合索引

    你还可以关注我自己维护的简书专题 iOS开发心得。这个专题的文章都是实打实的干货。如果你有问题,除了在文章最后留言,还可以在微博 @盼盼_HKbuy上给我留言,以及访问我的 Github

    相关文章

      网友评论

      • fedfcb0e1e61:界面不是重点,而是视频流的处理
      • Obsession丶执:盼神您好,急需请教一下我将您的播放器集成到RN的项目里,界面已经出来了,就是视频播放不了,求帮忙!在线等
      • jshto:小伙子 ,uc需要你啊
      • 乔兰伊雪:抖音那个无限循环是可以了,要怎么上拉加载更多呢?上拉加载拉不到scrollview底部,没办法分页获取更多数据,即便是滑动过程中自动加载更多,那如果网不好,在拿到数据之前用户已经滑倒最后一个cell就会有空档期了。其实抖音不是无限循环,下滑到第一个继续下拉是会刷新整个列表的,不知道大神是否能试试上拉加载呢
      • 努力的小小四:谢谢楼主,我用tableview加上你的播放器完美解决了无限上滑播放~
      • d313fb3df056:为什么不用collectionview
        d313fb3df056:@刘太哥 :blush:
        刘太哥:思路不一样而已,不必较真。
      • 七秒记忆的鱼儿:三个的话,快速滑动会卡
        e2f2d779c022:这里有一个手速比 CPU 还快的,大家快来看。
        刘太哥:@Lovelin_89ab 说的没毛病
        989f3cd027ff:那就慢点滑动啊。
      • 程序员不务正业:collectionview效果不是这个吗?
      • PGOne爱吃饺子:大神,你给的那个数字100是什么意思
        e2f2d779c022:@PGOne爱吃饺子 是处理 [self sendMircosoftDurationRequestWithStoryModel:self.currentStoryModel]; 这行代码的。
        PGOne爱吃饺子:我说的是这一个值 self.scrollViewOffsetYOnStartDrag = -100;,这个值是你应该来判断滚动的时候播放的逻辑吧
        e2f2d779c022:@PGOne爱吃饺子 硬编码的一个初始值。

      本文标题:[iOS]5 分钟实现抖音 APP

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