2012-07-29 87 views
13

我使用Android上的MediaPlayer流式傳輸音頻。Android MediaPlayer流式傳輸停止網絡變化

當設備從Wi-Fi移動到單元網絡或反之時,MediaPlayer停止播放。

通常在緩衝區中有幾秒鐘的音頻,所以播放不會立即停止。

理想情況下,我想拿起不間斷播放的流,但我看不出如何去做。

我正在使用託管在服務器上的mp3文件和實況廣播流。

+0

任何代碼與我們分享? – Erol 2012-07-30 00:25:51

+0

有很多的例子,如果你需要幫助的MediaPlayer的側邊欄,但它真的很簡單: 'MediaPlayer的mMediaPlayer = MediaPlayer.create(背景下,Uri.parse(URL));' 'mMediaPlayer.prepare(); ' 'mMediaPlayer.start();' 會讓你開始。 如果您連接到Wi-Fi並擁有3G覆蓋範圍,請關閉Wi-Fi,同時停止播放和播放。 – lightversusdark 2012-07-30 03:35:57

+2

是的,我知道如何使用媒體播放器。我只是問你是否以這種方式嘗試過任何事情,並想分享你的進展,以便我們改進。 – Erol 2012-07-30 04:04:43

回答

0

我不知道爲什麼你的媒體播放器正在停止,但也許你可以添加一個onReceive方法,並在該方法中放置「mp.start()」以使其重新開始播放。
Android, How to handle change in network (from GPRS to Wi-fi and vice-versa) while polling for data

您可能需要做一個單獨的類,但應該說明如何創建一個當您切換網絡,被調用的方法,在這一點你可以稱之爲「mp.start()」來恢復播放(假設mp是你的MediaPlayer)。
這當然假設您的MediaPlayer只在暫停切換網絡,而不是停止。

14

從服務器的角度來看,將網絡模式從WiFi更改爲3G(反之亦然),將看起來像是來自單獨IP(客戶端)的全新連接。

如果您下載的服務器不支持跟蹤流(例如秒數,序列,字節數)(與媒體服務器不同),它將不得不從0字節開始再次提供您的mp3。

如果您的URL指向位於標準HTTP服務器上的MP3文件,那麼您的狀況就是期望的。您應該考慮使用媒體流媒體服務器,以便您可以根據需要繼續下載/流媒體。當您收到連接丟失/恢復的意圖時,您可以將您的mediaplayer指向帶有URL中文件位置的新URL(例如seconds = 19,bytes = 57365)。

不知道這是否對你有幫助,但它解釋了「幕後」發生了什麼。

1

嘗試設置您的setOnCompletionListenersetOnErrorListener。在完成直播後,您可以再次致電prepareAsync(),這將再次啓動流。除非您編寫自己的媒體框架,否則沒有一種優雅的方式可以做到這一點。

你也可以聽你onError()MEDIA_ERROR_SERVER_DIED然後你可以再次發射prepareAsync()

您會發現MediaPlayer將會出錯或完成。如果你處理這兩個回調,至少你可以做的就是重新啓動網絡變化的流,就像流暢的回放..這將需要自定義的媒體框架,因爲Android的是非常低劣的。

0

正如Vidar所說,重新建立連接將被服務器視爲一個新的連接。

看起來我必須雙重緩衝音頻播放,這意味着構建一個自定義媒體播放器。這可以提供連續的音頻,但在收聽直播時仍會跳過。

因爲我可以知道播放位置,所以MP3文件更容易一些。直播不是這樣。

正如gmaster所說,當網絡發生變化時,我需要一個廣播接收器來建立一個新的連接。 來自以前網絡連接的音頻緩衝區應該繼續播放,同時通過新連接填充新的音頻緩衝區。

當新的緩衝區足夠開始播放時,我可以切換播放。 如果我正在流媒體文件,支持服務器和一點點工作,我可以確保當前的播放位置數據在兩個緩衝區中並無縫切換。

由於實時流緩衝區不能同步,切換時不可避免地會出現小故障。

如果連接需要一段時間才能建立,較大的緩衝區將避免音頻丟失,但會延遲首次播放的開始。 MP3文件可以被下載並且比實時更快地填充緩衝區,但實時流將實時緩衝。

Chris.Jenkins提到了一些MediaPlayer方法,可以幫助但指出這確實需要一個定製框架。它需要處理他所提及的條件和其他條件。

如果我可以讓它看起來很漂亮,我會在這裏發佈。我要保持這個問題的開放性。