2017-01-23 10 views
0

私はExoPlayerインスタンスとシークバーを持っています。ユーザーが探しているときに、ExoPlayer.seekTo()を使ってビデオの位置を更新したいと思います。Exoplayer - バッファリング中にseekTo()を呼び出せますか?

あなたはExoPlayer.seekTo()を好きなだけ頻繁に呼び出すことができますか?完了していない場合、以前のseekTo()リクエストのキャンセルを処理する必要がありますか?または、私たちは自分自身を呼び出すovelappingを防ぐ必要がありますか?seekTo()

おかげ

答えて

0

あなたに頻繁にあなたが望むようExoPlayer.seekTo()を呼び出すことができ、それが(以前seekToをキャンセル処理する必要があります)、彼らが終了していない場合に要求?あるいは、私たちはseekTo()が自分自身を呼び出すのを防ぐ必要がありますか?

私はできると思います。

NOT前回の検索要求をキャンセルします。 実際、少なくとも3つのスレッドがシークプロセスに関与しています。 enter image description here

  1. アプリケーションスレッド:それはあなたがExoPlayer.seekToを呼び出したスレッドです()。
  2. 内部再生スレッド:目標位置を設定するスレッドです&内部設定をEXOplayerに内部的に行います。クラスExoPlayerImplInternalのseekToInternal()、seekToPeriodPosition()およびseekToPeriodPosition()など。
  3. ロードスレッド:load.javaで見つけることができます。ステップ2で内部再生スレッドが設定を完了したら、continueLoading()を呼び出してロード先のスレッドにシーク対象の周辺のターゲットデータをダウンロードさせます。

内部再生スレッドはシーク動作の処理を行った後、それはレンダリング(またはスキップ)するデコードされたフレームがあるかどうかを確認しようとの作用doSomeWorkを配置してもよいです。 最後に、シークターゲットがレンダリングされると、ディスプレイに表示されるシークターゲットの瞬間を見ることができます。

要するに、以前のシークアクション(ExoPlayer.seekTo()など)が対応するメッセージをinternalPlaybackThreadのメッセージキューに送信したときに、次のシークを再度押す(配信する)ことができます。シーク動作はであり、がシリアル化され、内部再生スレッドによって順番に処理されます。

内部再生スレッドがシークメッセージを取得すると、&がそれを処理しました。読み込みスレッドが読み込みを開始します。あなたがダウンロードした場合、demux &は十分速くデコードされ、次のシークの前にdoSomeWorkがあります。シークの結果を見ることができます。 それ以外の場合、次のシークは読み込みを停止します&再度シークします(この場合は、前のシークががキャンセルされたように見えます)です。

結果として、シーク動作と実行シーケンスを内部的にどのくらい速く配信するかによって異なります。

関連する問題