原因
issueにも書かれていた。
HLSのプレイリスト(m3u8)およびチャンク(tsとか)は定期的にサーバー側で更新されており、ライブストリームの場合は古くなったチャンクはアクセスできなくなることがある(サーバー側の実装によるけど)。
クライアント~サーバー間に十分な帯域があれば問題ないが、帯域が不足していてクライアント側でバッファリングの時間が発生するとクライアント~サーバー間の時差が大きくなり、それが一定量を超えるとクライアントが再生しようとするチャンクがサーバーからなくなってしまう。するとBehindLiveWindowExceptionが発生する。
対応方法
ExoPlayer.addListener()
でExoPlayerの状態を監視し、BehindLiveWindowExceptionが発生したら再度ExoPlayer.prepare()
を実行して再生を継続する。
もちろん、再生不可能なチャンクがあるので何秒間か再生できない時間ができますが、一応再生を継続することができます。アプリケーションによっては必要に応じてバッファリング状態を示すダイアログを出したりすると良いと思います。