DanmakuFlameMaster无缝续播弹幕的实现

来源:互联网 发布:marjakurki知乎 编辑:程序博客网 时间:2024/04/27 05:05

问题描述:

我现在的弹幕文件每五分钟一个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 0