web-dev-qa-db-ja.com

Android MediaPlayerは準備とバッファリングに長い時間がかかります

アプリケーションでオーディオストリームの準備とバッファリングに時間がかかります。私はこの質問を読みました AndroidのMediaPlayerが再生用のライブストリームを準備するのになぜこんなに時間がかかるのですか? しかし、それは人々がこの問題を経験したと言っているだけで、問題を改善する方法は述べられていません。

Androidのすべてのバージョンでこの問題が発生しており、2.2から4.1.2でテストされています。

ストリームは、モバイルおよび3G接続に適したビットレートです。同じストリームは、同等のiOSアプリでバッファリングを開始するのに1秒もかかりません。

バッファリングする時間を指定する方法はありますか? Tune Inラジオアプリケーションがこの機能を提供していることを知っています( https://play.google.com/store/apps/details?id=tunein.player )。

ありがとう。

編集:私は再度テストしましたが、Gingerbread以降(> = 2.3)を実行しているデバイスでのみ発生することがわかりました。 Androidは、基になるフレームワークをOpenCoreからStageFrightに変更しました。どのようにメディアフレームワークを最適化できますか?古いHTC Wildfireが文字通り10倍速く準備、ストリーミング、再生できるのは間違っているようです新しいHTC One XとNexus 7よりも。

25
SteveEdson

私はこの質問に何ヶ月も苦労してきました。最後に私は解決策を見つけました。

実際の問題は、MediaPlayerクラスの実装にあります。特にMediaPlayerがデータをバッファリングする方法。これが、独自のバッファリングを作成し、それを一時ファイルに保存し、それをMediaPlayerにフィードするソリューションである理由です。

このチュートリアルとソースコードは、その方法を正確に説明しています。 http://androidstreamingtut.blogspot.nl/2012/08/custom-progressive-audio-streaming-with.html

このコードを適応させることで、はるかに優れたストリーミングプレーヤーを簡単に作成できます。

Google Developersは本当にここで失敗しました。

編集:この答えはかなり古いです。今日では、MediaPlayerを使用せずに、代わりにExoPlayerを使用することをお勧めします。拡張可能で安定しており、さまざまなタイプのメディアを再生できます。あなたはここでそれを見つけることができます: https://github.com/google/ExoPlayer/

Android MediaPlayerクラスは、バッファーサイズなどの低レベルの設定へのアクセスを提供しないため、実際にできることは多くありません。唯一の代替策は、AudioTrackを使用して独自のプレーヤーを作成することです。デコードを行うFFmpegのようなライブラリ。

9
William Seemann

私がお勧めするのは、エンコーディングをいじることです。たとえば、MP4の場合、MOOV Atomがファイルの先頭にあることを確認します(ffmpegなどでこれを行う方法に関してS/Oで十分な質問があります)。MP3を使用する場合たとえば、さまざまなコーデックやビットレートを確認できます。

たとえば、オンラインで見つけた多数のオーディオファイルを試すことができます。バッファリングに時間がかからないものを見つけた場合は、同じ方法でファイルをエンコードしてみてください。

0
ajacian81