DanmakuFlameMaster无缝续播弹幕的实现

问题描述:

我现在的弹幕文件每五分钟一个xml文件,当播放完当前的弹幕时,播放下一个需要重新加载数据并且解析,然后呈现。这个过程大概需要5-7秒,这样给用户的感觉是弹幕断了。
现在的需求是弹幕切换的时候,无缝续播,让用户感觉不到我再切换弹幕文件,这样该如何做呢,目前毫无头绪。


解决方法:

首先,mDanmakuView是个单例的模式,如果弹幕正在播放的时候,我调用prepare()去加载新的弹幕内容时,会造成当前播放弹幕的暂停和卡顿,这个和需求是不一致的。

所以需要再工作线程开启数据的解析和配置,具体代码如下:

 mDanmakuView.setCallback(new DrawHandler.Callback() {
                @Override
                public void updateTimer(DanmakuTimer timer) {
                   //在mDanmakuView的回调方法处,调用异步任务的解析任务,这样不会阻塞主线程。
                    if (timer.currMillisecond >= 290000 && timer.currMillisecond <= 291000 && flag == 0) {
                        createParser();
                        flag = 1;
                        thread.start();
                    }
                }

                @Override
                public void drawingFinished() {
                    Log.e("DFM", "drawingFinished 第一个CallBack");
                }

                @Override
                public void danmakuShown(BaseDanmaku danmaku) {

                }

                @Override
                public void prepared() {
                    Toast.makeText(MainActivity.this, "弹幕准备完成", Toast.LENGTH_SHORT).show();
//                    mDanmakuView.start();
                }
            });
 
//这个是为了将parser的数据指定为新的弹幕数据源。
public void createParser() {
    parserParam = createParser(this.getResources().openRawResource(R.raw.danmu5_10));
}
//这个是为了在工作线程中配置弹幕数据,首先构建一个加载了新的弹幕内容的Danmakus实例,然后遍历该实体并且
依次取出其中的弹幕数据,通过addDanmaku()方法依次添加弹幕到mDanmakuView里面,注意,这里会在某个瞬间执行遍历
方法,所以放到工作线程比较合适,不然会阻塞主线程。
Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        Danmakus danmakus = (Danmakus) parserParam.
                setConfig(mContext).
                setDisplayer(((DrawTask) ((DanmakuSurfaceView) mDanmakuView).getHandler().getDrawTask()).getmDisp()).
                setTimer(((DrawTask) ((DanmakuSurfaceView) mDanmakuView).getHandler().getDrawTask()).getmTimer()).getDanmakus();
        if (danmakus != null && danmakus.items != null) {
            Iterator<BaseDanmaku> iterator = danmakus.items.iterator();
            while (iterator.hasNext()) {
                mDanmakuView.addDanmaku(iterator.next());
            }
        }
    }
});

这样就可以实现弹幕的无缝续播。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值