我正在編寫一個小型應用程序,它將流式傳輸mp3文件。我正在使用NPR代碼,但mediaPlayer.prepareAsync()有一個奇怪的問題。從服務調用prepareAsync()後MediaPlayer回調不會觸發
我正在從NPR應用程序使用PlaybackService的修剪版本,該版本正確啓動。我正在獲取對Activity中的OnClick處理程序內的服務的引用,並使用URL的MP3流調用listen()。以下(簡化)代碼來自我的PlaybackService:
public void listen(String url) throws IllegalArgumentException, IllegalStateException, IOException {
if (mediaPlayer == null) {
mediaPlayer = new MediaPlayer();
}
mediaPlayer.setOnBufferingUpdateListener(this);
mediaPlayer.setOnCompletionListener(this);
mediaPlayer.setOnErrorListener(this);
mediaPlayer.setOnInfoListener(this);
mediaPlayer.setOnPreparedListener(this);
synchronized (this) {
mediaPlayer.setDataSource(url);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.prepareAsync();
}
}
// ... lots of other code
@Override
public void onPrepared(MediaPlayer mp) {
Log.d(LOG_TAG, "Prepared");
play();
}
我還定義了其他回調函數。我可以從logcat中看到,MediaPlayer正在加載流和緩衝,因爲我看到以下消息:
AwesomePlayer I calling prefetcher->prepare()
AwesomePlayer I prefetcher is done preparing
但我onPrepared方法不會被調用。如果我在看到上述日誌消息之後添加計時器並嘗試在MediaPlayer上調用play(),媒體播放器將播放,因此它確實進入了準備狀態。
如果我將prepareAsync()調用替換爲prepare(),則該播放器正常工作。這是全部在2.2,我一直在閱讀似乎有一些問題,但我遇到的問題似乎並不相關,因爲使用prepare()時流正常工作。
我確實注意到流上的Content-Length很大(450MB),但由於我可以在Media Player上調用播放而沒有發生異常,因此它似乎在處理這個OK。
唯一的另一個變化是,在NPR應用程序中,服務被綁定到視圖對象內部並開始回放(而在我的應用程序中,這發生在Activity內部)。
有關我可能做錯什麼的想法?
幾乎每次我看到這些錯誤,它似乎都是MediaPlayer無法解釋的低級行爲。 – 2011-02-01 03:51:39