2010-03-24 116 views
22

我想寫一個輕量級HTTP服務器在我的應用程序到feed動態生成MP3數據到內置AndroidMediaPlayer。我不允許將我的內容存儲在SD card上。流媒體到Android MediaPlayer

我的輸入數據本質上是無限長的。我告訴MediaPlayer其數據源基本上應該是"http://localhost/myfile.mp3"。我有一個簡單的服務器設置,等待MediaPlayer發出這個請求。但MediaPlayer不太合作。起初,它製作了一個HTTP GET並試圖抓取整個文件。如果我們試着簡單地將數據轉儲到socket,那麼它會超時,所以我們嘗試使用HTTP Range標頭以塊的形式寫入數據。 MediaPlayer不喜歡這個,並且不會繼續請求後續的塊。

有沒有人有任何成功的流數據直接輸入MediaPlayer?我是否需要實施RTSPShoutcast服務器?我是否僅僅缺少重要的HTTP header?我應該在這裏使用什麼策略?

+0

您是否也使用這種方法來播放視頻文件?它是否與音頻文件一樣? – 2011-10-11 13:47:44

+0

嗨,羅布你有問題的解決方法?你能分享示例代碼嗎? – 2013-04-04 14:33:49

+0

我知道晚了。但是這對於那些未來最終在這裏結束的人來說。這[**鏈接**](http://stackoverflow.com/questions/5343730/mediaplayer-stutters-at-start-of-mp3-playback/5432091#5432091)有代碼開始。 – Samuel 2011-04-21 06:57:31

回答

3

HTTP服務器確實託管在手機本身。它非常簡單:只需一個thread在插座上監聽HTTP GET 請求。當它得到HTTP請求時,將會有一個new socket, 回寫一些HTTP標題,並開始將MP3音頻數據 轉儲回socket。這HTTP服務器沒有做任何事情。

Android Media Player正在播放音樂,因爲我正在流到 它。如果播放buffer 在播放音頻時清空,Media Player表現非常差。這對於我 確保我的HTTP服務器不斷將數據寫入socket非常重要。以小塊(10 kB)將字節移入套接字。我 HTTP響應報頭結束了看起來像這樣:只要

// Build response headers 
StringBuilder sb = new StringBuilder(); 
sb.append("HTTP/1.1 200 OK\r\n"); 
sb.append("Content-Type: audio/mpeg\r\n"); 
sb.append("Connection: close\r\n"); 
sb.append("Accept-Ranges: bytes\r\n"); 
sb.append("Content-Length: " + totalFileSize + "\r\n"); 
sb.append("Content-Disposition: inline; filename=xxxxx.mp3\r\n\r\n"); 

因爲我不停的管火上澆油,該Android Media Player保持 消費它毫無怨言。播放音頻只需要一個 請求和響應。它結束了很好的工作。

+1

任何機會的完整代碼託管在任何地方?我試圖對來自MediaRecorder + Camera的實時視頻進行同樣的處理,並且用盡了不同的嘗試和庫。如果沒有,在這裏添加更多細節需要多大的賞金? – ChiefTwoPencils 2014-08-27 23:51:08