美文网首页iOSiOS CoreAnimation各种库
iOS弹幕基本实现及原理介绍

iOS弹幕基本实现及原理介绍

作者: 萌小菜 | 来源:发表于2015-09-24 11:01 被阅读9068次

    最近做项目的时候需要实现弹幕这个功能, 虽然感觉实现起来也不是很复杂, 但是自己还是不想写, 因为毕竟现在视频app挺火的, 而且基本都有弹幕这个功能. 但在网上找时却发现没有太多可以选择的第三方, 所以最近写了个demo, 并且放在了github上了点击查看

    其中实现我原理我是参考这篇博客点击查看

    实现出来的效果:

    demodemo

    弹幕类型:###

    支持从右往左滚动, 支持中间 顶部和底部 弹幕.

    弹幕内容:###

    支持表情, 自定义内容文字大小及颜色

    使用方法:

    1 . 创建CFDanmakuView对象, 进行配置, 并添加到View上

    _danmakuView = [[CFDanmakuView alloc]initWithFrame:rect];
    _danmakuView.duration = 6.5;
    _danmakuView.centerDuration = 2.5;
    _danmakuView.lineHeight = 25;
    _danmakuView.maxShowLineCount = 15;
    _danmakuView.maxCenterLineCount = 5;
    _danmakuView.delegate = self;
    [self.view addSubview:_danmakuView];
    

    2 . 配置弹幕的数据

    CFDanmaku* danmaku = [[CFDanmaku alloc] init];
    [danmakus addObject:danmaku];
    [_danmakuView prepareDanmakus:danmakus];
    // 对应视频的时间戳
    @property(nonatomic, assign) NSTimeInterval timePoint;
    // 弹幕内容
    @property(nonatomic, copy) NSAttributedString* contentStr;
    // 弹幕类型(如果不设置 默认情况下只是从右到左滚动)
    @property(nonatomic, assign) CFDanmakuPosition position;
    

    3 .遵守协议, 并实现代理方法

     // 获取视频播放时间 
    -(NSTimeInterval)danmakuViewGetPlayTime:(CFDanmakuView *)danmakuView
    {
      if(_slider.value == 1.0) [_danmakuView stop]
        ;
      return _slider.value*120.0;
    }
    // 是否正在加载视频中
    -(BOOL)danmakuViewIsBuffering:(CFDanmakuView *)danmakuView
    {
      return NO;
    }
    

    具体用法, 请参考Demo点击查看

    如果发现什么bug 或者有什么问题欢迎留言 !

    相关文章

      网友评论

      • 一座城漫天飞着蒲公英:你这个弹幕特别消耗性能。但是原理确实挺不错的。消耗性能的原因主要这坨代码在搞鬼
        - (void)drawDanmakus:(NSArray *)danmakus time:(DanmakuTime *)time isBuffering:(BOOL)isBuffering
        {
        int LRShowCount = 0;
        for (NSInteger index=0; index<_drawArray.count;) {


        DanmakuBaseModel *danmaku = _drawArray[index];
        danmaku.remainTime -= time.interval;


        if (danmaku.remainTime<0) {
        [self removeDanmaku:danmaku];
        [_drawArray removeObjectAtIndex:index];
        continue;
        }
        if (danmaku.danmakuType==DanmakuTypeLR) {
        LRShowCount++;
        }


        [self rendererDanmaku:danmaku];
        index++;


        }
        特别消耗性能,每个定时器回调的时候,你第一次拿到了哪些弹幕可以做动画,但是第二次回调的时候你有拿之前已经在哪些做动画的弹幕继续做动画,虽然看起来很连贯,但是从性能消耗可大,因为之前在做动画的弹幕你没必要,在继续做动画。最难还是轨道检测。
        萌小菜:@一座城漫天飞着蒲公英 感谢指正!因为之前我们做的只是小项目没有考虑到性能方面,一大疏忽,有时间我改一下。
      • TigerNong:你框架中隐藏弹幕的方法就是stop吧!我调用stop后,弹幕没有马上消失。再调用start时,没有弹出弹幕?这个是怎么回事?
        萌小菜:@TigerNong pause 和 resume
      • 1ca631060677:楼主,我集成了你的DEMO 但是遇见个问题,就是一条弹幕同一时间飘过两次。。。这个是怎么回事啊
        1ca631060677:@萌小菜 定时器时间的问题,设置1秒执行就好了
        萌小菜:@iOS码农 你看看是不是代理方法有问题呀,或者是你的弹幕模型时间戳有问题
      • 1ca631060677:效果很不错,不过这个弹幕只适用视频,不适用直播啊!楼主能不能完善下直播的情况
        16a355a993b2:有直播弹幕的demo嚒,卡在这里了
      • 小小夕舞:最近也在做弹幕 可是弹幕加不了点击事件
        萌小菜:@袁小虫lucky 我没实现过 :confounded:
        小小夕舞:怪不得 怎么添加都没用 你是怎么实现的
        萌小菜:@袁小虫lucky 在动画中的控件不能接收点击事件
      • smile冰落:你好 请问一下协议方法不实现是为什么啊
        萌小菜:@smile冰落 你是不是没有设置代理 呀
      • 6712ed0d908a:你好,有个问题想请教一下:如果我想做弹幕的缓存该怎么做的?比如说我现在有100条弹幕存到数组arr中,但是我每个屏幕只想显示10条弹幕,显示完之后从依次arr中移除,而且还会不断有弹幕加入到arr中,像这种情况应该怎么处理呢?
        6712ed0d908a:不是,是将10条弹幕随机发出来,等到有位置空出来之后在继续发,我现在做的是用定时器来控制弹幕的发送,基本实现了效果,但是出现了一些弹幕重叠和个别弹幕移动速度过快的问题,能不能帮我看看原因,地址https://github.com/loginSin/DanmakuDemo.git
        萌小菜:@登录无奈 “每个屏幕只想显示10条弹幕”是什么意思?? 10条弹幕一起发吗??
      • d99addc5ea52:楼主你好,服务端传给我们的是一个数组,里面只有文字,没有时间,需要我们自己来实现。能不能提供思路
        d99addc5ea52:@萌小菜 没传时间,只传了一个都是文字的数组,能不能qq上聊
        萌小菜:@d99addc5ea52 那你们按什么顺序及时间显示呢?
        d99addc5ea52:@d99addc5ea52 纯文本评论弹幕,没有视频。
      • d99addc5ea52:danmakuViewGetPlayTime 你好,我想请问这个方法什么时候就会调用????
      • csqingyang:建议按照这篇文章的思路优化你的库的结构。这是链接:http://www.cocoachina.com/ios/20150122/10996.html
        庞海礁分享的代码 结构和这个类似,但还是有缺陷。
        最后再赞一下楼主。持续关注。
        翀鹰精灵:这个貌似和楼主这个没有关系吧😝
        萌小菜:@csqingyang 感谢提示,有时间一定看看
      • e4565acf6dbe:今生今世的话
        萌小菜:@Apple男孩儿 : :flushed:
      • 07060e4f06c3:在多次实时发送弹幕的时候,例如连续发送10次,但是弹幕出来的只有九条,出现弹幕不显示的问题。我是集成到视频播放上出现这个问题的。
        07060e4f06c3:@ChuanFengCoder 弹幕行数我设置的比较大,然后弹幕的时间应该也是没问题的。就是在调用了[_danmakuView sendDanmakuSource:danmakuSource];这个方法后,弹幕不显示,这个问题困扰我很久了,求作者帮助。
        萌小菜:@cjc_ios 弹幕的发出是根据时间点来的,如果同一时间节点弹幕数量过多导致显示不过来的时候会抛掉一部分数据。你可以通过设置弹幕显示时间或者弹幕显示的行数来调整
      • 3c2748f42783:赞 比较好理解 ~~
        萌小菜:@3c2748f42783 :smile: 感谢
      • 花轮丨:支持
        萌小菜:@花轮丨 谢谢 :smile:
      • 萌小菜:谢谢你的支持, 我之前写的时候网上的资料还挺少的,所以就自己写了个分享出来。。。
      • 花前月下:Mark 现在关于弹幕的原理以及使用和创建,已经好多资料了。 不错。支持!

      本文标题:iOS弹幕基本实现及原理介绍

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