世上本没有路,走的人多了,也便成了路
——鲁迅

前段时间项目中涉及了视频播放的相关内容,踩了一个BinkMediaPlayer的坑,在此记录一下。

需求

有两段bk2的视频,要求播完第一个视频后衔接播下一个视频,第二个视频播完后做一些其他的逻辑。

方案

解决方案很简单,用一个BinkMediaPlayer,通过切换Url的方式选择需要播放的视频。并通过监听OnReachEnd事件,在视频结束时做一些逻辑。基本逻辑如下图所示:

编译,运行。第一段视频结束可成功切到第二个视频,说明第一次结束事件触发。然而第二段视频结束后后续逻辑未执行,说明第二次结束事件未触发

很奇怪,都是一个事件,也正常进行事件的解绑,第一次就可以触发,第二次就不行,很抽象......

分析

直接看结束事件触发的逻辑,一目了然。

在Tick函数内,检查当前Movie是否reach_end,已结束则广播OnReachEnd事件,同时立即将reach_end变量设为true。

问题就出在reach_end变量上,当第一次结束的时候的Boardcast,会切换第二段视频的Url并播放视频。此时reach_end置为false,然而由于在回调函数内所以reach_end置为true的逻辑还没走到,回调函数结束后会将reach_end设为true,也就是说reach_end又被设置回去了!

问题解决

两个方法,均可解决问题:

  • 将逻辑异步,即直接DelayUntilNextTick,让切换第二段视频的逻辑晚一帧执行,这样reach_end就不会被覆盖
  • 直接用两个MediaPlayer播放