0

私はandroid service、オーディオ ストリームをファイルにダウンロードして、そのファイルを同時に再生できる を実装しようとしています。

このようにして、バッファリングも実装できます。

複数のスレッドを使用しています。ExecutorServiceということで、初めて手をつけてみました。

コードはgithubにあり、説明のためのコメントがたくさんあります。

ストリームをダウンロードしてしばらくの間完全に再生しますが、しばらくすると(たとえば、1分または2分後)、例外をスローせずに停止し、ログにも何も出力しません

コードの説明:

フォーカスするメイン クラスは、Android サービスである ServiceExecutor です。

  1. 最初に AsyncTask を開始して、プロセス全体を開始します。その中で:
  2. ファイルがダウンロードされる一時ファイルをセットアップします。
  3. バックグラウンドでストリームの継続時間をフェッチするスレッドを開始します。この期間は、バッファリング中に役立ちます。このスレッドはストリームを再生しないことに注意してください。
  4. ストリームを一時ファイルにダウンロードする 2 番目のスレッドを開始します。
  5. 3 番目のスレッドを開始して、ファイルからストリームを再生します。
  6. この 3 番目のスレッドは、その MediaPlayer の onPrepared() 関数で内部的に、ストリームのバッファリングを処理するために 4 番目のスレッドも開始します。

バッファリングとは、ストリームを継続的に再生するのに十分なデータがファイルにあるかどうかを再帰的にチェックすることです。すべての呼び出しで、一時ファイルの残りのストリームが 2 秒未満で、ファイルがまだダウンロード中であるかどうかを確認し、メディア プレーヤーを 5 秒間一時停止します。ストリームが一時停止された場所を記録する変数「pausedAtMilliSec」を維持し、プレーヤーも突然停止した場合、そこから再開できるようにします。

ご覧のとおり、私はスレッド化があまり得意ではありません。私には、問題は複数のスレッドの処理にあるようです(そうですが、よくわかりません)。

ですから、コメントやアドバイスがあれば遠慮なく投稿してください。悪い気はしません、むしろ幸せです。

一度コードを確認してください。

PocketJourney のコードは知っています。しかし、私のものも試してみたいです。

ありがとうございました

4

0 に答える 0