私はandroid service
、オーディオ ストリームをファイルにダウンロードして、そのファイルを同時に再生できる を実装しようとしています。
このようにして、バッファリングも実装できます。
複数のスレッドを使用しています。ExecutorService
ということで、初めて手をつけてみました。
コードはgithubにあり、説明のためのコメントがたくさんあります。
ストリームをダウンロードしてしばらくの間完全に再生しますが、しばらくすると(たとえば、1分または2分後)、例外をスローせずに停止し、ログにも何も出力しません。
コードの説明:
フォーカスするメイン クラスは、Android サービスである ServiceExecutor です。
- 最初に AsyncTask を開始して、プロセス全体を開始します。その中で:
- ファイルがダウンロードされる一時ファイルをセットアップします。
- バックグラウンドでストリームの継続時間をフェッチするスレッドを開始します。この期間は、バッファリング中に役立ちます。このスレッドはストリームを再生しないことに注意してください。
- ストリームを一時ファイルにダウンロードする 2 番目のスレッドを開始します。
- 3 番目のスレッドを開始して、ファイルからストリームを再生します。
- この 3 番目のスレッドは、その MediaPlayer の onPrepared() 関数で内部的に、ストリームのバッファリングを処理するために 4 番目のスレッドも開始します。
バッファリングとは、ストリームを継続的に再生するのに十分なデータがファイルにあるかどうかを再帰的にチェックすることです。すべての呼び出しで、一時ファイルの残りのストリームが 2 秒未満で、ファイルがまだダウンロード中であるかどうかを確認し、メディア プレーヤーを 5 秒間一時停止します。ストリームが一時停止された場所を記録する変数「pausedAtMilliSec」を維持し、プレーヤーも突然停止した場合、そこから再開できるようにします。
ご覧のとおり、私はスレッド化があまり得意ではありません。私には、問題は複数のスレッドの処理にあるようです(そうですが、よくわかりません)。
ですから、コメントやアドバイスがあれば遠慮なく投稿してください。悪い気はしません、むしろ幸せです。
一度コードを確認してください。
PocketJourney のコードは知っています。しかし、私のものも試してみたいです。
ありがとうございました