程式者的胡言亂語
在Android上撥放SHOUTCAST MP3 stream
Android (我使用的是1.5)透過一個叫做android.media.MediaPlayer的類別來提供撥放串流影音或本地端影音檔的功能。不過,眾所皆知的,它支援的串流協定以及codec,相當的有限。我想,這一點在現在及未來,肯定會受到相當多開發者的注目以及戮力加強。
本文提到的是解決一個特定問題的方式,想解決的是在Android上撥放SHOUTCAST MP3 stream。許多網路音樂串流都是採用SHOUTCAST MP3 stream的方式,但即使Android支援了HTTP以及MP3,而且SHOUTCAST MP3 stream的內容幾乎就是MP3 stream,但透過內建的MediaPlayer,你仍然無法撥放。這原因當然是因為MediaPlayer沒有處理SHOUTCAST,即使SHOUTCAST的協定和HTTP是那麼的相像。
由於我才接觸Android數日,可以說是對Android還相當的陌生,不知道除了走原生程式碼這條路外,還有沒有別的方法(之前有想過,直接處理SHOUTCAST協定再自行decode MP3,但似乎沒有內建的MP3 decode介面,或許有Android高手可以指點一下),所以設計了一個機制,在不寫任何原生程式碼的情況下,讓MediaPlayer能處理SHOUTCAST MP3 stream。
這個機制的核心想法是這樣樣子的 - 放置一個HTTP proxy介於MediaPlayer與SHOUTCAST server之間(當然HTTP proxy也跑在你的Android應用程式之中),這個HTTP proxy一手接收MediaPlayer的單純HTTP請求,另一邊則扮演一個SHOUTCAST client,接收SHOUTCAST server回傳的內容,並且依據SHOUTCAST協定,將回傳內容中的MP3 stream剖析出來,回傳給另一邊的MediaPlayer。
今天實驗了一下,這個機制的確能夠讓MediaPlayer撥放SHOUTCAST的網路音訊串流。大抵的精神如上所描述,不過細節處還不少。最重要的大概就是怎麼處理MediaPlayer的HTTP請求。MediaPlayer基本上是兩個請求就搞定,一個是HEAD一個是GET。透過HEAD它可以判斷究竟是否支援,再透過接下來的GET取得真正的內容。當然,針對這兩個請求,Content-Type都會是audio/mpeg,而且千萬不要忘了(或故意不)提供Content-Length(因為是串流,所以,請給個超大的值吧),否則MediaPlayer在prepare的時候就會失敗了。
Posted at 10:44下午 七月 06, 2009 by Chien-Hsing Wang in General | 迴響[2]
星期一 七月 06, 2009

try the chunked transfer encoding
由...發表 Lu, Jye on 七月 07, 2009 at 11:44 上午 CST #
Hi, i'm a newbie on Android, and trying to develop a shoutcast streaming. But now i uutterly have no clue about this. i've try to ues mediaplayer to set the data source(url). But it turns out PVFailed, or something like that(error(-1,-1)). Could you geive me some sample code or geive me some guide(what do you mean by "via Http proxy /Head /GET"). PLZ..... my email: phoenixAnsel@gmail.com ...any response will be grateful....
由...發表 Ansel on 一月 13, 2010 at 05:18 下午 CST #